diff --git a/components.d.ts b/components.d.ts
index 18db858..92d712e 100644
--- a/components.d.ts
+++ b/components.d.ts
@@ -13,6 +13,7 @@ declare module 'vue' {
ABadge: typeof import('ant-design-vue/es')['Badge']
AButton: typeof import('ant-design-vue/es')['Button']
ACard: typeof import('ant-design-vue/es')['Card']
+ 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']
AccountSettingHome: typeof import('./src/views/User/AccountSetting/components/AccountSettingHome/AccountSettingHome.vue')['default']
@@ -20,6 +21,7 @@ declare module 'vue' {
AccountSettingSidebar: typeof import('./src/views/User/AccountSetting/components/AccountSettingSidebar/AccountSettingSidebar.vue')['default']
AccountSettingStorage: typeof import('./src/views/User/AccountSetting/components/AccountSettingStorage/AccountSettingStorage.vue')['default']
ACheckbox: typeof import('ant-design-vue/es')['Checkbox']
+ ACol: typeof import('ant-design-vue/es')['Col']
AConfigProvider: typeof import('ant-design-vue/es')['ConfigProvider']
ADivider: typeof import('ant-design-vue/es')['Divider']
ADrawer: typeof import('ant-design-vue/es')['Drawer']
@@ -53,6 +55,7 @@ declare module 'vue' {
ARadio: typeof import('ant-design-vue/es')['Radio']
ARadioGroup: typeof import('ant-design-vue/es')['RadioGroup']
ARangePicker: typeof import('ant-design-vue/es')['RangePicker']
+ ARow: typeof import('ant-design-vue/es')['Row']
ASelect: typeof import('ant-design-vue/es')['Select']
ASelectOption: typeof import('ant-design-vue/es')['SelectOption']
ASkeleton: typeof import('ant-design-vue/es')['Skeleton']
@@ -91,6 +94,7 @@ 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']
+ EllipsisOutlined: typeof import('@ant-design/icons-vue')['EllipsisOutlined']
EyeInvisibleOutlined: typeof import('@ant-design/icons-vue')['EyeInvisibleOutlined']
EyeOutlined: typeof import('@ant-design/icons-vue')['EyeOutlined']
FileImageOutlined: typeof import('@ant-design/icons-vue')['FileImageOutlined']
@@ -98,6 +102,8 @@ declare module 'vue' {
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']
+ Heatmap: typeof import('./src/components/Heatmap/Heatmap.vue')['default']
+ HeatmapPro: typeof import('./src/components/HeatmapPro/HeatmapPro.vue')['default']
ImageShare: typeof import('./src/views/Share/ImageShare/ImageShare.vue')['default']
ImageToolbar: typeof import('./src/components/ImageToolbar/ImageToolbar.vue')['default']
ImageUpload: typeof import('./src/components/ImageUpload/ImageUpload.vue')['default']
@@ -106,6 +112,7 @@ declare module 'vue' {
LeftOutlined: typeof import('@ant-design/icons-vue')['LeftOutlined']
LinkOutlined: typeof import('@ant-design/icons-vue')['LinkOutlined']
LoadingGraphic: typeof import('./src/components/LoadingGraphic/LoadingGraphic.vue')['default']
+ LoadingOutlined: typeof import('@ant-design/icons-vue')['LoadingOutlined']
LocationAlbumDetail: typeof import('./src/views/Album/LocationAlbum/LocationAlbumDetail.vue')['default']
LocationAlbumIndex: typeof import('./src/views/Album/LocationAlbum/LocationAlbumIndex.vue')['default']
LocationAlbumList: typeof import('./src/views/Album/LocationAlbum/LocationAlbumList.vue')['default']
@@ -136,6 +143,7 @@ declare module 'vue' {
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']
+ RedoOutlined: typeof import('@ant-design/icons-vue')['RedoOutlined']
ReplyInput: typeof import('./src/components/CommentReply/src/ReplyInput/ReplyInput.vue')['default']
ReplyList: typeof import('./src/components/CommentReply/src/ReplyList/ReplyList.vue')['default']
ReplyReply: typeof import('./src/components/CommentReply/src/ReplyReplyInput/ReplyReply.vue')['default']
@@ -145,12 +153,14 @@ declare module 'vue' {
SearchOutlined: typeof import('@ant-design/icons-vue')['SearchOutlined']
SearchResult: typeof import('./src/views/Photograph/SearchResult/SearchResult.vue')['default']
SendOutlined: typeof import('@ant-design/icons-vue')['SendOutlined']
+ SettingOutlined: typeof import('@ant-design/icons-vue')['SettingOutlined']
SharePhoneUpload: typeof import('./src/views/Phone/SharePhoneUpload/SharePhoneUpload.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']
+ StorageCard: typeof import('./src/views/User/AccountSetting/components/AccountSettingStorage/StorageCard.vue')['default']
TabletOutlined: typeof import('@ant-design/icons-vue')['TabletOutlined']
ThingAlbumDetail: typeof import('./src/views/Album/ThingAlbum/ThingAlbumDetail.vue')['default']
ThingAlbumIndex: typeof import('./src/views/Album/ThingAlbum/ThingAlbumIndex.vue')['default']
diff --git a/package.json b/package.json
index 800b8bb..712c654 100644
--- a/package.json
+++ b/package.json
@@ -12,6 +12,7 @@
"dependencies": {
"@alova/adapter-axios": "^2.0.13",
"@ant-design/icons-vue": "^7.0.1",
+ "@fcli/vue-calendar-map": "^1.0.2",
"@intlify/eslint-plugin-vue-i18n": "^3.2.0",
"@mediapipe/face_detection": "^0.4.1646425229",
"@mediapipe/face_mesh": "^0.4.1633559619",
@@ -55,6 +56,7 @@
"jszip": "^3.10.1",
"less": "^4.2.2",
"localforage": "^1.10.0",
+ "lodash-es": "^4.17.21",
"moment": "^2.30.1",
"nprogress": "^0.2.0",
"nsfwjs": "^4.2.1",
diff --git a/src/api/phone/index.ts b/src/api/phone/index.ts
index 47b7e49..f8f382b 100644
--- a/src/api/phone/index.ts
+++ b/src/api/phone/index.ts
@@ -1,4 +1,4 @@
-import {service} from "@/utils/alova/service.ts";
+import {service} from "@/utils/alova/service_app.ts";
export const uploadImage = (data: any) => {
return service.Post('/api/auth/phone/upload', {
@@ -26,3 +26,37 @@ export const sharePhoneUploadApi = (data: any) => {
}
});
};
+
+/**
+ * 上传文件
+ * @param formData
+ * @param headers
+ */
+export const uploadFile = (formData: any, headers: any) => {
+ return service.Post('/api/auth/storage/uploads', formData, {
+ headers: headers,
+ meta: {
+ ignoreToken: false,
+ signature: false,
+ },
+ name: "upload-file",
+ });
+};
+
+export const albumListApi = (type: number, sort: boolean, headers: any) => {
+ return service.Post('/api/auth/storage/album/list', {
+ type: type,
+ sort: sort,
+ }, {
+ headers: headers,
+ cacheFor: {
+ expire: 60 * 60 * 24 * 7,
+ mode: "restore",
+ },
+ meta: {
+ ignoreToken: false,
+ signature: false,
+ },
+ hitSource: ["create-album", "rename-album", "delete-album", "album-share"],
+ });
+};
diff --git a/src/api/storage/index.ts b/src/api/storage/index.ts
index 278d673..910a108 100644
--- a/src/api/storage/index.ts
+++ b/src/api/storage/index.ts
@@ -350,6 +350,7 @@ export const getStorageConfigListApi = () => {
signature: false,
},
name: "storage-config-list",
+ hitSource: ["delete-storage-config", "add-storage-config"]
});
};
/**
@@ -509,3 +510,54 @@ export const downloadAlbumImagesApi = (id: number, provider: string, bucket: str
name: "download-album-images",
});
};
+/**
+ * 获取用户存储配置
+ */
+export const listUserStorageConfigApi = () => {
+ return service.Post('/api/auth/storage/user/storage/list', {}, {
+ cacheFor: {
+ expire: 60 * 60 * 24 * 7,
+ mode: "restore",
+ },
+ meta: {
+ ignoreToken: false,
+ signature: false,
+ },
+ name: "list-user-storage-config",
+ hitSource: ["delete-storage-config", "add-storage-config"],
+ });
+};
+/**
+ * 创建存储配置
+ * @param id
+ * @param provider
+ * @param bucket
+ */
+export const deleteStorageConfigApi = (id: number, provider: string, bucket: string) => {
+ return service.Post('/api/auth/storage/config/delete', {
+ id: id,
+ provider: provider,
+ bucket: bucket,
+ }, {
+ meta: {
+ ignoreToken: false,
+ signature: false,
+ },
+ name: "delete-storage-config",
+ });
+};
+/**
+ * 创建存储配置
+ * @param params
+ */
+export const addStorageConfigApi = (params: any) => {
+ return service.Post('/api/auth/storage/config/add', {
+ ...params,
+ }, {
+ meta: {
+ ignoreToken: false,
+ signature: false,
+ },
+ name: "add-storage-config",
+ });
+};
diff --git a/src/assets/styles/theme.scss b/src/assets/styles/theme.scss
index 2f4828b..e52ab03 100644
--- a/src/assets/styles/theme.scss
+++ b/src/assets/styles/theme.scss
@@ -76,10 +76,6 @@ html {
}
}
-// 取消antd table 最后一行的边框
-.ant-table-wrapper .ant-table:not(.ant-table-bordered) .ant-table-tbody > tr:last-child > td {
- border-bottom: none !important;
-}
// 空白内容样式
.empty-content {
@@ -90,7 +86,3 @@ html {
height: 100%;
width: 100%;
}
-
-//:not(button) > svg:not([color]) {
-// color: var(--text-color) !important;
-//}
diff --git a/src/assets/svgs/account_security.svg b/src/assets/svgs/account_security.svg
new file mode 100644
index 0000000..1ce53a5
--- /dev/null
+++ b/src/assets/svgs/account_security.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/svgs/deleted-circle.svg b/src/assets/svgs/deleted-circle.svg
new file mode 100644
index 0000000..4e0734c
--- /dev/null
+++ b/src/assets/svgs/deleted-circle.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/svgs/email_security.svg b/src/assets/svgs/email_security.svg
new file mode 100644
index 0000000..0192c29
--- /dev/null
+++ b/src/assets/svgs/email_security.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/svgs/file-size.svg b/src/assets/svgs/file-size.svg
new file mode 100644
index 0000000..923c71f
--- /dev/null
+++ b/src/assets/svgs/file-size.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/svgs/image-icon.svg b/src/assets/svgs/image-icon.svg
new file mode 100644
index 0000000..e0b6992
--- /dev/null
+++ b/src/assets/svgs/image-icon.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/svgs/login_security.svg b/src/assets/svgs/login_security.svg
new file mode 100644
index 0000000..a07ceff
--- /dev/null
+++ b/src/assets/svgs/login_security.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/svgs/password_security.svg b/src/assets/svgs/password_security.svg
new file mode 100644
index 0000000..453c420
--- /dev/null
+++ b/src/assets/svgs/password_security.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/svgs/phone_security.svg b/src/assets/svgs/phone_security.svg
new file mode 100644
index 0000000..6236dc8
--- /dev/null
+++ b/src/assets/svgs/phone_security.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/svgs/share-icon.svg b/src/assets/svgs/share-icon.svg
new file mode 100644
index 0000000..4d8ae47
--- /dev/null
+++ b/src/assets/svgs/share-icon.svg
@@ -0,0 +1 @@
+
diff --git a/src/components/HeatmapPro/HeatmapPro.vue b/src/components/HeatmapPro/HeatmapPro.vue
new file mode 100644
index 0000000..67ec26f
--- /dev/null
+++ b/src/components/HeatmapPro/HeatmapPro.vue
@@ -0,0 +1,406 @@
+
+
+
+
+
+
+
diff --git a/src/components/ImageToolbar/ImageToolbar.vue b/src/components/ImageToolbar/ImageToolbar.vue
index 7942915..b53bb36 100644
--- a/src/components/ImageToolbar/ImageToolbar.vue
+++ b/src/components/ImageToolbar/ImageToolbar.vue
@@ -216,6 +216,11 @@ const editImages = async () => {
image.onload = () => {
imageStore.imageEditVisible = true;
};
+ image.onerror = () => {
+ message.warning("图片已过期,请刷新后重试");
+ imageStore.selected = [];
+ imageStore.imageEditVisible = false;
+ };
};
@@ -285,7 +290,6 @@ async function addImagesToAlbum(albumId: number) {
*/
function handleImageEditClose() {
imageStore.selected = [];
- image.src = '';
imageStore.imageEditVisible = false;
}
diff --git a/src/constant/provider_icon.ts b/src/constant/provider_icon.ts
deleted file mode 100644
index 55814eb..0000000
--- a/src/constant/provider_icon.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-export const ProviderIcon = {
- "ali": "/provider_icon/ali.svg",
- "tencent": "/provider_icon/tencent.svg",
- "minio": "/provider_icon/minio.svg",
- "huawei": "/provider_icon/huawei.svg",
-};
diff --git a/src/constant/provider_map.ts b/src/constant/provider_map.ts
new file mode 100644
index 0000000..63ceb98
--- /dev/null
+++ b/src/constant/provider_map.ts
@@ -0,0 +1,50 @@
+export const ProviderIcon = {
+ "ali": "/provider_icon/ali.svg",
+ "tencent": "/provider_icon/tencent.svg",
+ "minio": "/provider_icon/minio.svg",
+ "huawei": "/provider_icon/huawei.svg",
+};
+
+export const ProviderNameMap = {
+ "ali": "阿里云",
+ "tencent": "腾讯云",
+ "minio": "MinIO",
+ "huawei": "华为云",
+};
+export const ProviderColorMap = {
+ 'ali': 'orange',
+ 'tencent': 'blue',
+ 'minio': 'red',
+ 'huawei': 'red',
+};
+
+export const AliRegionMap = {
+ "cn-hangzhou": "杭州",
+ "cn-shanghai": "上海",
+ "cn-qingdao": "青岛",
+ "cn-beijing": "北京",
+ "cn-zhangjiakou": "张家口",
+ "cn-huhehaote": "呼和浩特",
+ "cn-shenzhen": "深圳",
+ "cn-chengdu": "成都",
+ "cn-heyuan": "河源",
+ "cn-wulanchabu": "乌兰察布",
+ "cn-ningxia": "宁夏",
+ "cn-shaoxing": "绍兴",
+ "cn-jiaxing": "嘉兴",
+ "cn-zhengzhou": "郑州",
+ "cn-hongkong": "香港",
+ "ap-southeast-1": "新加坡",
+ "ap-southeast-2": "悉尼",
+ "ap-southeast-3": "吉隆坡",
+ "ap-southeast-5": "雅加达",
+ "ap-northeast-1": "东京",
+ "ap-south-1": "孟买",
+ "eu-west-1": "伦敦",
+ "eu-central-1": "法兰克福",
+ "us-west-1": "硅谷",
+ "us-east-1": "弗吉尼亚",
+ "us-east-2": "米兰",
+ "us-west-2": "弗吉尼亚",
+ "me-east-1": "迪拜",
+};
diff --git a/src/layout/default/Header/Menu.vue b/src/layout/default/Header/Menu.vue
index d3ecc55..77531cf 100644
--- a/src/layout/default/Header/Menu.vue
+++ b/src/layout/default/Header/Menu.vue
@@ -155,7 +155,7 @@ import wenhao from "@/assets/svgs/wenhao.svg";
import useStore from "@/store";
import ImageUpload from "@/components/ImageUpload/ImageUpload.vue";
import {getStorageConfigListApi} from "@/api/storage";
-import {ProviderIcon} from "@/constant/provider_icon.ts";
+import {ProviderIcon} from "@/constant/provider_map.ts";
const router = useRouter();
diff --git a/src/layout/default/Header/Search.vue b/src/layout/default/Header/Search.vue
index 7af39cf..970ccf8 100644
--- a/src/layout/default/Header/Search.vue
+++ b/src/layout/default/Header/Search.vue
@@ -9,6 +9,7 @@
:style="{borderRadius: borderRadius, boxShadow: boxShadow}"
:placeholder="searchStore.searchOption[0]? '#'+searchStore.searchOption[0] : '搜索...'"
@pressEnter="search"
+ :allowClear="true "
>
@@ -55,6 +56,38 @@
style="border-radius: 20px"
/>
+
@@ -79,6 +112,12 @@ import useStore from "@/store";
import 'dayjs/locale/zh-cn';
import dayjs, {Dayjs} from 'dayjs';
import {imageSearchApi} from "@/api/storage";
+import {NSFWJS} from "nsfwjs";
+import {initNSFWJs, predictNSFW} from "@/utils/tfjs/nsfw.ts";
+import {message} from "ant-design-vue";
+import i18n from "@/locales";
+import {bytesToSize} from "@/utils/imageUtils/bytesToSize.ts";
+import {cocoSsdPredict} from "@/utils/tfjs/mobilenet.ts";
dayjs.locale('zh-cn');
const borderRadius = ref('20px');
@@ -152,7 +191,6 @@ async function search() {
keyword: searchStore.searchValue,
provider: uploadStore.storageSelected?.[0],
bucket: uploadStore.storageSelected?.[1],
- input_image: "123"
};
const res: any = await imageSearchApi(params);
if (res && res.code === 200) {
@@ -161,11 +199,44 @@ async function search() {
path: '/main/photo/search/list', query: {
type: searchStore.searchOption[0],
keyword: searchStore.searchValue,
+ provider: uploadStore.storageSelected?.[0],
+ bucket: uploadStore.storageSelected?.[1],
}
});
}
}
+const fileList = ref([]);
+const loading = ref(false);
+const iconUrl = ref('');
+const image = new Image();
+
+const beforeUpload = async (file: any) => {
+ loading.value = true;
+ image.src = URL.createObjectURL(file);
+ // 图片 NSFW 检测
+ const nsfw: NSFWJS = await initNSFWJs();
+ const isNSFW: boolean = await predictNSFW(nsfw, image);
+ if (isNSFW) {
+ message.error(i18n.global.t('comment.illegalImage'));
+ return false;
+ }
+ image.onload = async () => {
+
+ };
+ const cocoResults: any = await cocoSsdPredict(image);
+ searchStore.searchValue = cocoResults.map(item => item.class).join(',');
+
+ iconUrl.value = URL.createObjectURL(file);
+ loading.value = false;
+ return true;
+};
+const fileInfo = ref();
+
+function customRequest(file: any) {
+
+ fileInfo.value = file.file;
+}
diff --git a/src/main.ts b/src/main.ts
index cf1ca81..e97391a 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -10,6 +10,8 @@ import {createPersistedStatePlugin} from 'pinia-plugin-persistedstate-2';
import VueDOMPurifyHTML from 'vue-dompurify-html';
import {registerDirectives} from "@/directives";
+import VueCalendarMap from '@fcli/vue-calendar-map';
+
const pinia: Pinia = createPinia();
const installPersistedStatePlugin = createPersistedStatePlugin();
pinia.use((context) => installPersistedStatePlugin(context));
@@ -20,4 +22,5 @@ app.use(router);
app.use(i18n);
app.use(GoCaptcha);
app.use(VueDOMPurifyHTML);
+app.use(VueCalendarMap);
app.mount('#app');
diff --git a/src/router/modules/user.ts b/src/router/modules/user.ts
index c18e602..c1b97ef 100644
--- a/src/router/modules/user.ts
+++ b/src/router/modules/user.ts
@@ -1,13 +1,12 @@
import UserCenterHome from "@/views/User/PersonalCenter/components/UserCenterHome/UserCenterHome.vue";
import UserCenterDynamic from "@/views/User/PersonalCenter/components/UserCenterDynamic/UserCenterDynamic.vue";
-import UserCenterInfo from "@/views/User/PersonalCenter/components/UserCenterInfo/UserCenterInfo.vue";
-import UserCenterAnalysis from "@/views/User/PersonalCenter/components/UserCenterAnalysis/UserCenterAnalysis.vue";
-import UserCenterShare from "@/views/User/PersonalCenter/components/UserCenterShare/UserCenterShare.vue";
import UserCenterSetting from "@/views/User/PersonalCenter/components/UserCenterSetting/UserCenterSetting.vue";
import AccountSettingHome from "@/views/User/AccountSetting/components/AccountSettingHome/AccountSettingHome.vue";
import AccountSettingInfo from "@/views/User/AccountSetting/components/AccountSettingInfo/AccountSettingInfo.vue";
-import AccountSettingStorage from "@/views/User/AccountSetting/components/AccountSettingStorage/AccountSettingStorage.vue";
+import AccountSettingStorage
+ from "@/views/User/AccountSetting/components/AccountSettingStorage/AccountSettingStorage.vue";
+
export default [
{
@@ -38,33 +37,6 @@ export default [
title: '动态'
},
},
- {
- path: '/main/user/center/info',
- name: 'UserCenterInfo',
- component: UserCenterInfo,
- meta: {
- requiresAuth: true,
- title: '个人信息'
- },
- },
- {
- path: '/main/user/center/analysis',
- name: 'UserCenterAnalysis',
- component: UserCenterAnalysis,
- meta: {
- requiresAuth: true,
- title: '数据分析'
- },
- },
- {
- path: '/main/user/center/share',
- name: 'UserCenterShare',
- component: UserCenterShare,
- meta: {
- requiresAuth: true,
- title: '我的分享'
- },
- },
{
path: '/main/user/center/setting',
name: 'UserCenterSetting',
diff --git a/src/utils/alova/service_app.ts b/src/utils/alova/service_app.ts
new file mode 100644
index 0000000..37b6153
--- /dev/null
+++ b/src/utils/alova/service_app.ts
@@ -0,0 +1,101 @@
+import {createAlova} from 'alova';
+import CryptoJS from 'crypto-js';
+import VueHook from 'alova/vue';
+import useStore from "@/store";
+import {localforageStorageAdapter} from "@/utils/alova/adapter/localforageStorageAdapter.ts";
+import {createServerTokenAuthentication} from "alova/client";
+import {AxiosError, AxiosResponse} from "axios";
+import {message, Modal} from "ant-design-vue";
+import i18n from "@/locales";
+import {axiosRequestAdapter} from "@alova/adapter-axios";
+import {refreshToken} from "@/api/user";
+import generateKeySecretSignature from "@/utils/signature/signature.ts";
+import {handleErrorCode} from "@/utils/errorCode/errorCodeHandler.ts";
+
+
+const {onAuthRequired, onResponseRefreshToken} = createServerTokenAuthentication({
+ refreshTokenOnSuccess: {
+ // 在请求前触发,将接收到method参数,并返回boolean表示token是否过期
+ isExpired: (response: AxiosResponse, _method: any) => {
+ const code = response.data.code;
+ return code === 401;
+ },
+
+ // 当token过期时触发,在此函数中触发刷新token
+ handler: async () => {
+ // 刷新token
+ const user = useStore().user;
+ const res: any = await refreshToken();
+ if (res && res.code === 200) {
+ const {access_token, expire_at} = res.data;
+ user.token.accessToken = access_token;
+ user.token.expireAt = expire_at;
+ }
+ }
+ }
+});
+export const service = createAlova({
+ timeout: 10000,
+ baseURL: import.meta.env.VITE_APP_BASE_API,
+ statesHook: VueHook,
+ // 请求适配器
+ requestAdapter: axiosRequestAdapter(),
+ l2Cache: localforageStorageAdapter,
+ cacheLogger: import.meta.env.VITE_NODE_ENV === 'development',
+ cacheFor: null,
+ // 设置全局的请求拦截器
+ beforeRequest: onAuthRequired(async (method: any) => {
+ // if (!method.meta?.ignoreToken) {
+ // const user = useStore().user;
+ // method.config.headers.Authorization = `${import.meta.env.VITE_APP_TOKEN_KEY} ${user.token.accessToken}`;
+ // method.config.headers['X-UID'] = user.user.uid;
+ // // method.config.headers['X-Expire-At'] = user.token.expireAt;
+ // }
+ const lang = useStore().lang;
+ method.config.headers['Accept-Language'] = lang.lang || 'zh';
+
+ // 令牌
+ method.config.headers['X-Nonce'] = CryptoJS.lib.WordArray.random(16).toString();
+ // 签名
+ if (method.meta?.signature) {
+ method.config.headers['X-Content-Security'] = generateKeySecretSignature(0, method.type, method.url, method.config.params, method.data);
+ }
+ }),
+ // 响应拦截器
+ responded: onResponseRefreshToken({
+ onSuccess: async (response: AxiosResponse, _method: any) => {
+ if (response.data instanceof Blob) {
+ return response;
+ }
+ const {code} = response.data;
+ if (code === 403) {
+ localStorage.removeItem('user');
+ Modal.warning({
+ title: i18n.global.t('error.loginExpired'),
+ content: i18n.global.t('error.authTokenExpired'),
+ onOk() {
+ setTimeout(() => {
+ window.location.href = '/login';
+ }, 1000);
+ },
+ });
+ return Promise.reject();
+ }
+ return response.data;
+ },
+ onError:
+ (error: AxiosError, _method: any) => {
+ const {response} = error;
+ if (response) {
+ handleErrorCode(response.status);
+ }
+ if (!window.navigator.onLine) {
+ message.error(i18n.global.t('error.networkError')).then();
+ return Promise.reject(error);
+ }
+ },
+ }),
+});
+
+
diff --git a/src/views/Phone/CommonPhoneUpload/CommonPhoneUpload.vue b/src/views/Phone/CommonPhoneUpload/CommonPhoneUpload.vue
index 487ae0c..12b9f51 100644
--- a/src/views/Phone/CommonPhoneUpload/CommonPhoneUpload.vue
+++ b/src/views/Phone/CommonPhoneUpload/CommonPhoneUpload.vue
@@ -3,7 +3,7 @@
-
+
@@ -66,7 +66,7 @@
-
-666
-
-
diff --git a/src/views/User/AccountSetting/components/AccountSettingInfo/AccountSettingInfo.vue b/src/views/User/AccountSetting/components/AccountSettingInfo/AccountSettingInfo.vue
index 63cf316..be6f4c6 100644
--- a/src/views/User/AccountSetting/components/AccountSettingInfo/AccountSettingInfo.vue
+++ b/src/views/User/AccountSetting/components/AccountSettingInfo/AccountSettingInfo.vue
@@ -1,11 +1,163 @@
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 未知
+ 男
+ 女
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/src/views/User/AccountSetting/components/AccountSettingSidebar/AccountSettingSidebar.vue b/src/views/User/AccountSetting/components/AccountSettingSidebar/AccountSettingSidebar.vue
index 3ee36b5..be62556 100644
--- a/src/views/User/AccountSetting/components/AccountSettingSidebar/AccountSettingSidebar.vue
+++ b/src/views/User/AccountSetting/components/AccountSettingSidebar/AccountSettingSidebar.vue
@@ -47,6 +47,9 @@ const menuCSSStyle: any = reactive({
});
const router = useRouter();
+// const route = useRoute();
+
+
function handleClick({key}) {
menuStore.accountSettingMenu = key;
router.push(`/main/user/setting/${key}`);
diff --git a/src/views/User/AccountSetting/components/AccountSettingStorage/AccountSettingStorage.vue b/src/views/User/AccountSetting/components/AccountSettingStorage/AccountSettingStorage.vue
index 63cf316..23a6897 100644
--- a/src/views/User/AccountSetting/components/AccountSettingStorage/AccountSettingStorage.vue
+++ b/src/views/User/AccountSetting/components/AccountSettingStorage/AccountSettingStorage.vue
@@ -1,11 +1,209 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ provider.label }}
+
+
+
+
+
+
+
+
+ Http://
+ Https://
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ region.label }}
+
+
+
+
+
+
+
+
+
+ 取消
+ 提交
+
+
+
+
+
-
-
-
-
-
diff --git a/src/views/User/AccountSetting/components/AccountSettingStorage/StorageCard.vue b/src/views/User/AccountSetting/components/AccountSettingStorage/StorageCard.vue
new file mode 100644
index 0000000..2e7797c
--- /dev/null
+++ b/src/views/User/AccountSetting/components/AccountSettingStorage/StorageCard.vue
@@ -0,0 +1,148 @@
+
+
+
+
+
+
+
{{ storage.capacity }}GB
+
+
+
+
{{ AliRegionMap[storage.region] }}
+
+
+
+
{{ storage.created_at }}
+
+
+
+
+
+
+
+
diff --git a/src/views/User/PersonalCenter/PersonalCenter.vue b/src/views/User/PersonalCenter/PersonalCenter.vue
index e1359de..972b886 100644
--- a/src/views/User/PersonalCenter/PersonalCenter.vue
+++ b/src/views/User/PersonalCenter/PersonalCenter.vue
@@ -34,24 +34,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -60,7 +42,8 @@
-
+
+
@@ -69,11 +52,8 @@
import Header from "@/layout/default/Header/Header.vue";
import useStore from "@/store";
import home from "@/assets/svgs/home.svg";
-import data_analysis from "@/assets/svgs/data_analysis.svg";
import dynamic from "@/assets/svgs/dynamic.svg";
-import share from "@/assets/svgs/share.svg";
import setting from "@/assets/svgs/setting.svg";
-import personal_info from "@/assets/svgs/personal-center.svg";
const userStore = useStore().user;
@@ -92,7 +72,7 @@ function handleClick({key}) {
diff --git a/src/views/User/PersonalCenter/components/UserCenterDynamic/UserCenterDynamic.vue b/src/views/User/PersonalCenter/components/UserCenterDynamic/UserCenterDynamic.vue
index 63cf316..06f88d2 100644
--- a/src/views/User/PersonalCenter/components/UserCenterDynamic/UserCenterDynamic.vue
+++ b/src/views/User/PersonalCenter/components/UserCenterDynamic/UserCenterDynamic.vue
@@ -1,11 +1,307 @@
+
+
+
+
+
-
-
-
-
-
diff --git a/src/views/User/PersonalCenter/components/UserCenterHome/UserCenterHome.vue b/src/views/User/PersonalCenter/components/UserCenterHome/UserCenterHome.vue
index ff396d3..4773ae7 100644
--- a/src/views/User/PersonalCenter/components/UserCenterHome/UserCenterHome.vue
+++ b/src/views/User/PersonalCenter/components/UserCenterHome/UserCenterHome.vue
@@ -1,11 +1,256 @@
+
+
+
-
-
-6666
-
-
diff --git a/src/views/User/PersonalCenter/components/UserCenterInfo/UserCenterInfo.vue b/src/views/User/PersonalCenter/components/UserCenterInfo/UserCenterInfo.vue
deleted file mode 100644
index 63cf316..0000000
--- a/src/views/User/PersonalCenter/components/UserCenterInfo/UserCenterInfo.vue
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/views/User/PersonalCenter/components/UserCenterSetting/UserCenterSetting.vue b/src/views/User/PersonalCenter/components/UserCenterSetting/UserCenterSetting.vue
index 63cf316..02e199c 100644
--- a/src/views/User/PersonalCenter/components/UserCenterSetting/UserCenterSetting.vue
+++ b/src/views/User/PersonalCenter/components/UserCenterSetting/UserCenterSetting.vue
@@ -1,11 +1,67 @@
+
+
+
-
-
-
-
-
diff --git a/src/views/User/PersonalCenter/components/UserCenterShare/UserCenterShare.vue b/src/views/User/PersonalCenter/components/UserCenterShare/UserCenterShare.vue
deleted file mode 100644
index 63cf316..0000000
--- a/src/views/User/PersonalCenter/components/UserCenterShare/UserCenterShare.vue
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
diff --git a/vite.config.ts b/vite.config.ts
index b01bfcd..ea4a3ac 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -9,7 +9,6 @@ import {AntDesignVueResolver} from 'unplugin-vue-components/resolvers';
import AutoImport from 'unplugin-auto-import/vite';
import {chunkSplitPlugin} from 'vite-plugin-chunk-split';
import vitePluginBundleObfuscator from 'vite-plugin-bundle-obfuscator';
-
const defaultObfuscatorConfig: any = {
excludes: [],
enable: true,