Files
account/resources/mobile/pages/ucenter/help/index.vue
2026-01-18 22:40:12 +08:00

546 lines
13 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<un-pages
:show-nav-bar="true"
nav-bar-title="帮助中心"
:show-back="true"
:show-tab-bar="false"
>
<view class="help-container">
<!-- 搜索框 -->
<view class="search-section">
<view class="search-box">
<uni-icons type="search" size="18" color="#999"></uni-icons>
<input
class="search-input"
type="text"
placeholder="搜索问题关键词"
v-model="searchKeyword"
@input="handleSearch"
placeholder-style="color: #999; font-size: 28rpx;"
/>
<view v-if="searchKeyword" class="clear-btn" @tap="clearSearch">
<uni-icons type="clear" size="16" color="#999"></uni-icons>
</view>
</view>
</view>
<!-- 分类标签 -->
<view class="category-section" v-if="!searchKeyword">
<scroll-view scroll-x class="category-scroll" show-scrollbar="false">
<view class="category-list">
<view
class="category-item"
:class="{ active: activeCategory === item.value }"
v-for="item in categoryList"
:key="item.value"
@tap="selectCategory(item.value)"
>
<text class="category-text">{{ item.label }}</text>
</view>
</view>
</scroll-view>
</view>
<!-- 问题列表 -->
<view class="faq-section">
<view class="faq-list" v-if="filteredQuestions.length > 0">
<view
class="faq-item"
v-for="(item, index) in filteredQuestions"
:key="index"
animation="fadeInUp"
:style="{ 'animation-delay': index * 0.1 + 's' }"
>
<view class="faq-question" @tap="toggleAnswer(index)">
<text class="question-text">{{ item.question }}</text>
<uni-icons
:type="item.expanded ? 'up' : 'down'"
size="16"
:color="item.expanded ? '#667eea' : '#ccc'"
class="arrow-icon"
></uni-icons>
</view>
<view class="faq-answer" :class="{ expanded: item.expanded }">
<text class="answer-text">{{ item.answer }}</text>
</view>
</view>
</view>
<view class="empty-state" v-else>
<text class="empty-icon">🔍</text>
<text class="empty-text">暂无相关问题</text>
</view>
</view>
<!-- 底部反馈入口 -->
<view class="feedback-section">
<view class="feedback-card" @tap="goToFeedback">
<view class="feedback-left">
<view class="feedback-icon-wrapper">
<uni-icons type="chat" size="24" color="#fff"></uni-icons>
</view>
<view class="feedback-info">
<text class="feedback-title">问题反馈</text>
<text class="feedback-desc">遇到问题告诉我们</text>
</view>
</view>
<uni-icons type="right" size="18" color="#ccc"></uni-icons>
</view>
</view>
<!-- 联系方式 -->
<view class="contact-section">
<view class="contact-item">
<uni-icons type="email" size="20" color="#667eea"></uni-icons>
<text class="contact-label">客服邮箱</text>
<text class="contact-value">support@familyaccount.com</text>
</view>
<view class="contact-item">
<uni-icons type="phone" size="20" color="#667eea"></uni-icons>
<text class="contact-label">客服电话</text>
<text class="contact-value">400-XXX-XXXX</text>
</view>
</view>
</view>
</un-pages>
</template>
<script>
export default {
data() {
return {
searchKeyword: '',
activeCategory: 'all',
categoryList: [
{ label: '全部', value: 'all' },
{ label: '账户相关', value: 'account' },
{ label: '功能使用', value: 'function' },
{ label: '家庭共享', value: 'family' },
{ label: '数据统计', value: 'statistics' },
{ label: '问题反馈', value: 'feedback' }
],
questions: [
{
question: '如何注册账号?',
answer: '点击首页的"注册"按钮,输入用户名、密码和确认密码,即可快速完成注册。注册后可使用手机号或邮箱登录。',
category: 'account',
expanded: false
},
{
question: '忘记密码怎么办?',
answer: '在登录页面点击"忘记密码"按钮,通过注册时的手机号或邮箱验证后,可设置新密码。',
category: 'account',
expanded: false
},
{
question: '如何添加一笔账单?',
answer: '点击首页底部的"+"按钮,选择收入或支出,填写金额、分类、日期和备注,点击保存即可完成记账。',
category: 'function',
expanded: false
},
{
question: '如何修改或删除账单?',
answer: '在账单列表中点击需要操作的账单,进入详情页面后可以进行编辑或删除操作。已删除的账单无法恢复。',
category: 'function',
expanded: false
},
{
question: '如何创建家庭?',
answer: '进入"家庭"页面,点击"创建家庭",设置家庭名称后即可创建。创建者自动成为家主,可以邀请家庭成员。',
category: 'family',
expanded: false
},
{
question: '如何加入家庭?',
answer: '向家主索要家庭邀请码,在"家庭"页面点击"加入家庭",输入邀请码即可加入。一个人只能加入一个家庭。',
category: 'family',
expanded: false
},
{
question: '家主如何管理家庭成员?',
answer: '家主可以在家庭页面查看所有成员,点击成员后的管理按钮可以移除成员。被移除的成员将无法查看该家庭的账单数据。',
category: 'family',
expanded: false
},
{
question: '如何查看收支统计?',
answer: '进入"统计"页面,可以选择查看"个人"或"家庭"的收支数据,支持按日、周、月、年进行统计,并可查看分类统计和趋势图表。',
category: 'statistics',
expanded: false
},
{
question: '如何切换查看个人和家庭数据?',
answer: '在账单列表和统计页面,顶部有"个人"和"家庭"切换按钮,点击即可在个人数据和家庭数据之间切换。',
category: 'function',
expanded: false
},
{
question: '如何导出数据?',
answer: '在统计页面点击"导出"按钮可以选择导出Excel或CSV格式的报表支持导出指定时间范围内的账单数据。',
category: 'function',
expanded: false
},
{
question: '如何修改个人资料?',
answer: '进入"我的"页面,点击个人设置,在资料编辑页面可以修改头像、昵称、邮箱等信息。用户名注册后不可修改。',
category: 'account',
expanded: false
},
{
question: '数据会被安全保存吗?',
answer: '是的,您的所有数据都经过加密存储,并定期备份。我们严格遵守隐私政策,不会泄露您的个人财务信息。',
category: 'account',
expanded: false
},
{
question: '如何提交问题反馈?',
answer: '在帮助中心底部点击"问题反馈"卡片,详细描述您遇到的问题,我们会尽快回复并处理您的反馈。',
category: 'feedback',
expanded: false
},
{
question: '如何联系我们?',
answer: '您可以通过客服邮箱 support@familyaccount.com 或客服电话 400-XXX-XXXX 联系我们,我们的工作时间为周一至周五 9:00-18:00。',
category: 'feedback',
expanded: false
}
]
}
},
computed: {
filteredQuestions() {
let result = this.questions
// 按分类筛选
if (this.activeCategory !== 'all') {
result = result.filter(item => item.category === this.activeCategory)
}
// 按关键词搜索
if (this.searchKeyword) {
const keyword = this.searchKeyword.toLowerCase()
result = result.filter(item =>
item.question.toLowerCase().includes(keyword) ||
item.answer.toLowerCase().includes(keyword)
)
}
return result
}
},
methods: {
// 选择分类
selectCategory(value) {
this.activeCategory = value
},
// 搜索处理
handleSearch() {
// 搜索时自动显示所有分类的结果
},
// 清空搜索
clearSearch() {
this.searchKeyword = ''
},
// 展开/收起答案
toggleAnswer(index) {
this.filteredQuestions[index].expanded = !this.filteredQuestions[index].expanded
},
// 跳转到反馈页面
goToFeedback() {
uni.navigateTo({
url: '/pages/ucenter/feedback/index'
})
}
}
}
</script>
<style lang="scss" scoped>
.help-container {
min-height: 100vh;
background: #F8F8F8;
padding-bottom: 40rpx;
}
.search-section {
padding: 30rpx;
background: #fff;
animation: fadeInDown 0.6s ease-out;
.search-box {
display: flex;
align-items: center;
background: #F5F5F5;
border-radius: 48rpx;
padding: 20rpx 30rpx;
.search-input {
flex: 1;
margin-left: 16rpx;
margin-right: 16rpx;
font-size: 28rpx;
color: #333;
}
.clear-btn {
display: flex;
align-items: center;
}
}
}
.category-section {
padding: 20rpx 30rpx 0;
animation: fadeInDown 0.6s ease-out 0.1s both;
.category-scroll {
white-space: nowrap;
.category-list {
display: inline-flex;
padding-bottom: 20rpx;
.category-item {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 16rpx 32rpx;
margin-right: 16rpx;
background: #fff;
border-radius: 48rpx;
font-size: 26rpx;
color: #666;
transition: all 0.3s ease;
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.06);
&.active {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: #fff;
box-shadow: 0 6rpx 20rpx rgba(102, 126, 234, 0.35);
}
&:last-child {
margin-right: 0;
}
.category-text {
white-space: nowrap;
}
}
}
}
}
.faq-section {
margin: 20rpx 30rpx;
animation: fadeInUp 0.6s ease-out 0.2s both;
.faq-list {
.faq-item {
background: #fff;
border-radius: 24rpx;
margin-bottom: 20rpx;
overflow: hidden;
box-shadow: 0 6rpx 20rpx rgba(0, 0, 0, 0.08);
transition: transform 0.3s ease, box-shadow 0.3s ease;
&:active {
transform: scale(0.99);
}
.faq-question {
display: flex;
align-items: center;
justify-content: space-between;
padding: 32rpx 30rpx;
transition: background 0.3s ease;
&:active {
background: #f8f8f8;
}
.question-text {
flex: 1;
font-size: 30rpx;
color: #333;
font-weight: 500;
line-height: 1.5;
margin-right: 20rpx;
}
.arrow-icon {
flex-shrink: 0;
transition: transform 0.3s ease;
}
}
.faq-answer {
max-height: 0;
overflow: hidden;
transition: max-height 0.4s ease, padding 0.4s ease;
background: #FAFAFA;
.answer-text {
display: block;
padding: 0 30rpx;
font-size: 28rpx;
color: #666;
line-height: 1.8;
opacity: 0;
transform: translateY(-10rpx);
transition: opacity 0.3s ease, transform 0.3s ease;
}
&.expanded {
max-height: 500rpx;
padding: 20rpx 0 32rpx;
.answer-text {
opacity: 1;
transform: translateY(0);
}
}
}
}
}
.empty-state {
background: #fff;
border-radius: 24rpx;
padding: 120rpx 40rpx;
text-align: center;
box-shadow: 0 6rpx 20rpx rgba(0, 0, 0, 0.08);
.empty-icon {
display: block;
font-size: 120rpx;
margin-bottom: 30rpx;
opacity: 0.6;
}
.empty-text {
display: block;
font-size: 28rpx;
color: #999;
}
}
}
.feedback-section {
margin: 30rpx;
animation: fadeInUp 0.6s ease-out 0.3s both;
.feedback-card {
display: flex;
align-items: center;
justify-content: space-between;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
border-radius: 24rpx;
padding: 30rpx;
box-shadow: 0 8rpx 24rpx rgba(102, 126, 234, 0.35);
transition: transform 0.3s ease;
&:active {
transform: scale(0.98);
}
.feedback-left {
display: flex;
align-items: center;
.feedback-icon-wrapper {
width: 72rpx;
height: 72rpx;
background: rgba(255, 255, 255, 0.25);
border-radius: 18rpx;
display: flex;
align-items: center;
justify-content: center;
margin-right: 24rpx;
border: 2rpx solid rgba(255, 255, 255, 0.3);
backdrop-filter: blur(10rpx);
}
.feedback-info {
display: flex;
flex-direction: column;
.feedback-title {
font-size: 30rpx;
color: #fff;
font-weight: bold;
margin-bottom: 6rpx;
}
.feedback-desc {
font-size: 24rpx;
color: rgba(255, 255, 255, 0.85);
}
}
}
}
}
.contact-section {
margin: 30rpx;
background: #fff;
border-radius: 24rpx;
overflow: hidden;
box-shadow: 0 6rpx 20rpx rgba(0, 0, 0, 0.08);
animation: fadeInUp 0.6s ease-out 0.4s both;
.contact-item {
display: flex;
align-items: center;
padding: 28rpx 30rpx;
border-bottom: 1rpx solid #f5f5f5;
&:last-child {
border-bottom: none;
}
.contact-label {
font-size: 28rpx;
color: #666;
margin-left: 16rpx;
margin-right: 20rpx;
flex-shrink: 0;
}
.contact-value {
flex: 1;
font-size: 26rpx;
color: #333;
font-weight: 500;
}
}
}
@keyframes fadeInDown {
from {
opacity: 0;
transform: translateY(-30rpx);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(30rpx);
}
to {
opacity: 1;
transform: translateY(0);
}
}
</style>