| @@ -5,5 +5,13 @@ NODE_ENV='test' | |||||
| VITE_APP_TITLE = 'Metavatar-PC' | VITE_APP_TITLE = 'Metavatar-PC' | ||||
| VITE_APP_PORT = 3000 | VITE_APP_PORT = 3000 | ||||
| # VITE_APP_BASE_API = 'https://photo.metavatar.cc/C' | |||||
| VITE_APP_BASE_API = 'https://phototest.metavatar.cc/C' | VITE_APP_BASE_API = 'https://phototest.metavatar.cc/C' | ||||
| # NODE_ENV='development' | |||||
| # VITE_APP_TITLE = 'Metavatar-PC' | |||||
| # VITE_APP_PORT = 3000 | |||||
| # VITE_APP_BASE_API = 'https://phototest.metavatar.cc/C' | |||||
| @@ -77,4 +77,4 @@ | |||||
| "repository": "https://gitee.com/youlaiorg/vue3-element-admin.git", | "repository": "https://gitee.com/youlaiorg/vue3-element-admin.git", | ||||
| "author": "有来开源组织", | "author": "有来开源组织", | ||||
| "license": "MIT" | "license": "MIT" | ||||
| } | |||||
| } | |||||
| @@ -66,11 +66,18 @@ export function delImgApi(id) { | |||||
| * @params id | * @params id | ||||
| * @returns data | * @returns data | ||||
| */ | */ | ||||
| export function checkPhotoApi(material) { | |||||
| export function baiduPhotoApi(data) { | |||||
| const formData = new FormData(); | |||||
| formData.append('file', data); | |||||
| return request({ | return request({ | ||||
| url: `api/personPhoto/checkPhoto?material=${material}`, | |||||
| method: 'get', | |||||
| }) | |||||
| url: 'api/personPhoto/baiduPhoto', | |||||
| method: 'post', | |||||
| data: formData, | |||||
| headers: { | |||||
| 'Content-Type': 'application/form-data' | |||||
| } | |||||
| }); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -79,11 +86,17 @@ export function checkPhotoApi(material) { | |||||
| * @returns data | * @returns data | ||||
| */ | */ | ||||
| export function checkFaceApi(data) { | export function checkFaceApi(data) { | ||||
| const formData = new FormData(); | |||||
| formData.append('file', data); | |||||
| return request({ | return request({ | ||||
| url: `suimang/image_qualit`, | |||||
| url: 'api/personPhoto/checkPhoto', | |||||
| method: 'post', | method: 'post', | ||||
| data: { img: data } | |||||
| }) | |||||
| data: formData, | |||||
| headers: { | |||||
| 'Content-Type': 'application/form-data' | |||||
| } | |||||
| }); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -35,4 +35,16 @@ export function videoHyApi(id) { | |||||
| url: `/api/userPhotoVideo/videoHy?id=${id}`, | url: `/api/userPhotoVideo/videoHy?id=${id}`, | ||||
| method: 'get' | method: 'get' | ||||
| }) | }) | ||||
| } | |||||
| /** | |||||
| * @description 查询是否有视频更新 | |||||
| * @params id | |||||
| * @returns data | |||||
| */ | |||||
| export function checkVideoStatusApi(time) { | |||||
| return request({ | |||||
| url: `/api/userPhotoVideo/checkVideoStatus?time${time}`, | |||||
| method: 'get' | |||||
| }) | |||||
| } | } | ||||
| @@ -1,7 +1,11 @@ | |||||
| import { createI18n } from 'vue-i18n'; | import { createI18n } from 'vue-i18n'; | ||||
| import { useAppStore } from '@/store/modules/app'; | import { useAppStore } from '@/store/modules/app'; | ||||
| const appStore = useAppStore(); | |||||
| import { store } from '@/store/index'; // 因为不是在setup环境而是js中,必须重新初始化加载store | |||||
| const appStore = useAppStore(store); //pinia | |||||
| // const appStore = useAppStore(); | |||||
| // 本地语言包 | // 本地语言包 | ||||
| import enLocale from './package/en'; | import enLocale from './package/en'; | ||||
| import zhCnLocale from './package/zh-cn'; | import zhCnLocale from './package/zh-cn'; | ||||
| @@ -72,7 +72,7 @@ export default { | |||||
| AipictureTip:'Please customize your picture', | AipictureTip:'Please customize your picture', | ||||
| chooseMusic:'Choose Music', | chooseMusic:'Choose Music', | ||||
| searchMusic:'Search Music', | searchMusic:'Search Music', | ||||
| comingSoon:'coming soon', | |||||
| comingSoon:'COMING SOON', | |||||
| hotMusic:'Hit song', | hotMusic:'Hit song', | ||||
| inputRequirement:'Please enter your requirements, for example: Please generate a beverage advertisement of 500 words or less', | inputRequirement:'Please enter your requirements, for example: Please generate a beverage advertisement of 500 words or less', | ||||
| GeneratedText:'Generated Text', | GeneratedText:'Generated Text', | ||||
| @@ -81,7 +81,7 @@ export default { | |||||
| tooltip1:'Click to listen', | tooltip1:'Click to listen', | ||||
| tooltip2:'Add Pause', | tooltip2:'Add Pause', | ||||
| uploadImgTip1:'Click here to upload pictures', | uploadImgTip1:'Click here to upload pictures', | ||||
| uploadImgTip2:'Please ensure that the uploaded image is an open face image', | |||||
| uploadImgTip2:'Please upload unobstructed frontal photo', | |||||
| entered:'entered' | entered:'entered' | ||||
| }, | }, | ||||
| @@ -97,6 +97,7 @@ export default { | |||||
| more: "More", | more: "More", | ||||
| loading: "Loading , just a moment", | loading: "Loading , just a moment", | ||||
| loading1: "just a moment", | loading1: "just a moment", | ||||
| compress:'Compressed picture', | |||||
| sensitiveness: "Sensitive information is being tested", | sensitiveness: "Sensitive information is being tested", | ||||
| chackFace: "Face detection in progress", | chackFace: "Face detection in progress", | ||||
| upLoadPictures: "Uploading pictures", | upLoadPictures: "Uploading pictures", | ||||
| @@ -108,11 +109,12 @@ export default { | |||||
| generationSucceed: "Succeed", | generationSucceed: "Succeed", | ||||
| manuscriptText: "Manuscript", | manuscriptText: "Manuscript", | ||||
| generatingText: "The video is generating, Please wait a moment", | generatingText: "The video is generating, Please wait a moment", | ||||
| generationFailedText: "Video generation failed, you can click the button below to edit the generation again ", | |||||
| generationFailedText: "Video generation failed, click Edit button to retry.", | |||||
| edit:'Edit', | edit:'Edit', | ||||
| upSharpness:'Upgrade image quality', | upSharpness:'Upgrade image quality', | ||||
| upSharpnessTips:'If you are satisfied with the preview, you can click here to improve the video sharpness ~', | upSharpnessTips:'If you are satisfied with the preview, you can click here to improve the video sharpness ~', | ||||
| freeUserTip:'Free user-generated videos are limited to 1 minute', | freeUserTip:'Free user-generated videos are limited to 1 minute', | ||||
| hasNewVideo:'You have a new video generated!!', | |||||
| }, | }, | ||||
| // 个人账户 | // 个人账户 | ||||
| @@ -150,7 +152,7 @@ export default { | |||||
| selectPlan: "SELECT PLAN", | selectPlan: "SELECT PLAN", | ||||
| WeChatPay: "WeChatPay", | WeChatPay: "WeChatPay", | ||||
| Alipay: "Alipay", | Alipay: "Alipay", | ||||
| score:'score', | |||||
| score:'Credit', | |||||
| day:'day', | day:'day', | ||||
| second:'second', | second:'second', | ||||
| yes:'yes', | yes:'yes', | ||||
| @@ -160,7 +162,7 @@ export default { | |||||
| AIGeneratesPhotoPrices:'AI generates photo unit prices', | AIGeneratesPhotoPrices:'AI generates photo unit prices', | ||||
| UnitChargeDuration:'Unit charge duration', | UnitChargeDuration:'Unit charge duration', | ||||
| Language:'Language', | Language:'Language', | ||||
| sound:'sound', | |||||
| sound:'Sound', | |||||
| IndividualVideoDuration:'Individual video duration', | IndividualVideoDuration:'Individual video duration', | ||||
| AIGeneratedPortrait:'AI generated portrait', | AIGeneratedPortrait:'AI generated portrait', | ||||
| PhotoSinging:'Photo singing', | PhotoSinging:'Photo singing', | ||||
| @@ -97,6 +97,7 @@ export default { | |||||
| more: "更多", | more: "更多", | ||||
| loading: "加载中,请稍等", | loading: "加载中,请稍等", | ||||
| loading1: "请稍等", | loading1: "请稍等", | ||||
| compress:'正在压缩图片', | |||||
| sensitiveness: "正在进行敏感信息检测", | sensitiveness: "正在进行敏感信息检测", | ||||
| chackFace: "正在进行人脸检测", | chackFace: "正在进行人脸检测", | ||||
| upLoadPictures: "正在上传图片", | upLoadPictures: "正在上传图片", | ||||
| @@ -113,6 +114,7 @@ export default { | |||||
| upSharpness:'升级画质', | upSharpness:'升级画质', | ||||
| upSharpnessTips:'如果对预览效果满意,您可以点击此处来提升视频清晰度~', | upSharpnessTips:'如果对预览效果满意,您可以点击此处来提升视频清晰度~', | ||||
| freeUserTip:'免费用户生成视频时长限制为1分钟', | freeUserTip:'免费用户生成视频时长限制为1分钟', | ||||
| hasNewVideo:'您有新的视频生成了!', | |||||
| }, | }, | ||||
| // 个人账户 | // 个人账户 | ||||
| @@ -2,6 +2,7 @@ | |||||
| export {} | export {} | ||||
| declare global { | declare global { | ||||
| const EffectScope: typeof import('vue')['EffectScope'] | const EffectScope: typeof import('vue')['EffectScope'] | ||||
| const ElForm: typeof import('element-plus/es')['ElForm'] | |||||
| const ElMessage: typeof import('element-plus/es')['ElMessage'] | const ElMessage: typeof import('element-plus/es')['ElMessage'] | ||||
| const ElMessageBox: typeof import('element-plus/es')['ElMessageBox'] | const ElMessageBox: typeof import('element-plus/es')['ElMessageBox'] | ||||
| const asyncComputed: typeof import('@vueuse/core')['asyncComputed'] | const asyncComputed: typeof import('@vueuse/core')['asyncComputed'] | ||||
| @@ -270,6 +271,7 @@ import { UnwrapRef } from 'vue' | |||||
| declare module 'vue' { | declare module 'vue' { | ||||
| interface ComponentCustomProperties { | interface ComponentCustomProperties { | ||||
| readonly EffectScope: UnwrapRef<typeof import('vue')['EffectScope']> | readonly EffectScope: UnwrapRef<typeof import('vue')['EffectScope']> | ||||
| readonly ElForm: UnwrapRef<typeof import('element-plus/es')['ElForm']> | |||||
| readonly ElMessage: UnwrapRef<typeof import('element-plus/es')['ElMessage']> | readonly ElMessage: UnwrapRef<typeof import('element-plus/es')['ElMessage']> | ||||
| readonly ElMessageBox: UnwrapRef<typeof import('element-plus/es')['ElMessageBox']> | readonly ElMessageBox: UnwrapRef<typeof import('element-plus/es')['ElMessageBox']> | ||||
| readonly asyncComputed: UnwrapRef<typeof import('@vueuse/core')['asyncComputed']> | readonly asyncComputed: UnwrapRef<typeof import('@vueuse/core')['asyncComputed']> | ||||
| @@ -1,18 +1,20 @@ | |||||
| import axios from 'axios' | import axios from 'axios' | ||||
| import router from '@/router/index' | import router from '@/router/index' | ||||
| import { ElMessage } from 'element-plus' | import { ElMessage } from 'element-plus' | ||||
| // ElMessage | // ElMessage | ||||
| import { useAppStore } from '@/store/modules/app'; | |||||
| import { userInfoModules } from "@/store/modules/userInfo"; | import { userInfoModules } from "@/store/modules/userInfo"; | ||||
| // import stores from '@/store/index' | |||||
| import { store } from '@/store/index'; // 因为不是在setup环境而是js中,必须重新初始化加载store | import { store } from '@/store/index'; // 因为不是在setup环境而是js中,必须重新初始化加载store | ||||
| const appStore = useAppStore(store); //pinia | |||||
| const userInfoPinia = userInfoModules(store); //pinia | const userInfoPinia = userInfoModules(store); //pinia | ||||
| // const userInfoPinia = userInfoModules(store); //pinia | |||||
| // 开发环境需以 "/api" 拼接,其他环境需以 "/C" 拼接 | // 开发环境需以 "/api" 拼接,其他环境需以 "/C" 拼接 | ||||
| const env = process.env.NODE_ENV == 'development' ? "/api" : "/C" | const env = process.env.NODE_ENV == 'development' ? "/api" : "/C" | ||||
| // const env = process.env.NODE_ENV == 'development' ? "" : "" | // const env = process.env.NODE_ENV == 'development' ? "" : "" | ||||
| // console.log(process.env.NODE_ENV, 'env') | |||||
| console.log(env) | console.log(env) | ||||
| /** | /** | ||||
| * @description:发送Axios请求 | * @description:发送Axios请求 | ||||
| */ | */ | ||||
| @@ -42,7 +44,10 @@ request.interceptors.response.use( | |||||
| function (response) { | function (response) { | ||||
| if (!response.data) { | if (!response.data) { | ||||
| ElMessage.error($t('tips.systemException')); | |||||
| // ElMessage.error($t('tips.systemException')); | |||||
| ElMessage.error( | |||||
| appStore.language == "zh-cn" ? `服务器繁忙,请重试!` : `The server is busy, please try again` | |||||
| ); | |||||
| } | } | ||||
| let code = response.data.code | let code = response.data.code | ||||
| // 当token无效(过期或损坏)时 1053为未登录 | // 当token无效(过期或损坏)时 1053为未登录 | ||||
| @@ -50,13 +55,19 @@ request.interceptors.response.use( | |||||
| localStorage.removeItem("AccessToken"); | localStorage.removeItem("AccessToken"); | ||||
| router.push("/login"); | router.push("/login"); | ||||
| // ElMessage.error("登录过期,请重新登录!"); | // ElMessage.error("登录过期,请重新登录!"); | ||||
| ElMessage.error($t('tips.tokenExpired')); | |||||
| // ElMessage.error($t('tips.tokenExpired')); | |||||
| ElMessage.error( | |||||
| appStore.language == "zh-cn" ? `登录过期,请重新登录!` : `Login expired, please login again` | |||||
| ); | |||||
| return | return | ||||
| // 弹出错误 | // 弹出错误 | ||||
| } else if (code != 200) { | } else if (code != 200) { | ||||
| if (code == 500) { | if (code == 500) { | ||||
| // ElMessage.error("系统异常,请稍后再试"); | // ElMessage.error("系统异常,请稍后再试"); | ||||
| ElMessage.error($t('tips.systemException')); | |||||
| // ElMessage.error($t('tips.systemException')); | |||||
| ElMessage.error( | |||||
| appStore.language == "zh-cn" ? `服务器繁忙,请重试!` : `The server is busy, please try again` | |||||
| ); | |||||
| // 其他错误 | // 其他错误 | ||||
| } else { | } else { | ||||
| return Promise.reject(response.data) | return Promise.reject(response.data) | ||||
| @@ -694,7 +694,7 @@ import { | |||||
| personPhotoUserListList, | personPhotoUserListList, | ||||
| awsImgUpload, | awsImgUpload, | ||||
| delImgApi, | delImgApi, | ||||
| checkPhotoApi, | |||||
| baiduPhotoApi, | |||||
| checkFaceApi, | checkFaceApi, | ||||
| videoUpload, | videoUpload, | ||||
| saveImgApi, | saveImgApi, | ||||
| @@ -850,38 +850,33 @@ async function lookImg(e) { | |||||
| maxSizeMB: 4, // 最大压缩大小为 4MB | maxSizeMB: 4, // 最大压缩大小为 4MB | ||||
| useWebWorker: true, // 使用 Web Worker 进行压缩,提高性能 | useWebWorker: true, // 使用 Web Worker 进行压缩,提高性能 | ||||
| }; | }; | ||||
| imgUploadTips.value = "compress"; | |||||
| const compressedFile = await imageCompression(e.target.files[0], options); | const compressedFile = await imageCompression(e.target.files[0], options); | ||||
| imgUploadTips.value = "sensitiveness"; | imgUploadTips.value = "sensitiveness"; | ||||
| try { | try { | ||||
| await getImageBase64(compressedFile).then(async (base64) => { | |||||
| const res = await checkFaceApi(base64); | |||||
| console.log(res); | |||||
| // axios({ | |||||
| // method: "post", | |||||
| // url: "https://phototest.metavatar.cc/suimang/image_qualit", | |||||
| // // headers: { | |||||
| // // "content-type": "multipart/form-data", | |||||
| // // token: AccessToken, | |||||
| // // "Access-Control-Allow-Credentials": true, | |||||
| // // }, | |||||
| // data: { img: base64 }, | |||||
| // }).then(async (res) => { | |||||
| // // const res2 = await checkPhotoApi(compressedFile); | |||||
| // // // const res = await checkFaceApi(compressedFile); | |||||
| // // imgUrl.value = URL.createObjectURL(compressedFile); | |||||
| // // imgData.value = compressedFile; | |||||
| // // showUploadBtn.value = 4; | |||||
| // // submitImgBtn.value = true; | |||||
| // // compressionImgLoad.value = false; | |||||
| // // await changeFile(); | |||||
| // }); | |||||
| }); | |||||
| const res = await baiduPhotoApi(compressedFile); | |||||
| if (res.code != 200) { | |||||
| throw new Error(); | |||||
| } | |||||
| // 图片人脸信息检测通过时,继续检测敏感信息 | |||||
| imgUploadTips.value = "chackFace"; | |||||
| const res2 = await checkFaceApi(compressedFile); | |||||
| if (res2.code != 200) { | |||||
| throw new Error(); | |||||
| } | |||||
| imgUrl.value = URL.createObjectURL(compressedFile); | |||||
| imgData.value = compressedFile; | |||||
| showUploadBtn.value = 4; | |||||
| submitImgBtn.value = true; | |||||
| compressionImgLoad.value = false; | |||||
| await changeFile(); | |||||
| } catch (error) { | } catch (error) { | ||||
| ElMessage.error( | ElMessage.error( | ||||
| lanChange.value == "zh-cn" | lanChange.value == "zh-cn" | ||||
| ? `图片涉及敏感内容,上传失败` | |||||
| : `Image related to sensitive content, upload failed` | |||||
| ? `图片不符合规范,上传失败` | |||||
| : `Image does not meet the specifications, upload failed` | |||||
| ); | ); | ||||
| showFace.value = 1; | showFace.value = 1; | ||||
| showUploadBtn.value = 2; | showUploadBtn.value = 2; | ||||
| @@ -925,15 +920,25 @@ async function changeFile() { | |||||
| imgUploadTips.value = "upLoadPictures"; | imgUploadTips.value = "upLoadPictures"; | ||||
| compressionImgLoad.value = true; | compressionImgLoad.value = true; | ||||
| showUploadBtn.value = 3; | showUploadBtn.value = 3; | ||||
| imgUrl.value = URL.createObjectURL(imgData.value); | |||||
| // imgUrl.value = URL.createObjectURL(imgData.value); | |||||
| let formData = new FormData(); | let formData = new FormData(); | ||||
| const timestamp = Date.now(); | const timestamp = Date.now(); | ||||
| formData.append("file", imgData.value, timestamp + ".png"); | formData.append("file", imgData.value, timestamp + ".png"); | ||||
| try { | try { | ||||
| // 上传图片 | // 上传图片 | ||||
| const res = await awsImgUpload(formData); | const res = await awsImgUpload(formData); | ||||
| if (res.code != 200) { | |||||
| throw new Error(); | |||||
| } | |||||
| // 保存图片 | // 保存图片 | ||||
| const res2 = await saveImgApi({ material: res.data.url }); | const res2 = await saveImgApi({ material: res.data.url }); | ||||
| if (res2.code != 200) { | |||||
| throw new Error(); | |||||
| } else { | |||||
| ElMessage.success( | |||||
| lanChange.value == "zh-cn" ? `上传成功` : `Upload successfully` | |||||
| ); | |||||
| } | |||||
| // 重新获取列表 | // 重新获取列表 | ||||
| compressionImgLoad.value = false; | compressionImgLoad.value = false; | ||||
| showUploadBtn.value = 4; | showUploadBtn.value = 4; | ||||
| @@ -941,23 +946,17 @@ async function changeFile() { | |||||
| getAiFaceUserList(1, 10, 3); | getAiFaceUserList(1, 10, 3); | ||||
| pageNumUser.value = 1; | pageNumUser.value = 1; | ||||
| overLoadUser.value = false; | overLoadUser.value = false; | ||||
| if (res2.code == 200) { | |||||
| ElMessage.success( | |||||
| lanChange.value == "zh-cn" ? `上传成功` : `Upload successfully` | |||||
| ); | |||||
| } else { | |||||
| ElMessage.error( | |||||
| lanChange.value == "zh-cn" ? `上传失败` : `Upload failure` | |||||
| ); | |||||
| } | |||||
| faceItemActive.value = res2.data.id; | faceItemActive.value = res2.data.id; | ||||
| imgUrl.value = res2.data.material; | imgUrl.value = res2.data.material; | ||||
| submitImgBtn.value = false; | submitImgBtn.value = false; | ||||
| console.log(123654); | |||||
| showUploadBtn.value = 1; | showUploadBtn.value = 1; | ||||
| imgUploadTips.value = null; | imgUploadTips.value = null; | ||||
| } catch (error) { | } catch (error) { | ||||
| ElMessage.error(lanChange.value == "zh-cn" ? `上传失败` : `Upload failure`); | ElMessage.error(lanChange.value == "zh-cn" ? `上传失败` : `Upload failure`); | ||||
| imgUrl.value = null; | |||||
| showFace.value = 1; | |||||
| showUploadBtn.value = 2; | |||||
| compressionImgLoad.value = false; | |||||
| imgUploadTips.value = null; | imgUploadTips.value = null; | ||||
| } | } | ||||
| } | } | ||||
| @@ -972,8 +971,14 @@ function chooseMyImg() { | |||||
| } | } | ||||
| // 点击AI头像区的+号 | // 点击AI头像区的+号 | ||||
| function clickAddBtn() { | function clickAddBtn() { | ||||
| faceItemActive.value = null; | |||||
| // if (!imgUploadTips.value) { | |||||
| // showUploadBtn.value = 3; | |||||
| // submitImgBtn.value = false; | |||||
| // compressionImgLoad.value = true; | |||||
| // return; | |||||
| // } | |||||
| showUploadBtn.value = 2; | showUploadBtn.value = 2; | ||||
| faceItemActive.value = null; | |||||
| } | } | ||||
| //#endregion --------------------------- | //#endregion --------------------------- | ||||
| @@ -1084,6 +1089,8 @@ async function getPreviewAudio() { | |||||
| return; | return; | ||||
| } | } | ||||
| previewAudioUrl.value = res.data.data; | previewAudioUrl.value = res.data.data; | ||||
| // previewAudioUrl.value = | |||||
| // "/suimang/static/tts/2023-07-04/16884538755531874.wav"; | |||||
| let audioA = document.getElementById("audio"); | let audioA = document.getElementById("audio"); | ||||
| audioA.addEventListener("loadedmetadata", async () => { | audioA.addEventListener("loadedmetadata", async () => { | ||||
| audioA.muted = false; // 将 muted 属性设置为 false | audioA.muted = false; // 将 muted 属性设置为 false | ||||
| @@ -1208,19 +1215,19 @@ const handleFileChange = async () => { | |||||
| if (uploadAudioTime.value > 60) { | if (uploadAudioTime.value > 60) { | ||||
| ElMessage.error( | ElMessage.error( | ||||
| lanChange.value == "zh-cn" | lanChange.value == "zh-cn" | ||||
| ? `上传失败,免费用户上传音频时长最多为60秒` | |||||
| : `Upload failed, free users can upload audio for up to 60 seconds` | |||||
| ? `上传音频大小或者长度超出限制,请重新上传` | |||||
| : `The size or length of the uploaded audio exceeds the limit. Please upload it again` | |||||
| ); | ); | ||||
| audioUrl.value = null; | audioUrl.value = null; | ||||
| audioData.value = null; | audioData.value = null; | ||||
| return; | return; | ||||
| } | } | ||||
| // 限制3mb | |||||
| if (file.size / 1048576 > 3) { | |||||
| // 限制5mb | |||||
| if (file.size / 1048576 > 5) { | |||||
| ElMessage.error( | ElMessage.error( | ||||
| lanChange.value == "zh-cn" | lanChange.value == "zh-cn" | ||||
| ? `上传失败,免费用户上传音频大小最大为3MB` | |||||
| : `Failed to upload. The maximum size of audio uploaded by free users is 3MB` | |||||
| ? `上传音频大小或者长度超出限制,请重新上传` | |||||
| : `The size or length of the uploaded audio exceeds the limit. Please upload it again` | |||||
| ); | ); | ||||
| audioUrl.value = null; | audioUrl.value = null; | ||||
| audioData.value = null; | audioData.value = null; | ||||
| @@ -12,6 +12,10 @@ | |||||
| ><i-ep-search | ><i-ep-search | ||||
| /></el-icon> | /></el-icon> | ||||
| </div> | </div> | ||||
| <!-- 更新视频提示 --> | |||||
| <div class="hasNewVideoTips" :class="hasNewCreate ? '' : 'hasNew'"> | |||||
| {{ $t("myCreating.hasNewVideo") }} | |||||
| </div> | |||||
| </div> | </div> | ||||
| <!-- 作品列表 --> | <!-- 作品列表 --> | ||||
| <div v-if="!isLoading"> | <div v-if="!isLoading"> | ||||
| @@ -127,7 +131,7 @@ | |||||
| > | > | ||||
| <div class="videoBox"> | <div class="videoBox"> | ||||
| <!-- 免费用户1分钟 --> | <!-- 免费用户1分钟 --> | ||||
| <div v-if="false" class="overtimeTips"> | |||||
| <div v-if="true" class="overtimeTips"> | |||||
| <img src="../../assets/img/tips.png" alt="" /> | <img src="../../assets/img/tips.png" alt="" /> | ||||
| {{ $t("myCreating.freeUserTip") }} | {{ $t("myCreating.freeUserTip") }} | ||||
| </div> | </div> | ||||
| @@ -243,6 +247,7 @@ import { | |||||
| userPhotoVideoListApi, | userPhotoVideoListApi, | ||||
| delUserPhotoVideoByIDApi, | delUserPhotoVideoByIDApi, | ||||
| videoHyApi, | videoHyApi, | ||||
| checkVideoStatusApi, | |||||
| } from "@/apis/myCreating"; | } from "@/apis/myCreating"; | ||||
| import { timestampToTime } from "@/utils/tools"; | import { timestampToTime } from "@/utils/tools"; | ||||
| import { useI18n } from "vue-i18n"; | import { useI18n } from "vue-i18n"; | ||||
| @@ -428,23 +433,70 @@ function delPhotoVideo(videoID) { | |||||
| ElMessage.error(err.message); | ElMessage.error(err.message); | ||||
| }); | }); | ||||
| } | } | ||||
| //#region 定时刷新 | |||||
| const hasNewCreate = ref(false); //提示框显示隐藏 | |||||
| const nowTime = Date.now(); | |||||
| const checkVideoStatus = async () => { | |||||
| console.log(nowTime); | |||||
| // const res = await checkVideoStatusApi(); | |||||
| // if (res.code == 2115) { | |||||
| // hasNewCreate.value = true; | |||||
| // const changeHasNewCreate = setTimeout(() => { | |||||
| // hasNewCreate.value = false; | |||||
| // }, 5000); | |||||
| // getPhotoVideoList(1, 10, ""); | |||||
| // } | |||||
| }; | |||||
| const startLogin = () => { | |||||
| // 每隔 3 秒执行一次登录请求 | |||||
| const intervalId = setInterval(checkVideoStatus, 3000); | |||||
| // 在组件销毁前清除定时器 | |||||
| onUnmounted(() => { | |||||
| clearInterval(intervalId); | |||||
| }); | |||||
| }; | |||||
| //#endregion --------------------------- | |||||
| //#region 页面初始化 | |||||
| onMounted(() => { | onMounted(() => { | ||||
| isLoading.value = true; | isLoading.value = true; | ||||
| getPhotoVideoList(pageNum.value, pageSize.value, title.value); | getPhotoVideoList(pageNum.value, pageSize.value, title.value); | ||||
| // startLogin(); | |||||
| }); | }); | ||||
| //#endregion --------------------------- | |||||
| </script> | </script> | ||||
| <style lang="scss" scoped> | <style lang="scss" scoped> | ||||
| .page { | .page { | ||||
| position: relative; | |||||
| min-height: calc(100vh - 80px); | min-height: calc(100vh - 80px); | ||||
| padding: 15px 130px; | padding: 15px 130px; | ||||
| background-color: #fff; | background-color: #fff; | ||||
| border-radius: 25px 0 0; | border-radius: 25px 0 0; | ||||
| width: 100%; | width: 100%; | ||||
| overflow: hidden; | overflow: hidden; | ||||
| .top { | .top { | ||||
| position: relative; | |||||
| margin-bottom: 35px; | margin-bottom: 35px; | ||||
| .hasNewVideoTips { | |||||
| position: absolute; | |||||
| top: 0; | |||||
| left: 50%; | |||||
| transform: translateX(-50%); | |||||
| width: 400px; | |||||
| padding: 5px 30px; | |||||
| color: #fff; | |||||
| background-color: #000; | |||||
| text-align: center; | |||||
| font-size: 20px; | |||||
| transition: all 0.5s; | |||||
| opacity: 1; | |||||
| border-radius: 15px; | |||||
| } | |||||
| .hasNew { | |||||
| opacity: 0; | |||||
| transition: all 0.5s; | |||||
| } | |||||
| } | } | ||||
| .loadingIcon { | .loadingIcon { | ||||
| height: 100px; | height: 100px; | ||||
| @@ -465,7 +517,6 @@ onMounted(() => { | |||||
| // height: 200px; | // height: 200px; | ||||
| margin-top: 5px; | margin-top: 5px; | ||||
| padding-bottom: 50px; | padding-bottom: 50px; | ||||
| cursor: pointer; | |||||
| .workItem { | .workItem { | ||||
| position: relative; | position: relative; | ||||
| width: 300px; | width: 300px; | ||||
| @@ -58,27 +58,16 @@ export default defineConfig(({ mode }: ConfigEnv): UserConfig => { | |||||
| changeOrigin: true, | changeOrigin: true, | ||||
| rewrite: (path) => path.replace(/^\/api/, ""), | rewrite: (path) => path.replace(/^\/api/, ""), | ||||
| }, | }, | ||||
| "/api/suimang": { | |||||
| // target: https://phototest.metavatar.cc/C, // 线上接口地址 | |||||
| target:'https://phototest.metavatar.cc/', // 线上接口地址 | |||||
| changeOrigin: true, | |||||
| rewrite: (path) => path.replace(/^\/api\/suimang/, "/suimang"), | |||||
| // pathRewrite: { | |||||
| // "^/api/suimang": "/suimang", | |||||
| // } | |||||
| }, | |||||
| "/suimang": { | |||||
| // target: https://phototest.metavatar.cc/C, // 线上接口地址 | |||||
| target:'https://phototest.metavatar.cc/', // 线上接口地址 | |||||
| changeOrigin: true, | |||||
| rewrite: (path) => path.replace(/^\/suimang/, '/suimang/image_qualit') | |||||
| // pathRewrite: { | |||||
| // "^/api/suimang": "/suimang", | |||||
| // } | |||||
| }, | |||||
| // "/C/api/suimang": { | |||||
| // target:'https://phototest.metavatar.cc/', // 线上接口地址 | |||||
| // changeOrigin: true, | |||||
| // rewrite: (path) => path.replace(/^\/C\/api\/suimang/, '/suimang/image_qualit') | |||||
| // }, | |||||
| // "/api/suimang": { | |||||
| // target:'https://phototest.metavatar.cc/', // 线上接口地址 | |||||
| // changeOrigin: true, | |||||
| // rewrite: (path) => path.replace(/^\/api\/suimang/, '/suimang/image_qualit') | |||||
| // }, | |||||
| }, | }, | ||||
| }, | }, | ||||
| plugins: [ | plugins: [ | ||||