This commit is contained in:
liu
2026-08-27 14:25:03 +08:00
parent 4bbe92d8e8
commit 78c787d207
11 changed files with 307 additions and 13 deletions
+2
View File
@@ -15,6 +15,8 @@ export default defineAppConfig({
'pages/payment-detail/index', 'pages/payment-detail/index',
'pages/settings/index', 'pages/settings/index',
'pages/login/index', 'pages/login/index',
'pages/agreement/index',
'pages/privacy/index',
'pages/change-password/index', 'pages/change-password/index',
'pages/store-info/index', 'pages/store-info/index',
], ],
+2 -2
View File
@@ -30,7 +30,7 @@ export default function PriceText({ price, spec, className, mode = 'inline' }: P
<View className={`price-text ${className ?? ''}`}> <View className={`price-text ${className ?? ''}`}>
<Text className='price-text__main'>{price}</Text> <Text className='price-text__main'>{price}</Text>
{retail !== null && ( {retail !== null && (
<Text className='price-text__retail'>{retail}</Text> <Text className='price-text__retail'>{retail}</Text>
)} )}
</View> </View>
) )
@@ -40,7 +40,7 @@ export default function PriceText({ price, spec, className, mode = 'inline' }: P
<Text className={className}> <Text className={className}>
{price} {price}
{retail !== null && ( {retail !== null && (
<Text className='price-text__retail price-text__retail--inline'>{retail}</Text> <Text className='price-text__retail price-text__retail--inline'>{retail}</Text>
)} )}
</Text> </Text>
) )
+4
View File
@@ -0,0 +1,4 @@
export default definePageConfig({
navigationStyle: 'custom',
navigationBarTitleText: '用户服务协议',
})
+54
View File
@@ -0,0 +1,54 @@
/* ========================================
协议/政策页面(用户协议、隐私政策共用)
======================================== */
.agreement-page {
min-height: 100vh;
background: #fff;
}
.agreement-scroll {
height: 100vh;
}
.agreement-content {
padding: 32px 40px 80px;
.doc-title {
display: block;
font-size: 40px;
font-weight: 600;
color: #323233;
text-align: center;
margin-bottom: 16px;
}
.doc-updated {
display: block;
font-size: 24px;
color: #969799;
text-align: center;
margin-bottom: 48px;
}
.doc-p {
display: block;
font-size: 28px;
color: #323233;
line-height: 1.8;
margin-bottom: 24px;
text-align: justify;
}
.doc-h2 {
display: block;
font-size: 32px;
font-weight: 600;
color: #323233;
margin: 48px 0 16px;
}
.doc-bold {
font-weight: 600;
}
}
+69
View File
@@ -0,0 +1,69 @@
import { View, Text, ScrollView } from '@tarojs/components'
import CustomNavBar from '@/components/NavBar'
import './index.less'
/**
* 用户服务协议
* 静态协议文本页,由登录页/设置页进入
*/
export default function AgreementPage() {
return (
<View className='agreement-page'>
<CustomNavBar title='用户服务协议' />
<ScrollView scrollY className='agreement-scroll'>
<View className='agreement-content'>
<Text className='doc-title'></Text>
<Text className='doc-updated'>2026821 2026821</Text>
<Text className='doc-p'>
使使
</Text>
<Text className='doc-p doc-bold'>
使
</Text>
<Text className='doc-h2'></Text>
<Text className='doc-p'>1.1 </Text>
<Text className='doc-p'>1.2 使</Text>
<Text className='doc-p'>1.3 使</Text>
<Text className='doc-p'>1.4 --</Text>
<Text className='doc-h2'></Text>
<Text className='doc-p'>2.1 线线</Text>
<Text className='doc-p'>2.2 </Text>
<Text className='doc-p'>2.3 </Text>
<Text className='doc-h2'></Text>
<Text className='doc-p'>3.1 使</Text>
<Text className='doc-p'>3.2 </Text>
<Text className='doc-p'>3.3 </Text>
<Text className='doc-h2'></Text>
<Text className='doc-p'>4.1 退</Text>
<Text className='doc-p'>4.2 </Text>
<Text className='doc-p'>4.3 </Text>
<Text className='doc-h2'></Text>
<Text className='doc-p'>5.1 </Text>
<Text className='doc-p'>5.2 </Text>
<Text className='doc-h2'></Text>
<Text className='doc-p'>6.1 </Text>
<Text className='doc-p'>6.2 </Text>
<Text className='doc-p'>6.3 </Text>
<Text className='doc-h2'></Text>
<Text className='doc-p'>7.1 使使</Text>
<Text className='doc-p'>7.2 </Text>
<Text className='doc-h2'></Text>
<Text className='doc-p'>8.1 </Text>
<Text className='doc-p'>8.2 </Text>
<Text className='doc-h2'></Text>
<Text className='doc-p'></Text>
</View>
</ScrollView>
</View>
)
}
+28 -2
View File
@@ -184,7 +184,7 @@
} }
} }
/* ========== 协议文字 ========== */ /* ========== 协议勾选区 ========== */
.login-agreement { .login-agreement {
display: flex; display: flex;
align-items: center; align-items: center;
@@ -193,9 +193,35 @@
margin-top: 32px; margin-top: 32px;
line-height: 1.6; line-height: 1.6;
.agree-checkbox {
width: 32px;
height: 32px;
border-radius: 50%;
border: 2px solid #c8c9cc;
margin-right: 12px;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
box-sizing: border-box;
transition: all 0.2s;
&--checked {
background: #ee0a24;
border-color: #ee0a24;
}
}
.agree-checkbox-tick {
font-size: 22px;
color: #fff;
line-height: 1;
font-weight: 700;
}
.agree-text { .agree-text {
font-size: 24px; font-size: 24px;
color: #c8c9cc; color: #969799;
} }
.agree-link { .agree-link {
+23 -6
View File
@@ -18,6 +18,8 @@ export default function LoginPage() {
/** 登录密码 */ /** 登录密码 */
const [password, setPassword] = useState('') const [password, setPassword] = useState('')
const [submitting, setSubmitting] = useState(false) const [submitting, setSubmitting] = useState(false)
/** 是否已阅读并同意协议(默认不勾选,须用户自主勾选后才能登录) */
const [agreed, setAgreed] = useState(false)
/** 返回上一页(无页面栈时回首页) */ /** 返回上一页(无页面栈时回首页) */
const goBack = useCallback(() => { const goBack = useCallback(() => {
@@ -41,6 +43,10 @@ export default function LoginPage() {
Taro.showToast({ title: '请输入登录密码', icon: 'none' }) Taro.showToast({ title: '请输入登录密码', icon: 'none' })
return return
} }
if (!agreed) {
Taro.showToast({ title: '请先阅读并勾选同意《用户服务协议》和《隐私政策》', icon: 'none' })
return
}
setSubmitting(true) setSubmitting(true)
try { try {
await login({ username: account, password }) await login({ username: account, password })
@@ -51,16 +57,21 @@ export default function LoginPage() {
} finally { } finally {
setSubmitting(false) setSubmitting(false)
} }
}, [login, submitting, username, password, goBack]) }, [login, submitting, username, password, agreed, goBack])
/** 查看用户协议 */ /** 查看用户服务协议 */
const handleShowAgreement = useCallback(() => { const handleShowAgreement = useCallback(() => {
Taro.showToast({ title: '用户协议即将上线', icon: 'none' }) Taro.navigateTo({ url: '/pages/agreement/index' })
}, []) }, [])
/** 查看隐私政策 */ /** 查看隐私政策 */
const handleShowPrivacy = useCallback(() => { const handleShowPrivacy = useCallback(() => {
Taro.showToast({ title: '隐私政策即将上线', icon: 'none' }) Taro.navigateTo({ url: '/pages/privacy/index' })
}, [])
/** 勾选/取消勾选协议 */
const toggleAgreed = useCallback(() => {
setAgreed(v => !v)
}, []) }, [])
return ( return (
@@ -125,9 +136,15 @@ export default function LoginPage() {
</View> </View>
<View className='login-agreement'> <View className='login-agreement'>
<Text className='agree-text'></Text> <View
className={`agree-checkbox ${agreed ? 'agree-checkbox--checked' : ''}`}
onClick={toggleAgreed}
>
{agreed && <Text className='agree-checkbox-tick'></Text>}
</View>
<Text className='agree-text'></Text>
<Text className='agree-link' onClick={handleShowAgreement}> <Text className='agree-link' onClick={handleShowAgreement}>
</Text> </Text>
<Text className='agree-text'></Text> <Text className='agree-text'></Text>
<Text className='agree-link' onClick={handleShowPrivacy}> <Text className='agree-link' onClick={handleShowPrivacy}>
+4
View File
@@ -0,0 +1,4 @@
export default definePageConfig({
navigationStyle: 'custom',
navigationBarTitleText: '隐私政策',
})
+54
View File
@@ -0,0 +1,54 @@
/* ========================================
隐私政策页面(与用户协议共用样式)
======================================== */
.privacy-page {
min-height: 100vh;
background: #fff;
}
.privacy-scroll {
height: 100vh;
}
.privacy-content {
padding: 32px 40px 80px;
.doc-title {
display: block;
font-size: 40px;
font-weight: 600;
color: #323233;
text-align: center;
margin-bottom: 16px;
}
.doc-updated {
display: block;
font-size: 24px;
color: #969799;
text-align: center;
margin-bottom: 48px;
}
.doc-p {
display: block;
font-size: 28px;
color: #323233;
line-height: 1.8;
margin-bottom: 24px;
text-align: justify;
}
.doc-h2 {
display: block;
font-size: 32px;
font-weight: 600;
color: #323233;
margin: 48px 0 16px;
}
.doc-bold {
font-weight: 600;
}
}
+64
View File
@@ -0,0 +1,64 @@
import { View, Text, ScrollView } from '@tarojs/components'
import CustomNavBar from '@/components/NavBar'
import './index.less'
/**
* 隐私政策
* 静态政策文本页,由登录页/设置页进入
*/
export default function PrivacyPage() {
return (
<View className='privacy-page'>
<CustomNavBar title='隐私政策' />
<ScrollView scrollY className='privacy-scroll'>
<View className='privacy-content'>
<Text className='doc-title'></Text>
<Text className='doc-updated'>2026821 2026821</Text>
<Text className='doc-p'>
</Text>
<Text className='doc-p doc-bold'>
使使使
</Text>
<Text className='doc-h2'></Text>
<Text className='doc-p'>使</Text>
<Text className='doc-p'>1.1 使</Text>
<Text className='doc-p'>1.2 使</Text>
<Text className='doc-p'>1.3 </Text>
<Text className='doc-p'>1.4 </Text>
<Text className='doc-h2'>使</Text>
<Text className='doc-p'>2.1 </Text>
<Text className='doc-p'>2.2 使</Text>
<Text className='doc-h2'></Text>
<Text className='doc-p'>3.1 </Text>
<Text className='doc-p'>3.2 </Text>
<Text className='doc-p'>3.3 </Text>
<Text className='doc-h2'></Text>
<Text className='doc-p'>4.1 </Text>
<Text className='doc-p'>4.2 访访使</Text>
<Text className='doc-p'>4.3 </Text>
<Text className='doc-h2'></Text>
<Text className='doc-p'>5.1 </Text>
<Text className='doc-p'>5.2 --</Text>
<Text className='doc-p'>5.3 </Text>
<Text className='doc-p'>5.4 使使</Text>
<Text className='doc-h2'></Text>
<Text className='doc-p'>使</Text>
<Text className='doc-h2'></Text>
<Text className='doc-p'>使使</Text>
<Text className='doc-h2'></Text>
<Text className='doc-p'></Text>
</View>
</ScrollView>
</View>
)
}
+3 -3
View File
@@ -21,11 +21,11 @@ export default function SettingsPage() {
<Text className='setting-cell__label'></Text> <Text className='setting-cell__label'></Text>
<Text className='setting-cell__value'></Text> <Text className='setting-cell__value'></Text>
</View> </View>
<View className='setting-cell' onClick={() => handlePlaceholder('用户协议')}> <View className='setting-cell' onClick={() => Taro.navigateTo({ url: '/pages/agreement/index' })}>
<Text className='setting-cell__label'></Text> <Text className='setting-cell__label'></Text>
<Text className='setting-cell__value'></Text> <Text className='setting-cell__value'></Text>
</View> </View>
<View className='setting-cell' onClick={() => handlePlaceholder('隐私政策')}> <View className='setting-cell' onClick={() => Taro.navigateTo({ url: '/pages/privacy/index' })}>
<Text className='setting-cell__label'></Text> <Text className='setting-cell__label'></Text>
<Text className='setting-cell__value'></Text> <Text className='setting-cell__value'></Text>
</View> </View>