更新:增加“我的书单”功能

This commit is contained in:
2025-11-10 09:16:28 +08:00
parent 33f861fa14
commit 577e782cd8
25 changed files with 4515 additions and 37 deletions

View File

@@ -42,27 +42,72 @@
</view>
</wd-popup>
<!-- 语言选择弹窗 -->
<wd-popup v-model="showLanguageSelect" position="bottom" :closeable="true">
<view class="language-modal">
<text class="modal-title">{{ $t('user.languageSelect') }}</text>
<view class="language-list">
<view
v-for="lang in availableLanguages"
:key="lang.code"
class="language-item"
:class="{ active: (userStore.language || uni.getLocale()) === lang.code }"
@click="selectLanguage(lang.code)"
>
<text class="language-name">{{ lang.name }}</text>
<wd-icon v-if="(userStore.language || uni.getLocale()) === lang.code" name="check" size="20px" color="#54a966" />
</view>
</view>
</view>
</wd-popup>
<wd-message-box />
</view>
</template>
<script setup lang="ts">
import { ref, computed, onMounted } from 'vue'
import { useSysStore } from '@/stores/sys'
import { useUserStore } from '@/stores/user'
import { useI18n } from 'vue-i18n'
import { useMessage } from '@/uni_modules/wot-design-uni'
import { makePhoneCall, copyToClipboard } from '@/utils/index'
const { t } = useI18n()
const { t, locale } = useI18n()
const sysStore = useSysStore()
const userStore = useUserStore()
const message = useMessage()
// 导航栏高度
const statusBarHeight = ref(0)
const navbarHeight = ref('44px')
// 弹窗状态
const showQrCode = ref(false)
const showLanguageSelect = ref(false)
// 可选语言列表
const availableLanguages = computed(() => [
{ code: 'en', name: t('locale.en') },
{ code: 'zh-Hans', name: t('locale.zh-hans') }
])
// 获取当前语言名称
const getCurrentLanguageName = () => {
const currentLang = userStore.language || uni.getLocale()
const language = availableLanguages.value.find(lang => lang.code === currentLang)
return language ? language.name : currentLang
}
// 设置项列表
const settingItems = computed(() => [
{
id: 0,
label: t('user.language'),
value: getCurrentLanguageName(),
type: 'language'
},
{
id: 1,
label: t('user.hotline'),
@@ -89,9 +134,6 @@ const settingItems = computed(() => [
}
])
// 弹窗状态
const showQrCode = ref(false)
/**
* 获取导航栏高度
*/
@@ -113,6 +155,9 @@ const getNavbarHeight = () => {
*/
const handleSettingClick = (item: any) => {
switch (item.type) {
case 'language':
showLanguageSelect.value = true
break
case 'tel':
handlePhoneCall(item.value, item.label)
break
@@ -152,6 +197,27 @@ const previewQrCode = () => {
})
}
/**
* 选择语言
*/
const selectLanguage = (languageCode: string) => {
try {
uni.setLocale(languageCode)
// 保存语言设置到用户存储
sysStore.setLanguage(languageCode)
// 更新i18n语言
locale.value = languageCode
} catch (error) {
console.error('语言切换失败:', error)
uni.showToast({
title: t('user.languageChangeFailed'),
icon: 'none'
})
}
}
/**
* 检查版本更新
*/
@@ -337,4 +403,40 @@ $theme-color: #54a966;
margin: 0 auto;
}
}
.language-modal {
padding: 40rpx;
.modal-title {
display: block;
font-size: 32rpx;
font-weight: bold;
color: #333;
margin-bottom: 30rpx;
text-align: center;
}
.language-list {
.language-item {
display: flex;
align-items: center;
justify-content: space-between;
padding: 30rpx 20rpx;
border-bottom: 1rpx solid #f0f0f0;
&.active {
background-color: #f7faf9;
}
&:last-child {
border-bottom: none;
}
.language-name {
font-size: 30rpx;
color: #333;
}
}
}
}
</style>