完善设备端体验与微信校验支持

This commit is contained in:
stu2not
2026-07-07 16:58:05 +08:00
parent b4fef6d2e0
commit 937e3023fc
38 changed files with 3377 additions and 51 deletions

View File

@@ -1,7 +1,7 @@
{
"miniprogramRoot": "dist/",
"projectname": "banban-mini",
"appid": "",
"appid": "wx29ce99ce96b56cd9",
"compileType": "miniprogram",
"setting": {
"urlCheck": false,

View File

@@ -25,8 +25,11 @@
overflow: hidden;
}
.guest-card {
.guest-chat-shell {
margin: 0 24px;
}
.guest-card {
padding: 44px 32px;
border-radius: 20px;
background: #FFFFFF;
@@ -64,6 +67,10 @@
margin-top: 30px;
border-radius: 16px;
background: #07C160;
&.secondary {
background: #FF8C42;
}
}
.guest-card-btn-text {
@@ -72,6 +79,139 @@
color: #FFFFFF;
}
.guest-demo-card,
.guest-guide-card {
margin-top: 20px;
padding: 28px 24px;
border-radius: 20px;
background: #FFFFFF;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.04);
}
.guest-demo-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 20px;
}
.guest-demo-title,
.guest-guide-title {
display: block;
font-size: 30px;
line-height: 1.35;
font-weight: 700;
color: #1A1A1A;
}
.guest-demo-tag {
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
min-width: 92px;
height: 52px;
padding: 0 18px;
border-radius: 999px;
background: #FFF2E7;
&:active {
opacity: 0.72;
}
}
.guest-demo-tag-text {
font-size: 24px;
font-weight: 700;
color: #FF8C42;
}
.guest-demo-item {
display: flex;
align-items: center;
padding: 20px 0;
border-top: 1px solid #F2F2F2;
&:first-of-type {
border-top: none;
}
&:active {
opacity: 0.72;
}
}
.guest-demo-avatar {
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
width: 76px;
height: 76px;
margin-right: 20px;
border-radius: 20px;
background: #FFF2E7;
text {
font-size: 30px;
font-weight: 700;
color: #FF8C42;
}
&.parent {
background: #E8F8F0;
text {
color: #16A34A;
}
}
}
.guest-demo-content {
flex: 1;
min-width: 0;
}
.guest-demo-action {
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
margin-left: 16px;
min-width: 86px;
height: 56px;
padding: 0 18px;
border-radius: 14px;
background: #F5F7FA;
&:active {
opacity: 0.72;
}
}
.guest-demo-action-text {
font-size: 24px;
font-weight: 700;
color: #FF8C42;
}
.guest-demo-name {
display: block;
font-size: 28px;
line-height: 1.35;
font-weight: 700;
color: #1A1A1A;
}
.guest-demo-message,
.guest-guide-desc {
display: block;
margin-top: 8px;
font-size: 25px;
line-height: 1.55;
color: #666666;
}
.conversation-item {
background: #FFFFFF;
border-radius: 20px;

View File

@@ -64,6 +64,15 @@ export default function Chat() {
Taro.navigateTo({ url: '/pages/login/index' })
}
const handleGuestPreviewTap = (title: string, content: string) => {
Taro.showModal({
title,
content,
showCancel: false,
confirmText: '我知道了',
})
}
return (
<View className='chat-page'>
<View className='page-header'>
@@ -71,12 +80,82 @@ export default function Chat() {
</View>
{isGuest ? (
<View className='guest-card'>
<Text className='guest-card-icon'>💬</Text>
<Text className='guest-card-title'></Text>
<Text className='guest-card-desc'> AI </Text>
<View className='guest-card-btn' onClick={handleGuestLogin}>
<Text className='guest-card-btn-text'></Text>
<View className='guest-chat-shell'>
<View className='guest-card'>
<Text className='guest-card-icon'>💬</Text>
<Text className='guest-card-title'></Text>
<Text className='guest-card-desc'> AI </Text>
</View>
<View className='guest-demo-card'>
<View className='guest-demo-header'>
<Text className='guest-demo-title'></Text>
<View
className='guest-demo-tag'
onClick={() => handleGuestPreviewTap(
'会话预览',
'这里展示玩伴页的会话能力。绑定设备后,会显示宝贝、家长和 AI 玩伴的真实消息记录。'
)}
>
<Text className='guest-demo-tag-text'></Text>
</View>
</View>
<View
className='guest-demo-item'
onClick={() => handleGuestPreviewTap(
'AI 玩伴',
'绑定设备后,可以在这里查看宝贝与 AI 玩伴的真实会话记录,包括聊天内容、时间和对应宝贝。'
)}
>
<View className='guest-demo-avatar'>
<Text></Text>
</View>
<View className='guest-demo-content'>
<Text className='guest-demo-name'>AI </Text>
<Text className='guest-demo-message'></Text>
</View>
<View
className='guest-demo-action'
onClick={() => handleGuestPreviewTap(
'AI 玩伴',
'绑定设备后,可以在这里查看宝贝与 AI 玩伴的真实会话记录,包括聊天内容、时间和对应宝贝。'
)}
>
<Text className='guest-demo-action-text'></Text>
</View>
</View>
<View
className='guest-demo-item'
onClick={() => handleGuestPreviewTap(
'家长留言',
'绑定设备后,家长可以查看消息记录,也可以给宝贝发送语音留言,设备端会收到对应提醒。'
)}
>
<View className='guest-demo-avatar parent'>
<Text></Text>
</View>
<View className='guest-demo-content'>
<Text className='guest-demo-name'></Text>
<Text className='guest-demo-message'></Text>
</View>
<View
className='guest-demo-action'
onClick={() => handleGuestPreviewTap(
'家长留言',
'绑定设备后,家长可以查看消息记录,也可以给宝贝发送语音留言,设备端会收到对应提醒。'
)}
>
<Text className='guest-demo-action-text'></Text>
</View>
</View>
</View>
<View className='guest-guide-card'>
<Text className='guest-guide-title'>使</Text>
<Text className='guest-guide-desc'></Text>
<View className='guest-card-btn secondary' onClick={handleGuestLogin}>
<Text className='guest-card-btn-text'> / </Text>
</View>
</View>
</View>
) : loading ? (

View File

@@ -318,7 +318,7 @@ export default function Device() {
<Text className='guest-action-title'></Text>
<Text className='guest-action-desc'></Text>
<View className='guest-primary-btn' onClick={() => goLoginWithRedirect('/pages/device/index')}>
<Text className='guest-primary-btn-text'></Text>
<Text className='guest-primary-btn-text'> / </Text>
</View>
</View>
{systemBanner}

View File

@@ -165,6 +165,10 @@
margin: 0 24px;
}
.guest-location-panel {
margin: 0 24px;
}
.location-empty-card {
background: #FFFFFF;
border-radius: 20px;
@@ -211,6 +215,10 @@
display: flex;
align-items: center;
justify-content: center;
&.secondary {
background: #07C160;
}
}
.location-empty-action-text {
@@ -218,3 +226,55 @@
color: #FFFFFF;
font-weight: 600;
}
.guest-location-card {
margin-top: 20px;
padding: 28px 24px;
border-radius: 20px;
background: #FFFFFF;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.04);
}
.guest-location-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: 24px;
padding: 20px 0;
border-top: 1px solid #F2F2F2;
&:first-child {
border-top: none;
}
}
.guest-location-label {
flex-shrink: 0;
font-size: 27px;
font-weight: 700;
color: #1A1A1A;
}
.guest-location-value {
min-width: 0;
font-size: 26px;
line-height: 1.45;
color: #666666;
text-align: right;
}
.guest-location-title {
display: block;
font-size: 30px;
font-weight: 700;
line-height: 1.35;
color: #1A1A1A;
}
.guest-location-desc {
display: block;
margin-top: 10px;
font-size: 26px;
line-height: 1.55;
color: #666666;
}

View File

@@ -394,18 +394,38 @@ export default function Location() {
}}
/>
</View>
<View className='location-empty-shell'>
<View className='guest-location-panel'>
<View className='location-empty-card'>
<Text className='location-empty-title'></Text>
<Text className='location-empty-desc'></Text>
<Text className='location-empty-desc'></Text>
</View>
<View className='guest-location-card'>
<View className='guest-location-row'>
<Text className='guest-location-label'></Text>
<Text className='guest-location-value'></Text>
</View>
<View className='guest-location-row'>
<Text className='guest-location-label'></Text>
<Text className='guest-location-value'></Text>
</View>
<View className='guest-location-row'>
<Text className='guest-location-label'></Text>
<Text className='guest-location-value'></Text>
</View>
</View>
<View className='guest-location-card'>
<Text className='guest-location-title'>使</Text>
<Text className='guest-location-desc'></Text>
<View
className='location-empty-action'
className='location-empty-action secondary'
onClick={() => {
Taro.setStorageSync('postLoginRedirect', '/pages/location/index')
Taro.navigateTo({ url: '/pages/login/index' })
}}
>
<Text className='location-empty-action-text'></Text>
<Text className='location-empty-action-text'> / </Text>
</View>
</View>
</View>

View File

@@ -127,6 +127,20 @@
opacity: 0.8;
}
}
.guest-browse-btn {
margin-top: 24px;
height: 72px;
display: flex;
align-items: center;
justify-content: center;
}
.guest-browse-text {
font-size: 28px;
color: #1677FF;
font-weight: 500;
}
}
.agreement-panel {

View File

@@ -81,6 +81,11 @@ export default function Login() {
}
}
const handleGuestBrowse = () => {
Taro.removeStorageSync('postLoginRedirect')
Taro.reLaunch({ url: '/pages/device/index' })
}
const handleAgreementChange = (event) => {
const values = event.detail.value || []
setAgreementAccepted(values.includes('accepted'))
@@ -161,6 +166,9 @@ export default function Login() {
<Text className='btn-icon'>🌐</Text>
<Text className='btn-text'>{submitting ? '登录中...' : '登录后继续'}</Text>
</Button>
<View className='guest-browse-btn' onClick={handleGuestBrowse}>
<Text className='guest-browse-text'></Text>
</View>
</View>
<View className='agreement-panel'>

View File

@@ -109,6 +109,11 @@
background: #FFFFFF;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.04);
text-align: center;
&.action-card {
padding: 32px 28px;
text-align: left;
}
}
.guest-manage-icon {
@@ -123,6 +128,12 @@
font-size: 34px;
font-weight: 700;
color: #1A1A1A;
&.small {
margin-top: 0;
font-size: 30px;
line-height: 1.35;
}
}
.guest-manage-desc {
@@ -141,6 +152,10 @@
margin-top: 30px;
border-radius: 16px;
background: #07C160;
&.secondary {
background: #FF8C42;
}
}
.guest-manage-btn-text {

View File

@@ -980,16 +980,7 @@ export default function Sleep() {
<View className='guest-manage-card'>
<Text className='guest-manage-icon'></Text>
<Text className='guest-manage-title'></Text>
<Text className='guest-manage-desc'></Text>
<View
className='guest-manage-btn'
onClick={() => {
Taro.setStorageSync('postLoginRedirect', '/pages/sleep/index')
Taro.navigateTo({ url: '/pages/login/index' })
}}
>
<Text className='guest-manage-btn-text'></Text>
</View>
<Text className='guest-manage-desc'></Text>
</View>
<View className='guest-manage-list'>
@@ -1005,6 +996,28 @@ export default function Sleep() {
<Text className='guest-manage-item-title'></Text>
<Text className='guest-manage-item-desc'></Text>
</View>
<View className='guest-manage-item'>
<Text className='guest-manage-item-title'></Text>
<Text className='guest-manage-item-desc'>线</Text>
</View>
<View className='guest-manage-item'>
<Text className='guest-manage-item-title'></Text>
<Text className='guest-manage-item-desc'></Text>
</View>
</View>
<View className='guest-manage-card action-card'>
<Text className='guest-manage-title small'></Text>
<Text className='guest-manage-desc'></Text>
<View
className='guest-manage-btn secondary'
onClick={() => {
Taro.setStorageSync('postLoginRedirect', '/pages/sleep/index')
Taro.navigateTo({ url: '/pages/login/index' })
}}
>
<Text className='guest-manage-btn-text'> / </Text>
</View>
</View>
{systemBanner}
</View>