feat: 音乐人入驻

feature/artists
fadeaway 6 months ago
parent 7ada70eca2
commit 51f03e76f6

@ -6,10 +6,22 @@ const nextConfig = {
source: '/queyueapi/:path*',
destination: `${process.env.NEXT_PUBLIC_HOST}/:path*`,
},
{
source: '/luoo-music/:path*',
destination: 'http://39.103.180.196:9012/luoo-music/:path*',
},
{
source: '/user/artist/:path*',
destination: 'http://39.103.180.196:9012/user/artist/:path*',
},
{
source: '/',
destination: '/music/all',
},
{
source: '/artists-settle-in',
destination: '/artists-settle-in/home',
},
];
},
reactStrictMode: false,

120
package-lock.json generated

@ -10294,6 +10294,126 @@
"optional": true
}
}
},
"node_modules/@next/swc-darwin-arm64": {
"version": "14.1.3",
"resolved": "https://registry.npmmirror.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.3.tgz",
"integrity": "sha512-LALu0yIBPRiG9ANrD5ncB3pjpO0Gli9ZLhxdOu6ZUNf3x1r3ea1rd9Q+4xxUkGrUXLqKVK9/lDkpYIJaCJ6AHQ==",
"cpu": [
"arm64"
],
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@next/swc-darwin-x64": {
"version": "14.1.3",
"resolved": "https://registry.npmmirror.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.3.tgz",
"integrity": "sha512-E/9WQeXxkqw2dfcn5UcjApFgUq73jqNKaE5bysDm58hEUdUGedVrnRhblhJM7HbCZNhtVl0j+6TXsK0PuzXTCg==",
"cpu": [
"x64"
],
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@next/swc-linux-arm64-gnu": {
"version": "14.1.3",
"resolved": "https://registry.npmmirror.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.3.tgz",
"integrity": "sha512-USArX9B+3rZSXYLFvgy0NVWQgqh6LHWDmMt38O4lmiJNQcwazeI6xRvSsliDLKt+78KChVacNiwvOMbl6g6BBw==",
"cpu": [
"arm64"
],
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@next/swc-linux-arm64-musl": {
"version": "14.1.3",
"resolved": "https://registry.npmmirror.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.3.tgz",
"integrity": "sha512-esk1RkRBLSIEp1qaQXv1+s6ZdYzuVCnDAZySpa62iFTMGTisCyNQmqyCTL9P+cLJ4N9FKCI3ojtSfsyPHJDQNw==",
"cpu": [
"arm64"
],
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@next/swc-linux-x64-gnu": {
"version": "14.1.3",
"resolved": "https://registry.npmmirror.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.3.tgz",
"integrity": "sha512-8uOgRlYEYiKo0L8YGeS+3TudHVDWDjPVDUcST+z+dUzgBbTEwSSIaSgF/vkcC1T/iwl4QX9iuUyUdQEl0Kxalg==",
"cpu": [
"x64"
],
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@next/swc-linux-x64-musl": {
"version": "14.1.3",
"resolved": "https://registry.npmmirror.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.3.tgz",
"integrity": "sha512-DX2zqz05ziElLoxskgHasaJBREC5Y9TJcbR2LYqu4r7naff25B4iXkfXWfcp69uD75/0URmmoSgT8JclJtrBoQ==",
"cpu": [
"x64"
],
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@next/swc-win32-arm64-msvc": {
"version": "14.1.3",
"resolved": "https://registry.npmmirror.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.3.tgz",
"integrity": "sha512-HjssFsCdsD4GHstXSQxsi2l70F/5FsRTRQp8xNgmQs15SxUfUJRvSI9qKny/jLkY3gLgiCR3+6A7wzzK0DBlfA==",
"cpu": [
"arm64"
],
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@next/swc-win32-ia32-msvc": {
"version": "14.1.3",
"resolved": "https://registry.npmmirror.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.3.tgz",
"integrity": "sha512-DRuxD5axfDM1/Ue4VahwSxl1O5rn61hX8/sF0HY8y0iCbpqdxw3rB3QasdHn/LJ6Wb2y5DoWzXcz3L1Cr+Thrw==",
"cpu": [
"ia32"
],
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">= 10"
}
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 436 KiB

@ -0,0 +1,4 @@
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="30" height="30" rx="5.4" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M14.7591 9.39738C14.7591 8.01095 15.5639 6.84589 16.828 6.51117C17.0659 6.44816 17.3147 6.41469 17.5718 6.41469C18.6312 6.41469 19.5547 6.98576 20.0772 7.83445C20.0928 7.85969 20.8098 8.9294 20.8098 10.5252C20.8098 10.9752 20.7537 11.4123 20.649 11.829C20.6449 11.849 20.6428 11.8696 20.6428 11.8911C20.6428 12.0619 20.7794 12.2005 20.9479 12.2005C21.0415 12.2005 21.125 12.1579 21.1807 12.0901C21.1883 12.082 21.1949 12.0733 21.201 12.064C21.7585 11.3241 22.0894 10.4 22.0894 9.39738C22.0894 6.96881 20.148 5.00006 17.7534 5.00006C17.7326 5.00006 17.7119 5.00006 17.6912 5.00105C17.1493 5.00829 16.6311 5.11679 16.1546 5.30841C14.5509 5.95353 13.4174 7.5403 13.4174 9.39738C13.4174 11.4325 14.9986 13.5443 16.1106 14.6613C16.1683 14.7188 16.226 14.7758 16.2851 14.8328C16.5523 15.0903 16.8275 15.3304 17.1088 15.5531C17.1964 15.6224 17.2849 15.6901 17.3735 15.7563C17.4954 15.8487 17.5738 15.9959 17.5738 16.1617C17.5738 16.4775 17.2963 16.6947 16.995 16.6614C15.8495 16.4988 14.7764 16.1068 13.8222 15.5321C13.6623 15.4356 13.5055 15.3346 13.3527 15.2273H13.3522C12.3737 14.5475 11.5404 13.6675 10.9115 12.6453C10.1131 11.3482 9.64208 9.82275 9.61573 8.18696C9.61524 8.13922 9.61476 8.09098 9.61476 8.04281C9.61476 7.48658 9.66635 6.94216 9.76453 6.41469C8.92713 7.45015 8.32 8.68469 8.02406 10.0377C7.89045 10.6473 7.82014 11.2815 7.82014 11.9316C7.82014 13.4879 8.22286 14.9487 8.92817 16.2125C7.99369 15.5449 7.1963 14.6927 6.5882 13.7075C6.36451 13.3458 6.16621 12.9665 5.99674 12.5715C5.96686 12.865 5.95167 13.1631 5.95167 13.4648C5.95167 14.6013 6.16669 15.6871 6.55727 16.6825C6.92311 17.6138 7.44273 18.4656 8.08425 19.2065C7.81355 19.1736 7.53932 19.1536 7.26162 19.147C7.19228 19.1454 7.12294 19.1444 7.05367 19.1444C6.34579 19.1444 5.65775 19.2311 5 19.3953C6.56844 19.8166 7.96027 20.6776 9.04098 21.8397C10.5862 23.4832 12.8518 24.8001 15.8834 24.8001C18.7134 24.8001 23.6 23.0676 23.6 19.2306C23.6 17.7892 22.885 16.2265 20.8163 15.2836C17.3792 13.7171 14.7591 11.5216 14.7591 9.39738Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

@ -0,0 +1,4 @@
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="30" height="30" rx="5.4" fill="black" fill-opacity="0.95"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M14.7591 9.39738C14.7591 8.01095 15.5639 6.84589 16.828 6.51117C17.0659 6.44816 17.3147 6.41469 17.5718 6.41469C18.6312 6.41469 19.5547 6.98576 20.0772 7.83445C20.0928 7.85969 20.8098 8.9294 20.8098 10.5252C20.8098 10.9752 20.7537 11.4123 20.649 11.829C20.6449 11.849 20.6428 11.8696 20.6428 11.8911C20.6428 12.0619 20.7794 12.2005 20.9479 12.2005C21.0415 12.2005 21.125 12.1579 21.1807 12.0901C21.1883 12.082 21.1949 12.0733 21.201 12.064C21.7585 11.3241 22.0894 10.4 22.0894 9.39738C22.0894 6.96881 20.148 5.00006 17.7534 5.00006C17.7326 5.00006 17.7119 5.00006 17.6912 5.00105C17.1493 5.00829 16.6311 5.11679 16.1546 5.30841C14.5509 5.95353 13.4174 7.5403 13.4174 9.39738C13.4174 11.4325 14.9986 13.5443 16.1106 14.6613C16.1683 14.7188 16.226 14.7758 16.2851 14.8328C16.5523 15.0903 16.8275 15.3304 17.1088 15.5531C17.1964 15.6224 17.2849 15.6901 17.3735 15.7563C17.4954 15.8487 17.5738 15.9959 17.5738 16.1617C17.5738 16.4775 17.2963 16.6947 16.995 16.6614C15.8495 16.4988 14.7764 16.1068 13.8222 15.5321C13.6623 15.4356 13.5055 15.3346 13.3527 15.2273H13.3522C12.3737 14.5475 11.5404 13.6675 10.9115 12.6453C10.1131 11.3482 9.64208 9.82275 9.61573 8.18696C9.61524 8.13922 9.61476 8.09098 9.61476 8.04281C9.61476 7.48658 9.66635 6.94216 9.76453 6.41469C8.92713 7.45015 8.32 8.68469 8.02406 10.0377C7.89045 10.6473 7.82014 11.2815 7.82014 11.9316C7.82014 13.4879 8.22286 14.9487 8.92817 16.2125C7.99369 15.5449 7.1963 14.6927 6.5882 13.7075C6.36451 13.3458 6.16621 12.9665 5.99674 12.5715C5.96686 12.865 5.95167 13.1631 5.95167 13.4648C5.95167 14.6013 6.16669 15.6871 6.55727 16.6825C6.92311 17.6138 7.44273 18.4656 8.08425 19.2065C7.81355 19.1736 7.53932 19.1536 7.26162 19.147C7.19228 19.1454 7.12294 19.1444 7.05367 19.1444C6.34579 19.1444 5.65775 19.2311 5 19.3953C6.56844 19.8166 7.96027 20.6776 9.04098 21.8397C10.5862 23.4832 12.8518 24.8001 15.8834 24.8001C18.7134 24.8001 23.6 23.0676 23.6 19.2306C23.6 17.7892 22.885 16.2265 20.8163 15.2836C17.3792 13.7171 14.7591 11.5216 14.7591 9.39738Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 687 B

@ -0,0 +1,54 @@
.wrap {
min-height: 100vh;
background-color: #000;
background-image: url(/img/artists-settle-in/home_bg.jpg);
background-position: center;
background-size: auto 100%;
background-repeat: no-repeat;
}
.wrap .cont {
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
}
.wrap .cont .contBox {
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
margin-top: -78px;
}
.wrap .cont .contBox .sloganTitle {
height: 28px;
line-height: 28px;
font-size: 20px;
margin-bottom: 8px;
color: #fff;
font-weight: 400;
}
.wrap .cont .contBox .slogan {
height: 67.2px;
line-height: 67.2px;
font-family: PingFang SC;
font-weight: 600;
font-size: 48px;
margin-top: 8px;
margin-bottom: 38px;
color: #fff;
}
.wrap .cont .contBox .btn {
display: flex;
align-items: center;
justify-content: center;
width: 222px;
height: 59px;
border-radius: 38px;
font-weight: 500;
font-size: 18px;
}

@ -0,0 +1,38 @@
'use client';
import React from 'react';
import { Layout, Typography, Button } from '@arco-design/web-react';
import { useRouter } from 'next/navigation';
import Header from '@/components/ArtistsSettleIn/Header';
import styles from './home.module.css';
const Content = Layout.Content;
const { Title, Paragraph } = Typography;
function Home() {
const router = useRouter();
const handleClick = () => {
router.push('/artists-settle-in/sign-up');
};
return (
<Layout className={styles.wrap}>
<Header mode="dark" />
<Content className={styles.cont}>
<section className={styles.contBox}>
<Paragraph className={styles.sloganTitle}></Paragraph>
<Title className={styles.slogan}> </Title>
<Button shape="round" type="primary" size="large" className={styles.btn} onClick={handleClick}>
</Button>
</section>
</Content>
</Layout>
);
}
export default Home;

@ -0,0 +1,16 @@
.formWrap {
width: 800px;
background-color: #fff;
border-radius: 16px;
padding-top: 39px;
padding-bottom: 38px;
padding-left: 30px;
padding-right: 47px;
margin-bottom: 54px;
box-sizing: border-box;
}
.formWrap .submitWrap {
text-align: center;
margin-top: 20px;
}

@ -0,0 +1,112 @@
'use client';
import { Radio, Message, Form, Button } from '@arco-design/web-react';
import {
FormArtistName,
FormArtistAvatar,
FormHomepageBackground,
FormBackendScreenshot,
FormAddress,
FormStyle,
FormType,
FormDescription,
FormUserName,
FormPassword,
} from '@/components/ArtistsSettleIn/FormArtistInfo';
import styles from './index.module.css';
import { apiArtistsSignUp } from '@/services';
const { useForm, useWatch, Item: FormItem } = Form;
function StepArtistInfo() {
const [form] = useForm();
const agree = useWatch('agree', form);
const handleSubmit = () => {
form
.validate()
.then(async (values) => {
if (!agree) {
Message.warning('请阅读并同意《雀乐音乐用户服务协议》');
return;
}
const { address, avatar, backgroundImage, description, nickName, password, screenshot, style, type, userName } =
values;
const oParam = {
address,
avatar: avatar?.[0]?.response?.data?.fullUrl,
backgroundImage: backgroundImage?.[0]?.response?.data?.fullUrl,
// bandUserId: '',
description,
nickName,
password,
screenshot: screenshot?.[0]?.response?.data?.fullUrl,
style,
type,
userName,
};
const res = await apiArtistsSignUp(oParam);
if (res.code === 200) {
// setTotal(res.data.total);
// setsongList(res.data.rows);
Message.success('申请成功');
}
})
.catch((err) => {
console.log(err);
});
};
return (
<Form
form={form}
className={styles.formWrap}
autoComplete="off"
labelCol={{ flex: '103px' }}
wrapperCol={{ flex: '468px' }}
// onValuesChange={(v, vs) => {
// console.log(v, vs);
// }}
// onSubmit={handleSubmit}
>
{/* 歌手名 */}
<FormArtistName />
{/* 艺人头像 */}
<FormArtistAvatar />
{/* 主页背景 */}
<FormHomepageBackground />
{/* 后台截图 */}
<FormBackendScreenshot />
{/* 所在地区 */}
<FormAddress />
{/* 流派/风格 */}
<FormStyle />
{/* 类型 */}
<FormType />
{/* 艺人简介 */}
<FormDescription />
{/* 后台登录名 */}
<FormUserName />
{/* 登录密码 */}
<FormPassword />
<FormItem label=" " field="agree">
<Radio>
<span className={styles.policyName}></span>
<span className={styles.policyName}></span>
</Radio>
</FormItem>
<FormItem wrapperCol={{ span: 24 }} className={styles.submitWrap}>
<Button type="primary" onClick={handleSubmit}>
</Button>
</FormItem>
</Form>
);
}
export default StepArtistInfo;

@ -0,0 +1,39 @@
.policy {
width: 800px;
background-color: #fff;
border-radius: 16px;
padding-top: 39px;
padding-bottom: 38px;
box-sizing: border-box;
}
.policy .policyTitle {
font-family: PingFang SC;
font-size: 17px;
font-weight: 600;
line-height: 20px;
padding-left: 34px;
flex-shrink: 0;
}
.policy .policyCont {
padding-left: 34px;
padding-right: 68px;
color: #4e5969;
font-family: PingFang SC;
font-size: 12px;
font-weight: 400;
line-height: 20px;
}
.nextStep {
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 30px;
}
.nextStep .policyName {
font-weight: 500;
}

@ -0,0 +1,65 @@
'use client';
import React, { memo, useState } from 'react';
import { Typography, Button, Radio, Message } from '@arco-design/web-react';
import styles from './index.module.css';
interface StepPolicyProps {
onNext: () => void;
}
const { Title } = Typography;
function StepPolicy({ onNext }: StepPolicyProps) {
const [agree, setAgree] = useState(false);
const handleNext = () => {
if (!agree) {
Message.warning('请阅读并同意《用户服务协议》');
} else {
onNext?.();
}
};
return (
<>
<article className={styles.policy}>
<Title className={styles.policyTitle} heading={3}>
</Title>
<div className={styles.policyCont}>
使线使
<br />
<br />
<br />
/使
<br />
<br />
使
<br />
1
<br />
2使
<br />
3使
<br />
4使
</div>
</article>
<div className={styles.nextStep}>
<Radio checked={agree} onChange={(checked: boolean) => setAgree(checked)}>
<span className={styles.policyName}></span>
</Radio>
<Button type="primary" onClick={handleNext}>
</Button>
</div>
</>
);
}
export default memo(StepPolicy);

@ -0,0 +1,35 @@
'use client';
import React, { useCallback, useState } from 'react';
import { Layout, Typography } from '@arco-design/web-react';
import Footer from '@/components/ArtistsSettleIn/Footer';
import Header from '@/components/ArtistsSettleIn/Header';
import StepArtistInfo from './components/StepArtistInfo';
import StepPolicy from './components/StepPolicy';
import styles from './sign-up.module.css';
const Content = Layout.Content;
const { Title } = Typography;
function SignUp() {
const [step, setStep] = useState('1');
const handle2Step2 = useCallback(() => setStep('2'), []);
return (
<Layout className={styles.wrap}>
<Header />
<Content className={styles.cont}>
<section className={styles.contBox}>
<Title className={styles.welcome}></Title>
{step === '1' && <StepPolicy onNext={handle2Step2} />}
{step === '2' && <StepArtistInfo />}
</section>
</Content>
<Footer />
</Layout>
);
}
export default SignUp;

@ -0,0 +1,32 @@
.wrap {
min-height: 100vh;
color: #1d2129;
}
.wrap .cont {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
background-color: #f2f3f7;
}
.wrap .cont .contBox {
display: flex;
align-items: center;
flex-direction: column;
width: 800px;
box-sizing: border-box;
flex: 1;
padding-top: 33px;
padding-bottom: 40px;
}
.wrap .cont .contBox .welcome {
width: 100%;
font-family: Alibaba PuHuiTi 2;
font-size: 24px;
font-weight: 700;
line-height: 33.6px;
margin-bottom: 20px;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

@ -0,0 +1,56 @@
@import '@unocss/reset/tailwind.css';
@unocss all;
@font-face {
font-family: 'D-DINExp';
src: url('/fonts/D-DINExp.otf') format('opentype');
}
:root {
--body-bg-color: #fff;
--primary-color: #c43737;
}
@media (prefers-color-scheme: dark) {
:root {
}
}
html,
body {
min-height: 100%;
}
body {
background: var(--body-bg-color);
font-family:
'D-DINExp',
-apple-system,
BlinkMacSystemFont,
'PingFang SC',
'Helvetica Neue',
STHeiti,
'Microsoft Yahei',
Tahoma,
Simsun,
sans-serif;
/* padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom); */
}
input {
outline: none;
}
input::placeholder {
color: [rgba(0, 0, 0, 0.7)];
}
textarea {
outline: none;
}
@layer utilities {
.text-balance {
text-wrap: balance;
}
}

@ -0,0 +1,42 @@
import { Metadata, Viewport } from 'next';
import { Toaster } from '@/components/ui/toaster';
import { Mounted, Dialog } from '@/components';
import '@arco-design/web-react/dist/css/arco.min.css';
import './globals.css';
export const metadata: Metadata = {
title: {
template: '%s - 雀乐音乐人',
default: '雀乐音乐人',
},
description:
'雀乐是由一群喜欢并热爱独立音乐的人共同创建的,我们致力于传播来自世界各地的独立音乐。我们秉着音乐里独立自主的精神表达内核,希望把雀乐建设成为泛华语地区最好的独立音乐传播平台。',
icons: {
icon: '/favicon.ico',
},
};
export const viewport: Viewport = {
width: 'device-width',
initialScale: 1,
maximumScale: 1,
minimumScale: 1,
userScalable: false,
viewportFit: 'cover',
};
export default function ArtistsSettleInLayout({ children }: Readonly<{ children: React.ReactNode }>) {
return (
<html lang="zn-ch">
<body>
{children}
<Toaster />
<Dialog />
<Mounted />
</body>
</html>
);
}

@ -0,0 +1,7 @@
export default function Loading() {
return (
<div className="w-[100vw] h-[100vh] flex justify-center items-center">
<div></div>
</div>
);
}

@ -0,0 +1,58 @@
.footer {
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
padding: 28px 28px 33px;
background: #101011;
color: #ffffff99;
/* :global(.arco-typography) {
margin-bottom: 0;
}
:global(.arco-link),
:global(.arco-typography) {
color: #ffffff99;
font-size: 12px;
font-weight: 400;
line-height: 16.8px;
text-align: center;
}
:global(.arco-link) {
&:hover {
color: rgba(#ffffff99, 0.8);
}
} */
}
.mb0 {
margin-bottom: 0 !important;
}
.footerItem {
color: #ffffff99;
font-size: 12px;
font-weight: 400;
line-height: 16.8px;
text-align: center;
}
.footerItemLink:hover {
color: rgba(255, 255, 249, 0.8);
}
.nav {
display: flex;
align-items: center;
justify-content: center;
}
.splitLine {
margin-top: -1px;
}
.msg {
margin-top: 4px;
}

@ -0,0 +1,58 @@
import React, { memo } from 'react';
import { Layout, Typography, Space, Link } from '@arco-design/web-react';
import { FooterProps } from '@arco-design/web-react/es/Layout/interface';
import cs from 'classnames';
import styles from './index.module.css';
const LayoutFooter = Layout.Footer;
const { Paragraph, Text } = Typography;
function Footer(props: FooterProps = {}) {
const { className, ...restProps } = props;
return (
<LayoutFooter className={cs(styles.footer, className)} {...restProps}>
<Paragraph className={cs(styles.nav, styles.mb0, styles.footerItem)}>
<Link
hoverable={false}
href="https://www.indie.cn/"
target="_blank"
className={cs(styles.footerItem, styles.footerItemLink)}
>
</Link>
<span className={styles.splitLine}>&nbsp;&nbsp;|&nbsp;&nbsp;</span>
<Link hoverable={false} className={cs(styles.footerItem, styles.footerItemLink)}>
</Link>
<span className={styles.splitLine}>&nbsp;&nbsp;|&nbsp;&nbsp;</span>
<Link hoverable={false} className={cs(styles.footerItem, styles.footerItemLink)}>
</Link>
</Paragraph>
<Space className={styles.msg}>
<Link
hoverable={false}
href="https://beian.miit.gov.cn/#/Integrated/index"
target="_blank"
className={cs(styles.footerItem, styles.footerItemLink)}
>
ICP2024190175-1
</Link>
<Link
hoverable={false}
href="https://beian.mps.gov.cn/#/query/webSearch"
target="_blank"
className={cs(styles.footerItem, styles.footerItemLink)}
>
44030002002777
</Link>
<Text className={styles.footerItem}></Text>
<Text className={styles.footerItem}>Shenzhen QueYue Culture Technology Co., Ltd.</Text>
</Space>
</LayoutFooter>
);
}
export default memo(Footer);

@ -0,0 +1,20 @@
'use client';
import React from 'react';
import { Form, Select } from '@arco-design/web-react';
// 所在地区
const FormAddress = () => {
const options = [
{ label: '大陆', value: '大陆' },
{ label: '港澳台', value: '港澳台' },
{ label: '海外', value: '海外' },
];
return (
<Form.Item label="所在地区" field="address" rules={[{ required: true, message: '所在地区是必填项' }]}>
<Select placeholder="请选择所在地区" options={options} />
</Form.Item>
);
};
export default FormAddress;

@ -0,0 +1,19 @@
'use client';
import React from 'react';
import UploadForm from './UploadForm';
// 艺人头像
const FormArtistAvatar = () => {
return (
<UploadForm
label="艺人头像"
field="avatar"
rules={[{ required: true, message: '艺人头像是必填项' }]}
pic="/img/artists-settle-in/avatar.png"
tip="上传您的头像,作为"
/>
);
};
export default FormArtistAvatar;

@ -0,0 +1,24 @@
'use client';
import React from 'react';
import { Form, Input } from '@arco-design/web-react';
import styles from './style/FormArtistName.module.css';
// 歌手名
const FormArtistName = () => {
return (
<Form.Item
className={styles.artistNameWrap}
label="Hi"
field="nickName"
labelCol={{ flex: '55px' }}
wrapperCol={{ flex: 1 }}
rules={[{ required: true, message: '歌手名是必填项' }]}
>
<Input className={styles.artistNameInp} placeholder="请输入您的歌手名" />
</Form.Item>
);
};
export default FormArtistName;

@ -0,0 +1,18 @@
'use client';
import React from 'react';
import UploadForm from './UploadForm';
// 后台截图
const FormBackendScreenshot = () => {
return (
<UploadForm
label="后台截图"
field="screenshot"
rules={[{ required: true, message: '后台截图是必填项' }]}
tip="提供一个其它平台音乐人管理后台实时截图"
/>
);
};
export default FormBackendScreenshot;

@ -0,0 +1,22 @@
'use client';
import React from 'react';
import { Form, Input } from '@arco-design/web-react';
const TextArea = Input.TextArea;
// 艺人简介
const FormDescription = () => {
return (
<Form.Item label="艺人简介" field="description" rules={[{ required: true, message: '艺人简介是必填项' }]}>
<TextArea
placeholder="请控制在202000字可以按照以下形式书写&#10;个人信息XXX&#10;代表作品XXX&#10;从艺历程xxx&#10;…"
minLength={20}
maxLength={2000}
style={{ minHeight: 158 }}
/>
</Form.Item>
);
};
export default FormDescription;

@ -0,0 +1,11 @@
'use client';
import React from 'react';
import UploadForm from './UploadForm';
// 主页背景
const FormHomepageBackground = () => {
return <UploadForm label="主页背景" field="backgroundImage" tip="上传您的主页背景,会在雀乐 APP 艺人主页展示" />;
};
export default FormHomepageBackground;

@ -0,0 +1,17 @@
'use client';
import React from 'react';
import { Form, Input } from '@arco-design/web-react';
const InputPassword = Input.Password;
// 登录密码
const FormPassword = () => {
return (
<Form.Item label="登录密码" field="password" rules={[{ required: true, message: '登录密码是必填项' }]}>
<InputPassword placeholder="请输入登录密码" minLength={4} maxLength={16} />
</Form.Item>
);
};
export default FormPassword;

@ -0,0 +1,19 @@
'use client';
import React from 'react';
import { Form, Select } from '@arco-design/web-react';
// 流派/风格
const FormStyle = () => {
const options = [
{ label: '爵士 Jazz', value: 'Jazz' },
{ label: '摇滚', value: 'Rock' },
];
return (
<Form.Item label="流派/风格" field="style" rules={[{ required: true, message: '流派/风格是必填项' }]}>
<Select placeholder="请选择流派/风格" options={options} />
</Form.Item>
);
};
export default FormStyle;

@ -0,0 +1,19 @@
'use client';
import React from 'react';
import { Form, Select } from '@arco-design/web-react';
// 类型
const FormType = () => {
const options = [
{ label: '个人', value: 0 },
{ label: '团体', value: 1 },
];
return (
<Form.Item label="类型" field="type" rules={[{ required: true, message: '类型是必填项' }]}>
<Select placeholder="请选择类型" options={options} />
</Form.Item>
);
};
export default FormType;

@ -0,0 +1,15 @@
'use client';
import React from 'react';
import { Form, Input } from '@arco-design/web-react';
// 后台登录名
const FormUserName = () => {
return (
<Form.Item label="后台登录名" field="userName" rules={[{ required: true, message: '后台登录名是必填项' }]}>
<Input placeholder="5位数以上字母+数字组合" minLength={5} maxLength={32} />
</Form.Item>
);
};
export default FormUserName;

@ -0,0 +1,42 @@
'use client';
import React from 'react';
import { Form, Upload } from '@arco-design/web-react';
import Image from 'next/image';
import styles from './style/UploadForm.module.css';
interface UploadFormProps {
label: string;
field: string;
rules?: Record<string, boolean | string>[];
pic?: string;
tip: string;
subTip?: string;
}
// 上传图片组件
const UploadForm = (props: UploadFormProps) => {
const { label, field, rules, pic, tip, subTip } = props;
return (
<Form.Item label={label} field={field} rules={rules} className={styles.uploadForm}>
<Upload
imagePreview
limit={1}
// listType="picture-card"
action="/luoo-music/cms/song/upload/song"
className={styles.uploadEle}
>
<div className={styles.uploadTrigger}>
<Image width={64} height={64} src={pic || '/img/artists-settle-in/upload_default_pic.png'} alt="pic" />
<div className={styles.infoWrap}>
<div className={styles.tip}>{tip || '上传'}</div>
<div className={styles.subTip}>{subTip || '支持格式:.jpg .png文件大小不能超过5MB'}</div>
</div>
</div>
</Upload>
</Form.Item>
);
};
export default UploadForm;

@ -0,0 +1,23 @@
import FormAddress from './FormAddress';
import FormArtistAvatar from './FormArtistAvatar';
import FormArtistName from './FormArtistName';
import FormBackendScreenshot from './FormBackendScreenshot';
import FormDescription from './FormDescription';
import FormHomepageBackground from './FormHomepageBackground';
import FormPassword from './FormPassword';
import FormStyle from './FormStyle';
import FormType from './FormType';
import FormUserName from './FormUserName';
export {
FormArtistName,
FormArtistAvatar,
FormHomepageBackground,
FormBackendScreenshot,
FormAddress,
FormStyle,
FormType,
FormDescription,
FormUserName,
FormPassword,
};

@ -0,0 +1,65 @@
.artistNameWrap {
border-bottom: 1px solid #ededed;
padding-bottom: 16px;
box-sizing: border-box;
/* &:global(.arco-form-item-error) {
padding-bottom: 0;
}
&:global(.arco-form-item) {
margin-bottom: 53px;
} */
/* 不展示必填符号 */
/* :global(.arco-form-item-symbol) {
display: none;
} */
/* label样式 */
/* :global(.arco-form-label-item > label) {
font-family: PingFang SC;
font-size: 24px;
font-weight: 600;
color: #4e5969;
} */
}
/* .artistNameWrap .arco-form-item-error {
padding-bottom: 0 !important;
} */
/* .artistNameWrap .arco-form-item {
margin-bottom: 53px !important;
} */
/* 不展示必填符号 */
/* .artistNameWrap .arco-form-item-symbol {
display: none !important;
} */
/* label样式 */
/* .artistNameWrap .arco-col.arco-form-label-item > label {
display: inline-flex !important;
align-items: center !important;
font-family: PingFang SC !important;
font-size: 24px !important;
font-weight: 600 !important;
color: #4e5969 !important;
} */
.artistNameWrap .artistNameInp {
padding: 0;
border: none;
font-size: 20px;
font-weight: 600;
color: #4e5969;
background-color: transparent;
}
.artistNameWrap .artistNameInp:placeholder-shown {
color: #c9cdd4;
font-family: PingFang SC;
font-size: 20px;
font-weight: lighter;
}

@ -0,0 +1,43 @@
.uploadForm .uploadEle {
width: 100%;
}
.uploadForm .uploadTrigger {
width: 100%;
background-color: #fff;
color: #1d2129;
border: 1px dashed var(--color-fill-4);
padding: 18px 24px;
box-sizing: border-box;
border-radius: 2px;
display: flex;
align-items: center;
justify-content: center;
}
.uploadForm .uploadTrigger .infoWrap {
flex: 1;
margin-left: 18px;
display: flex;
flex-direction: column;
justify-content: center;
}
.uploadForm .uploadTrigger .infoWrap .tip {
font-family: PingFang SC;
font-size: 14px;
font-weight: 500;
line-height: 22px;
text-align: left;
color: #1d2129;
margin-bottom: 4px;
}
.uploadForm .uploadTrigger .infoWrap .subTip {
font-family: PingFang SC;
font-size: 12px;
font-weight: 400;
line-height: 20px;
text-align: left;
color: #86909c;
}

@ -0,0 +1,76 @@
.header {
display: flex;
align-items: center;
justify-content: center;
padding-left: 20px;
padding-right: 20px;
box-sizing: border-box;
}
.header.light {
background-color: #fff;
}
.header.dark {
/* background-color: #000; */
}
.header .cont {
width: 1200px;
height: 72px;
display: flex;
justify-content: space-between;
align-items: center;
}
.header .brand {
height: 100%;
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
}
.header .brand .brandName {
font-size: 20px;
font-weight: 700;
margin-left: 10px;
}
.header.light .brand .brandName {
color: #333;
}
.header.dark .brand .brandName {
color: #fff;
}
.header .avatar {
height: 100%;
cursor: pointer;
padding-left: 12px;
padding-right: 12px;
margin-right: -12px;
display: flex;
align-items: center;
justify-content: center;
}
.header .avatar .loginText {
font-size: 14px;
margin-right: 9px;
font-size: 14px;
font-weight: 500;
transition: all ease 0.3s;
}
.header.light .avatar .loginText {
color: #1d2129;
}
.header.light .avatar:hover .loginText {
color: rgba(#1d2129, 0.8);
}
.header.dark .avatar .loginText {
color: #fff;
}
.header.dark .avatar:hover .loginText {
color: rgba(255, 255, 255, 0.8);
}

@ -0,0 +1,42 @@
'use client';
import React, { memo } from 'react';
import { Layout, Avatar } from '@arco-design/web-react';
import { IconUser } from '@arco-design/web-react/icon';
import cs from 'classnames';
import Image from 'next/image';
import styles from './index.module.css';
interface HeaderProps {
mode?: 'light' | 'dark';
}
const LayoutHeader = Layout.Header;
function Header({ mode }: HeaderProps) {
return (
<LayoutHeader className={cs(styles.header, mode === 'dark' ? styles.dark : styles.light)}>
<div className={styles.cont}>
<div className={styles.brand}>
<Image
width={30}
height={30}
src={mode === 'dark' ? '/img/artists-settle-in/logo.svg' : '/img/artists-settle-in/logo_black.svg'}
alt="雀乐"
/>
<h5 className={styles.brandName}></h5>
</div>
<div className={styles.avatar}>
<div className={styles.loginText}></div>
<Avatar size={32}>
<IconUser />
</Avatar>
</div>
</div>
</LayoutHeader>
);
}
export default memo(Header);

@ -2,14 +2,21 @@
// import Link from 'next/link';
import { useRouter } from 'next/navigation';
import { toast } from '../ui/use-toast';
import { platformList } from './data';
export default function FooterPlatform({ className }: { className?: string }) {
// const { toast } = useToast();
const router = useRouter();
const handleClick = () => {
const handleClick = ({ url }: { name: string; url: string }) => {
if (url && url !== '#') {
router.push(url);
return;
}
toast({ description: '敬请期待', duration: 1500 });
};
@ -21,7 +28,7 @@ export default function FooterPlatform({ className }: { className?: string }) {
<li
key={index}
className="mb-[9px] text-[12px] leading-[17px] hover:text-[rgba(255,255,255,0.9)] transition-colors cursor-pointer"
onClick={handleClick}
onClick={() => handleClick(item)}
>
{/* <Link
className="text-[12px] leading-[17px] hover:text-[rgba(255,255,255,0.9)] transition-colors"

@ -20,7 +20,7 @@ export const agreementList = [
export const platformList = [
{
name: '音乐人入驻',
url: '#',
url: '/artists-settle-in',
},
{
name: '音乐商城',

@ -0,0 +1,10 @@
import clientHttp from '@/utils/request/client';
/**
* @description -
*/
export const apiArtistsSignUp = async (params: any) => {
const result = await clientHttp.post('/user/artist/register', params);
return result;
};

@ -12,3 +12,4 @@ export * from './client/audio';
export * from './client/user';
export * from './client/operate';
export * from './client/comment';
export * from './client/artists-settle-in';

Loading…
Cancel
Save