v2.2
This commit is contained in:
20
ecosystem.config.js
Normal file
20
ecosystem.config.js
Normal 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', // 启动前执行构建
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
@@ -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>
|
||||||
|
|||||||
@@ -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",
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user