This commit is contained in:
2024-09-20 16:31:57 +08:00
parent fae33aa49c
commit 94f2fa94b7
6 changed files with 584 additions and 530 deletions

20
ecosystem.config.js Normal file
View File

@@ -0,0 +1,20 @@
module.exports = {
apps: [
{
name: 'nextjs-app', // 应用名称
script: 'npm', // 使用 npm 脚本
args: 'run start', // 启动应用的命令
cwd: './', // 项目的路径
watch: false, // 是否监控文件变化
env: {
NODE_ENV: 'production', // 生产环境变量
},
// 在启动前执行构建
exec_mode: 'fork', // 使用 fork 模式
instances: 1, // 启动的实例数量
autorestart: true, // 自动重启
max_memory_restart: '1G', // 内存超过 1G 时自动重启
pre_start: 'npm run build', // 启动前执行构建
},
],
};

View File

@@ -22,7 +22,7 @@ export default function Page() {
className="absolute top-0 left-0 w-full h-full object-cover z-[-1]" className="absolute top-0 left-0 w-full h-full object-cover z-[-1]"
> >
<source <source
src="http://file.typeframes.com.cn/video_2024-09-16 11_18_33.webm" src="https://file.typeframes.com.cn/video_2024-09-16 11_18_33.webm"
type="video/mp4" type="video/mp4"
/> />
</video> </video>

View File

@@ -28,41 +28,41 @@ export default function CreateTabs() {
value: "text", value: "text",
component: <TextVideo />, component: <TextVideo />,
videoTemp: videoTemp:
"http://file.typeframes.com.cn/img-to-video/cn/demo_video.webm", "https://file.typeframes.com.cn/img-to-video/cn/demo_video.webm",
}, },
{ {
name: t("aiImageVideoGenerator"), name: t("aiImageVideoGenerator"),
value: "image", value: "image",
component: <ImageVideo />, component: <ImageVideo />,
videoTemp: videoTemp:
"http://file.typeframes.com.cn/img-to-video/cn/demo_image.webm", "https://file.typeframes.com.cn/img-to-video/cn/demo_image.webm",
}, },
{ {
name: t("aiTiktokVideoGenerator"), name: t("aiTiktokVideoGenerator"),
value: "tiktok", value: "tiktok",
component: <Tiktok />, component: <Tiktok />,
videoTemp: videoTemp:
"http://file.typeframes.com.cn/create-tiktok-video/en/demo_video.webm", "https://file.typeframes.com.cn/create-tiktok-video/en/demo_video.webm",
ImageTemp: ImageTemp:
"http://file.typeframes.com.cn/create-tiktok-video/en/demo_demo.webm", "https://file.typeframes.com.cn/create-tiktok-video/en/demo_demo.webm",
}, },
{ {
name: t("aiTalkingAvatarVideoCreator"), name: t("aiTalkingAvatarVideoCreator"),
value: "avatar", value: "avatar",
component: <Avatar />, component: <Avatar />,
videoTemp: videoTemp:
"http://file.typeframes.com.cn/create-Avatar-video/en/demo_video.webm", "https://file.typeframes.com.cn/create-Avatar-video/en/demo_video.webm",
ImageTemp: ImageTemp:
"http://file.typeframes.com.cn/create-Avatar-video/en/demo_video.webm", "https://file.typeframes.com.cn/create-Avatar-video/en/demo_video.webm",
}, },
{ {
name: t("aiMusicVideoGenerator"), name: t("aiMusicVideoGenerator"),
value: "music", value: "music",
component: <Music />, component: <Music />,
videoTemp: videoTemp:
"http://file.typeframes.com.cn/music-to-video/cn/demo_video.webm", "https://file.typeframes.com.cn/music-to-video/cn/demo_video.webm",
ImageTemp: ImageTemp:
"http://file.typeframes.com.cn/music-to-video/cn/demo_video.webm", "https://file.typeframes.com.cn/music-to-video/cn/demo_video.webm",
}, },
]; ];

View File

@@ -128,7 +128,7 @@ export default function LoginForm({ toRegister }: LoginFormProps) {
}; };
return ( return (
<div className="flex flex-col items-center gap-[25px] py-8 bg-black/80 rounded-lg shadow-lg px-8 w-[500px]"> <div className="flex flex-col items-center gap-[25px] py-8 bg-black/80 rounded-lg shadow-lg px-8 w-[full] sm:w-[500px]">
<div className="mt-auto w-full items-center justify-stretch flex flex-col gap-1.5"> <div className="mt-auto w-full items-center justify-stretch flex flex-col gap-1.5">
<GoogleLogin /> <GoogleLogin />
<div className="z-0 w-[80%] relative flex justify-center items-center my-3"> <div className="z-0 w-[80%] relative flex justify-center items-center my-3">
@@ -154,7 +154,10 @@ export default function LoginForm({ toRegister }: LoginFormProps) {
> >
<span className="invisible size-2 rounded-full bg-white group-data-[checked]:visible" /> <span className="invisible size-2 rounded-full bg-white group-data-[checked]:visible" />
</Radio> </Radio>
<Form.Label htmlFor="password" className="text-gray-300"> <Form.Label
htmlFor="password"
className="text-gray-300"
>
{t("passwordLogin")} {t("passwordLogin")}
</Form.Label> </Form.Label>
</div> </div>
@@ -166,7 +169,10 @@ export default function LoginForm({ toRegister }: LoginFormProps) {
> >
<span className="invisible size-2 rounded-full bg-white group-data-[checked]:visible" /> <span className="invisible size-2 rounded-full bg-white group-data-[checked]:visible" />
</Radio> </Radio>
<Form.Label htmlFor="code" className="text-gray-300"> <Form.Label
htmlFor="code"
className="text-gray-300"
>
{t("codeLogin")} {t("codeLogin")}
</Form.Label> </Form.Label>
</div> </div>
@@ -180,7 +186,9 @@ export default function LoginForm({ toRegister }: LoginFormProps) {
type="text" type="text"
id="username" id="username"
value={username} value={username}
onChange={(e) => setUsername(e.target.value)} onChange={(e) =>
setUsername(e.target.value)
}
className="h-10 input border-gray-600 bg-gray-800 outline-none focus:outline-none w-full rounded-lg text-sm text-gray-300 placeholder:text-gray-500" className="h-10 input border-gray-600 bg-gray-800 outline-none focus:outline-none w-full rounded-lg text-sm text-gray-300 placeholder:text-gray-500"
placeholder={t("emailOrPhone")} placeholder={t("emailOrPhone")}
/> />
@@ -191,7 +199,9 @@ export default function LoginForm({ toRegister }: LoginFormProps) {
type="password" type="password"
id="password" id="password"
value={password} value={password}
onChange={(e) => setPassword(e.target.value)} onChange={(e) =>
setPassword(e.target.value)
}
className="h-10 input border-gray-600 bg-gray-800 outline-none focus:outline-none w-full rounded-lg text-sm text-gray-300 placeholder:text-gray-500" className="h-10 input border-gray-600 bg-gray-800 outline-none focus:outline-none w-full rounded-lg text-sm text-gray-300 placeholder:text-gray-500"
placeholder={t("yourPassword")} placeholder={t("yourPassword")}
/> />
@@ -206,7 +216,9 @@ export default function LoginForm({ toRegister }: LoginFormProps) {
type="tel" type="tel"
id="phone" id="phone"
value={phone} value={phone}
onChange={(e) => setPhone(e.target.value)} onChange={(e) =>
setPhone(e.target.value)
}
className="h-10 input border-gray-600 bg-gray-800 outline-none focus:outline-none w-full rounded-lg text-sm text-gray-300 placeholder:text-gray-500" className="h-10 input border-gray-600 bg-gray-800 outline-none focus:outline-none w-full rounded-lg text-sm text-gray-300 placeholder:text-gray-500"
placeholder={t("phone")} placeholder={t("phone")}
/> />
@@ -217,7 +229,9 @@ export default function LoginForm({ toRegister }: LoginFormProps) {
type="text" type="text"
id="captcha" id="captcha"
value={captcha} value={captcha}
onChange={(e) => setCaptcha(e.target.value)} onChange={(e) =>
setCaptcha(e.target.value)
}
className="h-10 input border-gray-600 bg-gray-800 outline-none focus:outline-none w-full rounded-lg text-sm text-gray-300 placeholder:text-gray-500" className="h-10 input border-gray-600 bg-gray-800 outline-none focus:outline-none w-full rounded-lg text-sm text-gray-300 placeholder:text-gray-500"
placeholder={t("captcha")} placeholder={t("captcha")}
/> />
@@ -225,7 +239,10 @@ export default function LoginForm({ toRegister }: LoginFormProps) {
type="button" type="button"
onClick={handleGetCaptcha} onClick={handleGetCaptcha}
className="btn h-10 btn-sm w-32 ml-2 bg-transparent hover:bg-green-500 hover:text-white text-gray-500 rounded-lg" className="btn h-10 btn-sm w-32 ml-2 bg-transparent hover:bg-green-500 hover:text-white text-gray-500 rounded-lg"
disabled={captchaTimer > 0 || captchaLoading} disabled={
captchaTimer > 0 ||
captchaLoading
}
> >
{captchaLoading ? ( {captchaLoading ? (
<span className="loading loading-spinner loading-md"></span> <span className="loading loading-spinner loading-md"></span>
@@ -247,12 +264,17 @@ export default function LoginForm({ toRegister }: LoginFormProps) {
<input <input
type="checkbox" type="checkbox"
checked={agreed} checked={agreed}
onChange={(e) => setAgreed(e.target.checked)} onChange={(e) =>
setAgreed(e.target.checked)
}
className="h-4 w-4 text-green-500 bg-gray-700 border-gray-600 rounded focus:ring-green-500" className="h-4 w-4 text-green-500 bg-gray-700 border-gray-600 rounded focus:ring-green-500"
/> />
<span className="ml-2"> <span className="ml-2">
{tGlobal("agreeTo")}{" "} {tGlobal("agreeTo")}{" "}
<Link href="/terms" className="text-green-500 underline"> <Link
href="/terms"
className="text-green-500 underline"
>
{tTerms("title")} {tTerms("title")}
</Link> </Link>
</span> </span>
@@ -262,13 +284,12 @@ export default function LoginForm({ toRegister }: LoginFormProps) {
<Form.Submit <Form.Submit
disabled={loginLoading} disabled={loginLoading}
className="btn bg-transparent hover:bg-transparent text-gray-500 w-full rounded-lg hover:text-green-500" className="btn bg-transparent text-gray-200 w-full rounded-lg hover:text-green-500 hover:bg-secondary/20"
> >
{t("login")}
{loginLoading ? ( {loginLoading ? (
<span className="loading loading-spinner loading-md"></span> <span className="loading loading-spinner loading-md text-gray-200"></span>
) : ( ) : (
"" <span>{t("login")}</span>
)} )}
</Form.Submit> </Form.Submit>
</div> </div>
@@ -276,7 +297,7 @@ export default function LoginForm({ toRegister }: LoginFormProps) {
<button <button
onClick={toRegister} onClick={toRegister}
className="btn btn-outline btn-neutral whitespace-nowrap z-0 text-sm font-medium w-full mt-3 bg-transparent border-gray-500 text-gray-300 hover:bg-gray-700" className="btn btn-outline btn-neutral whitespace-nowrap z-0 text-sm font-medium w-full mt-3 bg-transparent border-gray-500 text-gray-200 hover:bg-gray-700"
> >
{t("register")} {t("register")}
</button> </button>

View File

@@ -137,7 +137,7 @@ export default function RegisterForm({ back }: RegisterFormProps) {
}; };
return ( return (
<div className="flex flex-col items-center gap-[25px] py-8 bg-black/80 rounded-lg shadow-lg px-8 w-[400px]"> <div className="flex flex-col items-center gap-[25px] py-8 bg-black/80 rounded-lg shadow-lg px-8 w-[full] sm:w-[500px]">
<div className="w-full flex items-center justify-between mb-4 "> <div className="w-full flex items-center justify-between mb-4 ">
<button <button
className="text-gray-300 hover:text-white" className="text-gray-300 hover:text-white"
@@ -160,7 +160,10 @@ export default function RegisterForm({ back }: RegisterFormProps) {
className="flex items-center justify-center gap-6" className="flex items-center justify-center gap-6"
> >
{plans.map((plan) => ( {plans.map((plan) => (
<div key={plan} className="flex items-center gap-2"> <div
key={plan}
className="flex items-center gap-2"
>
<Radio <Radio
id={plan} id={plan}
value={plan} value={plan}
@@ -168,7 +171,10 @@ export default function RegisterForm({ back }: RegisterFormProps) {
> >
<span className="invisible h-2 w-2 rounded-full bg-white group-data-[checked]:visible" /> <span className="invisible h-2 w-2 rounded-full bg-white group-data-[checked]:visible" />
</Radio> </Radio>
<Form.Label htmlFor={plan} className="text-gray-300"> <Form.Label
htmlFor={plan}
className="text-gray-300"
>
{t(plan)} {t(plan)}
</Form.Label> </Form.Label>
</div> </div>
@@ -251,15 +257,17 @@ export default function RegisterForm({ back }: RegisterFormProps) {
<button <button
type="button" type="button"
onClick={handleGetCaptcha} onClick={handleGetCaptcha}
className="btn h-10 btn-sm w-32 ml-2 bg-transparent hover:bg-green-500 hover:text-white text-gray-500 rounded-lg" className="btn h-10 btn-sm w-32 ml-2 bg-transparent hover:bg-green-500 hover:text-white text-gray-200 rounded-lg"
disabled={captchaTimer > 0 || verificationLoading} disabled={
captchaTimer > 0 || verificationLoading
}
> >
{verificationLoading ? ( {verificationLoading ? (
<span className="loading loading-spinner loading-md"></span> <span className="loading loading-spinner loading-md text-gray-200"></span>
) : captchaTimer > 0 ? ( ) : captchaTimer > 0 ? (
`${captchaTimer}s` `${captchaTimer}s`
) : ( ) : (
t("getCode") <span>{t("getCode")}</span>
)} )}
</button> </button>
</div> </div>
@@ -272,12 +280,17 @@ export default function RegisterForm({ back }: RegisterFormProps) {
<input <input
type="checkbox" type="checkbox"
checked={agreed} checked={agreed}
onChange={(e) => setAgreed(e.target.checked)} onChange={(e) =>
setAgreed(e.target.checked)
}
className="h-4 w-4 text-green-500 bg-gray-700 border-gray-600 rounded focus:ring-green-500" className="h-4 w-4 text-green-500 bg-gray-700 border-gray-600 rounded focus:ring-green-500"
/> />
<span className="ml-2"> <span className="ml-2">
{tGlobal("agreeTo")}{" "} {tGlobal("agreeTo")}{" "}
<Link href="/terms" className="text-green-500 underline"> <Link
href="/terms"
className="text-green-500 underline"
>
{tTerms("title")} {tTerms("title")}
</Link> </Link>
</span> </span>

View File

@@ -31,7 +31,7 @@ export default function PageExpect() {
loop loop
muted muted
autoPlay autoPlay
src="http://file.typeframes.com.cn/create-tiktok-video/en/demo_image.webm" src="https://file.typeframes.com.cn/create-tiktok-video/en/demo_image.webm"
preload="auto" preload="auto"
></video> ></video>
</div> </div>
@@ -42,7 +42,7 @@ export default function PageExpect() {
loop loop
muted muted
autoPlay autoPlay
src="http://file.typeframes.com.cn/music-to-video/cn/demo_image.webm" src="https://file.typeframes.com.cn/music-to-video/cn/demo_image.webm"
preload="auto" preload="auto"
></video> ></video>
</div> </div>