feat: 统一页面布局 + 问答页面未登录可预览

- 添加全局 .page-layout 工具类(统一padding/背景/min-height)
- 所有16个页面根元素加上 page-layout 类
- 问答页面移除登录拦截:未登录可看欢迎卡片和问题建议,使用时再跳登录
- 输入区未登录时显示品牌色登录引导按钮
- 补全 detail/search/progress/feedback 缺漏的 status-bar-placeholder
This commit is contained in:
Yuzhiran Dev
2026-07-11 13:09:43 +08:00
parent c1d6dd3b29
commit af57f1a395
18 changed files with 82 additions and 43 deletions
+5
View File
@@ -0,0 +1,5 @@
allowBuilds:
'@parcel/watcher': set this to true or false
core-js: set this to true or false
esbuild: set this to true or false
vue-demi: set this to true or false
+15
View File
@@ -258,6 +258,21 @@ view {
height: 0; height: 0;
} }
/* 页面布局统一 */
.page-layout {
min-height: 100vh;
padding: 0 20px 30px;
background: var(--bg-primary);
}
/* 页面副标题(统一) */
.page-subtitle {
display: block;
font-size: 13px;
color: var(--text-tertiary);
margin-top: 4px;
}
/* 卡片通用 */ /* 卡片通用 */
.card { .card {
background: var(--glass-bg); background: var(--glass-bg);
@@ -1,5 +1,5 @@
<template> <template>
<view class="page-achievements"> <view class="page-achievements page-layout">
<view class="status-bar-placeholder"></view> <view class="status-bar-placeholder"></view>
<!-- 顶部导航 --> <!-- 顶部导航 -->
+39 -28
View File
@@ -1,5 +1,5 @@
<template> <template>
<view class="page-chat"> <view class="page-chat page-layout">
<view class="status-bar-placeholder"></view> <view class="status-bar-placeholder"></view>
<!-- 聊天头部 --> <!-- 聊天头部 -->
@@ -11,21 +11,15 @@
<text class="chat-name">AI 助手</text> <text class="chat-name">AI 助手</text>
<text class="chat-status">随时为你解答</text> <text class="chat-status">随时为你解答</text>
</view> </view>
<!-- 配额徽章 --> <!-- 配额徽章登录后显示 -->
<view class="quota-badge" @click="goShare"> <view class="quota-badge" v-if="userStore.isLoggedIn" @click="goShare">
<text class="quota-text">{{ quotaDisplay }}</text> <text class="quota-text">{{ quotaDisplay }}</text>
<text class="quota-icon">🎁</text> <text class="quota-icon">🎁</text>
</view> </view>
</view> </view>
<!-- 未登录提示 --> <!-- 消息列表始终可见 -->
<view class="login-hint" v-if="!userStore.isLoggedIn"> <scroll-view class="msg-list" scroll-y :scroll-into-view="scrollTo">
<text class="hint-text">登录后即可向 AI 助手提问</text>
<button class="login-btn" @click="goLogin">微信登录</button>
</view>
<!-- 消息列表 -->
<scroll-view class="msg-list" scroll-y :scroll-into-view="scrollTo" v-else>
<!-- 欢迎消息 --> <!-- 欢迎消息 -->
<view class="welcome-card"> <view class="welcome-card">
<text class="welcome-icon">💡</text> <text class="welcome-icon">💡</text>
@@ -57,9 +51,9 @@
</view> </view>
</scroll-view> </scroll-view>
<!-- 输入区 --> <!-- 输入区始终可见未登录时提示登录 -->
<view class="chat-input-area" v-if="userStore.isLoggedIn"> <view class="chat-input-area">
<view class="chat-input"> <view class="chat-input" v-if="userStore.isLoggedIn">
<input <input
v-model="question" v-model="question"
class="input-field" class="input-field"
@@ -72,6 +66,13 @@
<text></text> <text></text>
</view> </view>
</view> </view>
<!-- 未登录显示登录引导 -->
<view class="login-input-placeholder" v-else @click="goLogin">
<text class="login-input-text">登录后即可体验 AI 问答</text>
<view class="login-input-btn">
<text>去登录 </text>
</view>
</view>
</view> </view>
</view> </view>
</template> </template>
@@ -123,6 +124,12 @@ async function sendMessage() {
const q = question.value.trim() const q = question.value.trim()
if (!q || loading.value) return if (!q || loading.value) return
// 未登录 → 跳登录
if (!userStore.isLoggedIn) {
uni.navigateTo({ url: '/pages/login/login' })
return
}
messages.value.push({ role: 'user', content: escapeHtml(q) }) messages.value.push({ role: 'user', content: escapeHtml(q) })
question.value = '' question.value = ''
scrollToLast() scrollToLast()
@@ -267,29 +274,33 @@ function goShare() {
.quota-icon { font-size: 14px; } .quota-icon { font-size: 14px; }
// 未登录提示 // 未登录输入区占位
.login-hint { .login-input-placeholder {
flex: 1;
display: flex; display: flex;
flex-direction: column;
align-items: center; align-items: center;
justify-content: center; justify-content: space-between;
gap: 16px; padding: 14px 18px;
padding: 0 40px; background: var(--glass-bg);
border: 1px dashed var(--glass-border);
border-radius: 14px;
margin-bottom: 30px;
cursor: pointer;
} }
.hint-text { .login-input-text {
font-size: 14px; font-size: 14px;
color: var(--text-tertiary); color: var(--text-tertiary);
} }
.login-btn { .login-input-btn {
background: linear-gradient(135deg, #07c160, #06ad56); padding: 6px 16px;
background: var(--color-brand);
border-radius: 8px;
}
.login-input-btn text {
font-size: 13px;
color: white; color: white;
border: none;
border-radius: 10px;
padding: 10px 24px;
font-size: 14px;
font-weight: 600; font-weight: 600;
} }
+3 -1
View File
@@ -1,5 +1,7 @@
<template> <template>
<view class="detail-page"> <view class="detail-page page-layout">
<!-- 状态栏占位 -->
<view class="status-bar-placeholder"></view>
<!-- 顶部导航 --> <!-- 顶部导航 -->
<view class="nav-bar"> <view class="nav-bar">
<view class="nav-back" @click="goBack"></view> <view class="nav-back" @click="goBack"></view>
+1 -1
View File
@@ -1,5 +1,5 @@
<template> <template>
<view class="page-dim"> <view class="page-dim page-layout">
<view class="status-bar-placeholder"></view> <view class="status-bar-placeholder"></view>
<view class="back-btn" @tap="goBack"> <view class="back-btn" @tap="goBack">
+1 -1
View File
@@ -1,5 +1,5 @@
<template> <template>
<view class="page-favorites"> <view class="page-favorites page-layout">
<view class="status-bar-placeholder"></view> <view class="status-bar-placeholder"></view>
<!-- 顶部导航 --> <!-- 顶部导航 -->
+3 -1
View File
@@ -1,5 +1,7 @@
<template> <template>
<view class="feedback-page"> <view class="feedback-page page-layout">
<!-- 状态栏占位 -->
<view class="status-bar-placeholder"></view>
<!-- 顶部导航 --> <!-- 顶部导航 -->
<view class="nav-bar"> <view class="nav-bar">
<view class="nav-back" @click="goBack"></view> <view class="nav-back" @click="goBack"></view>
+1 -1
View File
@@ -1,5 +1,5 @@
<template> <template>
<view class="page-home"> <view class="page-home page-layout">
<!-- 状态栏占位 --> <!-- 状态栏占位 -->
<view class="status-bar-placeholder"></view> <view class="status-bar-placeholder"></view>
+1 -1
View File
@@ -1,5 +1,5 @@
<template> <template>
<view class="page-leaderboard"> <view class="page-leaderboard page-layout">
<view class="status-bar-placeholder"></view> <view class="status-bar-placeholder"></view>
<!-- 顶部导航 --> <!-- 顶部导航 -->
+1 -1
View File
@@ -1,5 +1,5 @@
<template> <template>
<view class="login-page"> <view class="login-page page-layout">
<!-- 背景装饰 --> <!-- 背景装饰 -->
<view class="bg-orb orb-1"></view> <view class="bg-orb orb-1"></view>
<view class="bg-orb orb-2"></view> <view class="bg-orb orb-2"></view>
+1 -1
View File
@@ -1,5 +1,5 @@
<template> <template>
<view class="page-news-detail"> <view class="page-news-detail page-layout">
<view class="status-bar-placeholder"></view> <view class="status-bar-placeholder"></view>
<!-- 导航 --> <!-- 导航 -->
<view class="nav-bar"> <view class="nav-bar">
+1 -1
View File
@@ -1,5 +1,5 @@
<template> <template>
<view class="page-payment"> <view class="page-payment page-layout">
<view class="status-bar-placeholder"></view> <view class="status-bar-placeholder"></view>
<!-- 导航 --> <!-- 导航 -->
+1 -1
View File
@@ -1,5 +1,5 @@
<template> <template>
<view class="page-profile"> <view class="page-profile page-layout">
<view class="status-bar-placeholder"></view> <view class="status-bar-placeholder"></view>
<!-- 用户信息 --> <!-- 用户信息 -->
+3 -1
View File
@@ -1,5 +1,7 @@
<template> <template>
<view class="progress-page"> <view class="progress-page page-layout">
<!-- 状态栏占位 -->
<view class="status-bar-placeholder"></view>
<!-- 顶部导航 --> <!-- 顶部导航 -->
<view class="nav-bar"> <view class="nav-bar">
<view class="nav-back" @click="goBack"></view> <view class="nav-back" @click="goBack"></view>
+3 -1
View File
@@ -1,5 +1,7 @@
<template> <template>
<view class="search-page"> <view class="search-page page-layout">
<!-- 状态栏占位 -->
<view class="status-bar-placeholder"></view>
<!-- 顶部导航 --> <!-- 顶部导航 -->
<view class="nav-bar"> <view class="nav-bar">
<view class="nav-back" @click="goBack"></view> <view class="nav-back" @click="goBack"></view>
+1 -1
View File
@@ -1,5 +1,5 @@
<template> <template>
<view class="page-settings"> <view class="page-settings page-layout">
<view class="status-bar-placeholder"></view> <view class="status-bar-placeholder"></view>
<text class="page-title">设置</text> <text class="page-title">设置</text>
+1 -1
View File
@@ -1,5 +1,5 @@
<template> <template>
<view class="page-trend"> <view class="page-trend page-layout">
<view class="status-bar-placeholder"></view> <view class="status-bar-placeholder"></view>
<!-- 顶部 --> <!-- 顶部 -->