parent
7b810bda0e
commit
5f112164f2
@ -1,3 +1,3 @@
|
|||||||
# 生产环境使用的变量
|
# 生产环境使用的变量
|
||||||
|
|
||||||
NEXT_PUBLIC_HOST = 'http://39.103.180.196:9012/'
|
NEXT_PUBLIC_HOST = 'http://api.indie.cn:9012'
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
# 测试环境使用的变量
|
|
||||||
|
|
||||||
NEXT_PUBLIC_HOST = 'http://39.103.180.196:9012/'
|
|
@ -1,36 +1,37 @@
|
|||||||
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||||
|
|
||||||
# dependencies
|
# dependencies
|
||||||
/node_modules
|
/node_modules
|
||||||
/.pnp
|
/.pnp
|
||||||
.pnp.js
|
.pnp.js
|
||||||
.yarn/install-state.gz
|
.yarn/install-state.gz
|
||||||
|
|
||||||
# testing
|
# testing
|
||||||
/coverage
|
/coverage
|
||||||
|
|
||||||
# next.js
|
# next.js
|
||||||
/.next/
|
/.next/
|
||||||
/out/
|
/out/
|
||||||
|
|
||||||
# production
|
# production
|
||||||
/build
|
/build
|
||||||
|
|
||||||
# misc
|
# misc
|
||||||
.DS_Store
|
.DS_Store
|
||||||
*.pem
|
*.pem
|
||||||
|
|
||||||
# debug
|
# debug
|
||||||
npm-debug.log*
|
npm-debug.log*
|
||||||
yarn-debug.log*
|
yarn-debug.log*
|
||||||
yarn-error.log*
|
yarn-error.log*
|
||||||
|
|
||||||
# local env files
|
# local env files
|
||||||
.env*.local
|
.env*.local
|
||||||
|
|
||||||
# vercel
|
# vercel
|
||||||
.vercel
|
.vercel
|
||||||
|
|
||||||
# typescript
|
# typescript
|
||||||
*.tsbuildinfo
|
*.tsbuildinfo
|
||||||
next-env.d.ts
|
next-env.d.ts
|
||||||
|
/dist
|
||||||
|
@ -0,0 +1,43 @@
|
|||||||
|
# Install dependencies only when needed
|
||||||
|
FROM node:alpine AS deps
|
||||||
|
# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
|
||||||
|
RUN apk add --no-cache libc6-compat
|
||||||
|
WORKDIR /app
|
||||||
|
COPY package.json package-lock.json ./
|
||||||
|
RUN yarn install --frozen-lockfile --registry=https://registry.npm.taobao.org
|
||||||
|
|
||||||
|
# Rebuild the source code only when needed
|
||||||
|
FROM node:alpine AS builder
|
||||||
|
WORKDIR /app
|
||||||
|
COPY . .
|
||||||
|
COPY --from=deps /app/node_modules ./node_modules
|
||||||
|
RUN yarn build && yarn install --production --ignore-scripts --prefer-offline --registry=https://registry.npm.taobao.org
|
||||||
|
|
||||||
|
# Production image, copy all the files and run next
|
||||||
|
FROM node:alpine AS runner
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
ENV NODE_ENV production
|
||||||
|
|
||||||
|
RUN addgroup -g 1001 -S nodejs
|
||||||
|
RUN adduser -S nextjs -u 1001
|
||||||
|
|
||||||
|
# You only need to copy next.config.js if you are NOT using the default configuration
|
||||||
|
# COPY --from=builder /app/next.config.js ./
|
||||||
|
COPY --from=builder /app/public ./public
|
||||||
|
COPY --from=builder --chown=nextjs:nodejs /app/.next ./.next
|
||||||
|
COPY --from=builder /app/node_modules ./node_modules
|
||||||
|
COPY --from=builder /app/package.json ./package.json
|
||||||
|
|
||||||
|
USER nextjs
|
||||||
|
|
||||||
|
EXPOSE 3000
|
||||||
|
|
||||||
|
ENV PORT 3000
|
||||||
|
|
||||||
|
# Next.js collects completely anonymous telemetry data about general usage.
|
||||||
|
# Learn more here: https://nextjs.org/telemetry
|
||||||
|
# Uncomment the following line in case you want to disable telemetry.
|
||||||
|
# ENV NEXT_TELEMETRY_DISABLED 1
|
||||||
|
|
||||||
|
CMD ["node_modules/.bin/next", "start"]
|
@ -1,22 +1,28 @@
|
|||||||
/** @type {import('next').NextConfig} */
|
/** @type {import('next').NextConfig} */
|
||||||
const nextConfig = {
|
const nextConfig = {
|
||||||
|
// output: 'export',
|
||||||
|
distDir: 'dist',
|
||||||
async rewrites() {
|
async rewrites() {
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
source: '/queyueapi/:path*',
|
source: '/queyueapi/:path*',
|
||||||
destination: `${process.env.NEXT_PUBLIC_HOST}/:path*`,
|
destination: `http://api.indie.cn:9012/:path*`,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
},
|
},
|
||||||
redirects: async () => {
|
redirects: async () => {
|
||||||
return [
|
return [
|
||||||
{
|
// {
|
||||||
source: '/',
|
// source: '/',
|
||||||
destination: '/vol/list/all',
|
// destination: '/download',
|
||||||
permanent: true,
|
// permanent: false,
|
||||||
},
|
// },
|
||||||
];
|
];
|
||||||
},
|
},
|
||||||
|
eslint: {
|
||||||
|
ignoreDuringBuilds: true,
|
||||||
|
ignoreBuildErrors: true,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export default nextConfig;
|
export default nextConfig;
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
export default function Loading() {
|
export default function Loading() {
|
||||||
return <div>Loading...</div>;
|
return (
|
||||||
|
<div className="w-[100vw] h-[100vh] flex justify-center items-center">
|
||||||
|
<div>loading...</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,68 @@
|
|||||||
export default function Home() {
|
'use client';
|
||||||
return <main></main>;
|
|
||||||
}
|
import Image from 'next/image';
|
||||||
|
|
||||||
|
import DownloadCard from '@/app/download/components/DownloadCard';
|
||||||
|
|
||||||
|
const qrCodeList: Array<DownloadQrcodeCard> = [
|
||||||
|
{
|
||||||
|
platform: 'APP Store',
|
||||||
|
iconUrl: '/img/download/logo_apple.svg',
|
||||||
|
qrCode: '',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
platform: 'Android',
|
||||||
|
iconUrl: '/img/download/logo_android.svg',
|
||||||
|
qrCode: '/img/download/qrcode_android.svg',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
export default function Download() {
|
||||||
|
return (
|
||||||
|
<main className="w-full flex flex-col items-center pb-[104px] font-normal">
|
||||||
|
{/* 首屏 */}
|
||||||
|
<div className="relative w-full h-min-[1000px] h-screen flex flex-col items-center pt-[30vh] bg-[url(/img/download/background_1.png)] bg-center bg-cover bg-no-repeat text-[#fff]">
|
||||||
|
{/* slogan */}
|
||||||
|
<div className="flex flex-col items-center mb-[35px]">
|
||||||
|
<Image width={410} height={50} src="/img/download/slogan_line1.svg" alt="为独立音乐,雀跃" />
|
||||||
|
<Image className="mt-[26px] mb-[26px]" width={9} height={24} src="/img/download/slogan_line2.svg" alt="/" />
|
||||||
|
<Image width={143} height={24} src="/img/download/slogan_line3.svg" alt="独立 不独于世" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* APP二维码 */}
|
||||||
|
<div className="flex flex-row">
|
||||||
|
{qrCodeList.map(({ platform, iconUrl, qrCode }) => (
|
||||||
|
<DownloadCard key={platform} platform={platform} iconUrl={iconUrl} qrCode={qrCode} />
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 第二屏 */}
|
||||||
|
<div className="relative w-full h-[1000px] h-screen pl-[45.7vw] flex flex-col bg-[url(/img/download/background_2.png)] bg-center bg-cover bg-no-repeat">
|
||||||
|
{/* 花体字-“我们回来了” */}
|
||||||
|
<Image className="mt-[16.67vh] mb-[50px]" width={306} height={86} src="/img/download/back.svg" alt="back" />
|
||||||
|
|
||||||
|
{/* 诗歌 */}
|
||||||
|
<p className="pl-[15px] text-[#000] text-[15px] leading-[28px] text-left">
|
||||||
|
音乐是一种态度
|
||||||
|
<br />
|
||||||
|
不论是创作者还是聆听者
|
||||||
|
<br />
|
||||||
|
它流经心灵
|
||||||
|
<br />
|
||||||
|
纵然期待影响现实的力量是种奢望
|
||||||
|
<br />
|
||||||
|
如果刚巧有些声音
|
||||||
|
<br />
|
||||||
|
会叫你记得一段往事
|
||||||
|
<br />
|
||||||
|
伤痛或是甜蜜
|
||||||
|
<br />
|
||||||
|
那记忆便有了厚厚的壳
|
||||||
|
<br />
|
||||||
|
恒久的 温暖有如初生
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
@ -1,34 +1,38 @@
|
|||||||
export default function Footer() {
|
export default function Footer() {
|
||||||
const agreementList = [
|
const agreementList = [
|
||||||
{
|
{
|
||||||
name: '服务条款',
|
name: '知识产权说明',
|
||||||
url: '/',
|
url: 'http://cdn.indie.cn/html/agreement/intellectualPropertyDescription.html',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: '版权声明',
|
name: '注册协议',
|
||||||
url: '/',
|
url: 'http://cdn.indie.cn/html/agreement/registrationAgreement.html',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: '许可协议',
|
name: '隐私政策',
|
||||||
url: '/',
|
url: 'http://cdn.indie.cn/html/agreement/privacyPolicy.html',
|
||||||
},
|
},
|
||||||
];
|
{
|
||||||
|
name: '投诉指引',
|
||||||
return (
|
url: 'http://cdn.indie.cn/html/agreement/complaintGuidelines.html',
|
||||||
<footer className="absolute bottom-[40px] flex flex-col items-center w-full justify-center text-center text-[12px] leading-[16.8px]">
|
},
|
||||||
<div className="w-[1200px] mx-auto">
|
];
|
||||||
<p className="mt-[18px] mb-[12px] text-[rgba(0,0,0,0.4)]">
|
|
||||||
粤ICP备2024190175号-1 深圳雀乐文化科技有限责任公司 Shenzhen QueYue Culture Technology Co., Ltd.
|
return (
|
||||||
</p>
|
<footer className="absolute bottom-[40px] flex flex-col items-center w-full justify-center text-center text-[12px] leading-[16.8px]">
|
||||||
|
<div className="w-[1200px] mx-auto">
|
||||||
<p className="text-[rgba(0,0,0,0.7)]">
|
<p className="mt-[18px] mb-[12px] text-[rgba(0,0,0,0.4)]">
|
||||||
{agreementList.map(({ name, url }) => (
|
粤ICP备2024190175号-1 深圳雀乐文化科技有限责任公司 Shenzhen QueYue Culture Technology Co., Ltd.
|
||||||
<a className="mx-[4px]" href={url} key={name}>
|
</p>
|
||||||
{name}
|
|
||||||
</a>
|
<p className="text-[rgba(0,0,0,0.7)]">
|
||||||
))}
|
{agreementList.map(({ name, url }) => (
|
||||||
</p>
|
<a className="mx-[4px] hover:text-theme" href={url} key={name} target="_blank">
|
||||||
</div>
|
{name}
|
||||||
</footer>
|
</a>
|
||||||
);
|
))}
|
||||||
}
|
</p>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
Loading…
Reference in new issue