u
This commit is contained in:
1 parent
d6dd5b032d
commit
8a6d29f5d0
16 files changed
+514
-69
No files matched your search
@@ -2,19 +2,22 @@ import type { TabbarItem } from '@/components/custom/Tabbar'
|
||||
import CustomTabbar from '@/components/custom/Tabbar'
|
||||
import { toast } from '@/utils/toast'
|
||||
|
||||
export const unstable_settings = {
|
||||
initialRouteName: 'money',
|
||||
}
|
||||
|
||||
export default function TabsLayout() {
|
||||
const tabbarOptions: TabbarItem[] = [
|
||||
{
|
||||
name: 'user',
|
||||
href: '/user',
|
||||
icon: 'CircleCheckBig',
|
||||
},
|
||||
|
||||
{
|
||||
name: 'money',
|
||||
href: '/money',
|
||||
icon: 'CircleDollarSign',
|
||||
},
|
||||
{
|
||||
name: 'user',
|
||||
href: '/user',
|
||||
icon: 'CircleCheckBig',
|
||||
},
|
||||
{
|
||||
name: 'app',
|
||||
icon: 'LayoutGrid',
|
||||
@@ -37,6 +40,7 @@ export default function TabsLayout() {
|
||||
icon: 'Heart',
|
||||
},
|
||||
]
|
||||
|
||||
return (
|
||||
<CustomTabbar data={tabbarOptions} />
|
||||
)
|
||||
|
||||
@@ -1,9 +1,53 @@
|
||||
import { Text, View } from 'react-native'
|
||||
import { LinearGradient } from 'expo-linear-gradient'
|
||||
import { useState } from 'react'
|
||||
import { Pressable, Text, View } from 'react-native'
|
||||
import { useSafeAreaInsets } from 'react-native-safe-area-context'
|
||||
|
||||
export default function Money() {
|
||||
const insets = useSafeAreaInsets()
|
||||
const [active, setActive] = useState<'明细' | '视图'>('明细')
|
||||
|
||||
return (
|
||||
<View>
|
||||
<Text>Money</Text>
|
||||
</View>
|
||||
<LinearGradient
|
||||
colors={['#fffaf0', '#fefefe', '#f0fff4']}
|
||||
start={{ x: 0, y: 0 }}
|
||||
end={{ x: 1, y: 1 }}
|
||||
style={{
|
||||
flex: 1,
|
||||
paddingTop: insets.top,
|
||||
paddingBottom: insets.bottom,
|
||||
paddingLeft: insets.left,
|
||||
paddingRight: insets.right,
|
||||
}}
|
||||
>
|
||||
<View style={{ flexDirection: 'row' }}>
|
||||
{['明细', '视图'].map((item) => {
|
||||
const isActive = active === item
|
||||
return (
|
||||
<Pressable
|
||||
key={item}
|
||||
onPress={() => setActive(item as '明细' | '视图')}
|
||||
style={{ alignItems: 'center', paddingVertical: 12 }}
|
||||
>
|
||||
<Text style={{ fontSize: isActive ? 22 : 16, color: isActive ? '#333' : '#888', fontWeight: isActive ? '600' : '400' }}>
|
||||
{item}
|
||||
</Text>
|
||||
{/* 底部指示线 */}
|
||||
{isActive && (
|
||||
<View
|
||||
style={{
|
||||
marginTop: 4,
|
||||
height: 2,
|
||||
width: 24,
|
||||
backgroundColor: '#007AFF',
|
||||
borderRadius: 1,
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
</Pressable>
|
||||
)
|
||||
})}
|
||||
</View>
|
||||
</LinearGradient>
|
||||
)
|
||||
}
|
||||
@@ -1,9 +1,83 @@
|
||||
import { Text, View } from 'react-native'
|
||||
import { router } from 'expo-router'
|
||||
import { StyleSheet, Text, View } from 'react-native'
|
||||
import { AButton } from '@/components/common/ao'
|
||||
import { useUserStore } from '@/store/user'
|
||||
|
||||
export default function User() {
|
||||
const userInfo = useUserStore(state => state.userInfo)
|
||||
|
||||
if (!userInfo) {
|
||||
return (
|
||||
<View style={styles.container}>
|
||||
<Text style={styles.empty}>未登录</Text>
|
||||
</View>
|
||||
)
|
||||
}
|
||||
|
||||
const genderText = userInfo.gender === 1 ? '男' : userInfo.gender === 2 ? '女' : '未设置'
|
||||
|
||||
return (
|
||||
<View>
|
||||
<Text>User</Text>
|
||||
<View style={styles.container}>
|
||||
<Text style={styles.title}>个人信息</Text>
|
||||
<View style={styles.infoBox}>
|
||||
<Text style={styles.item}>
|
||||
账号:
|
||||
{userInfo.account}
|
||||
</Text>
|
||||
<Text style={styles.item}>
|
||||
用户名:
|
||||
{userInfo.username}
|
||||
</Text>
|
||||
<Text style={styles.item}>
|
||||
ID:
|
||||
{userInfo.id}
|
||||
</Text>
|
||||
<Text style={styles.item}>
|
||||
序号:
|
||||
{userInfo.seqNo}
|
||||
</Text>
|
||||
<Text style={styles.item}>
|
||||
性别:
|
||||
{genderText}
|
||||
</Text>
|
||||
{userInfo.rememberMe && <Text style={styles.item}>已开启记住我功能</Text>}
|
||||
</View>
|
||||
|
||||
<AButton onPress={() => {
|
||||
router.replace('/auth')
|
||||
}}
|
||||
>
|
||||
跳转到登陆页面
|
||||
</AButton>
|
||||
</View>
|
||||
)
|
||||
}
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
container: {
|
||||
flex: 1,
|
||||
backgroundColor: '#fff',
|
||||
padding: 20,
|
||||
},
|
||||
title: {
|
||||
fontSize: 20,
|
||||
fontWeight: 'bold',
|
||||
marginBottom: 16,
|
||||
},
|
||||
infoBox: {
|
||||
backgroundColor: '#f8f8f8',
|
||||
borderRadius: 12,
|
||||
padding: 16,
|
||||
},
|
||||
item: {
|
||||
fontSize: 16,
|
||||
marginBottom: 8,
|
||||
color: '#333',
|
||||
},
|
||||
empty: {
|
||||
textAlign: 'center',
|
||||
marginTop: 100,
|
||||
fontSize: 18,
|
||||
color: '#888',
|
||||
},
|
||||
})
|
||||
@@ -59,8 +59,8 @@ export default function RootLayout() {
|
||||
screenOptions={{
|
||||
headerTitleAlign: 'center',
|
||||
animation: 'slide_from_right',
|
||||
gestureEnabled: true, // 启用手势返回
|
||||
gestureDirection: 'horizontal', // 水平手势
|
||||
gestureEnabled: true,
|
||||
gestureDirection: 'horizontal',
|
||||
contentStyle: {
|
||||
backgroundColor: '#fff',
|
||||
},
|
||||
@@ -68,14 +68,18 @@ export default function RootLayout() {
|
||||
>
|
||||
<Stack.Screen
|
||||
name="(tabs)"
|
||||
options={{ headerShown: false }}
|
||||
options={{
|
||||
headerShown: false,
|
||||
}}
|
||||
/>
|
||||
|
||||
<Stack.Screen
|
||||
name="auth"
|
||||
options={{
|
||||
headerShown: false,
|
||||
}}
|
||||
/>
|
||||
|
||||
<Stack.Screen name="+not-found" />
|
||||
</Stack>
|
||||
<StatusBar style="auto" />
|
||||
|
||||
@@ -25,6 +25,5 @@ export default function AuthLayout() {
|
||||
<StepLayout steps={steps}>
|
||||
<Slot />
|
||||
</StepLayout>
|
||||
|
||||
)
|
||||
}
|
||||
@@ -6,10 +6,11 @@ import { IconQq, IconWeixin, IconZhiwen } from '@/components/iconfont'
|
||||
import { Divider } from '@/components/ui/divider'
|
||||
import useFormValidation from '@/hooks/useFormValidation'
|
||||
import { loginDefaultApi } from '@/request/api/auth'
|
||||
import { useUserStore } from '@/store/user'
|
||||
import { toast } from '@/utils/toast'
|
||||
|
||||
interface LoginForm {
|
||||
username: string
|
||||
account: string
|
||||
password: string
|
||||
rememberMe: boolean
|
||||
socialType?: 'qq' | 'weixin' | 'fingerprint'
|
||||
@@ -17,10 +18,11 @@ interface LoginForm {
|
||||
|
||||
export default function AuthLogin() {
|
||||
const router = useRouter()
|
||||
const userStore = useUserStore()
|
||||
|
||||
const [loading, setLoading] = useState<boolean>(false)
|
||||
const [form, setForm] = useState<LoginForm>({
|
||||
username: '',
|
||||
account: userStore.userInfo?.account || '',
|
||||
password: '',
|
||||
rememberMe: true,
|
||||
})
|
||||
@@ -30,7 +32,7 @@ export default function AuthLogin() {
|
||||
}
|
||||
|
||||
const rules = {
|
||||
username: { required: true, message: '账号是必填项' },
|
||||
account: { required: true, message: '账号是必填项' },
|
||||
password: { required: true, message: '密码是必填项' },
|
||||
}
|
||||
|
||||
@@ -38,23 +40,38 @@ export default function AuthLogin() {
|
||||
|
||||
const loginDefault = () => {
|
||||
setLoading(true)
|
||||
// loginDefaultApi({
|
||||
// account: form.username,
|
||||
// password: form.password,
|
||||
// }).then((res) => {
|
||||
// if (res.isSuccess) {
|
||||
// router.replace('/')
|
||||
// }
|
||||
// else {
|
||||
// toast.show({
|
||||
// title: res.message || '登录失败',
|
||||
// })
|
||||
// }
|
||||
// }).catch((_err) => {
|
||||
loginDefaultApi({
|
||||
account: form.account,
|
||||
password: form.password,
|
||||
}).then((res) => {
|
||||
if (res.isSuccess) {
|
||||
toast.show({
|
||||
title: '登录成功',
|
||||
})
|
||||
|
||||
// }).finally(() => {
|
||||
// setLoading(false)
|
||||
// })
|
||||
userStore.setUserInfo({
|
||||
account: form.account,
|
||||
id: res.data.userId,
|
||||
seqNo: res.data.seqNo,
|
||||
username: res.data.username,
|
||||
gender: res.data.gender,
|
||||
token: res.data.token,
|
||||
refreshToken: res.data.refreshToken,
|
||||
rememberMe: form.rememberMe,
|
||||
})
|
||||
|
||||
router.replace('/user')
|
||||
}
|
||||
else {
|
||||
toast.show({
|
||||
title: res.message || '登录失败',
|
||||
})
|
||||
}
|
||||
}).catch((_err) => {
|
||||
|
||||
}).finally(() => {
|
||||
setLoading(false)
|
||||
})
|
||||
}
|
||||
|
||||
const loginQq = () => {
|
||||
@@ -78,8 +95,8 @@ export default function AuthLogin() {
|
||||
<AForm form={form}>
|
||||
<AFormItem label="账号">
|
||||
<AInput
|
||||
value={form.username}
|
||||
onChange={text => handleInputChange('username', text)}
|
||||
value={form.account}
|
||||
onChange={text => handleInputChange('account', text)}
|
||||
/>
|
||||
</AFormItem>
|
||||
|
||||
|
||||
Reference in new issue
Block a user