feat(theme): 实现日夜主题自动切换功能
- 添加日夜主题CSS变量定义,支持琥珀夜光和暖白琥珀两种风格 - 实现主题切换逻辑,根据时间自动切换白天(light)和夜间(dark)主题 - 在App.vue中集成主题初始化和token恢复功能 - 更新全局样式类应用主题颜色变量,包括卡片、文本、边框等 - 创建主题混入(mixin)供各页面使用,确保主题同步更新 - 实现导航栏和TabBar主题动态切换,提升用户体验 - 添加API服务层封装HaveADrink SDK,统一处理认证和请求 - 优化DrinkCard组件显示饮酒感受信息,丰富打卡记录展示 - 更新项目依赖配置,集成新的API客户端库
This commit is contained in:
@@ -190,6 +190,89 @@ export function calcStats(records) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 主题系统:日夜自动切换
|
||||
* 白天:6:00-16:00 → light
|
||||
* 夜间:16:00-6:00 → dark
|
||||
*/
|
||||
export function getCurrentTheme() {
|
||||
const hour = new Date().getHours()
|
||||
return (hour >= 6 && hour < 16) ? 'light' : 'dark'
|
||||
}
|
||||
|
||||
export function applyTheme(theme) {
|
||||
// 同步存储当前主题
|
||||
uni.setStorageSync('current_theme', theme)
|
||||
// 应用导航栏和TabBar主题
|
||||
applyNavBarTheme(theme)
|
||||
applyTabBarTheme(theme)
|
||||
}
|
||||
|
||||
export function applyNavBarTheme(theme) {
|
||||
const colors = {
|
||||
dark: { backgroundColor: '#0B0B14', frontColor: '#ffffff' },
|
||||
light: { backgroundColor: '#FAF7F2', frontColor: '#000000' }
|
||||
}
|
||||
const c = colors[theme] || colors.dark
|
||||
try {
|
||||
uni.setNavigationBarColor({
|
||||
frontColor: c.frontColor,
|
||||
backgroundColor: c.backgroundColor,
|
||||
animation: { duration: 300, timingFunc: 'easeInOut' }
|
||||
})
|
||||
} catch (e) {}
|
||||
}
|
||||
|
||||
export function applyTabBarTheme(theme) {
|
||||
// 仅在 tabBar 页面上调用 setTabBarStyle,避免报错
|
||||
const tabBarPages = ['pages/index/index', 'pages/profile/profile']
|
||||
const pages = getCurrentPages()
|
||||
if (!pages.length) return
|
||||
const currentPath = pages[pages.length - 1].route
|
||||
if (!tabBarPages.includes(currentPath)) return
|
||||
|
||||
const styles = {
|
||||
dark: {
|
||||
color: '#9494AC',
|
||||
selectedColor: '#E8A838',
|
||||
backgroundColor: '#151520',
|
||||
borderStyle: 'black'
|
||||
},
|
||||
light: {
|
||||
color: '#B5AEA0',
|
||||
selectedColor: '#D49530',
|
||||
backgroundColor: '#FFFFFF',
|
||||
borderStyle: 'white'
|
||||
}
|
||||
}
|
||||
const s = styles[theme] || styles.dark
|
||||
try {
|
||||
uni.setTabBarStyle({
|
||||
color: s.color,
|
||||
selectedColor: s.selectedColor,
|
||||
backgroundColor: s.backgroundColor,
|
||||
borderStyle: s.borderStyle
|
||||
})
|
||||
} catch (e) {}
|
||||
}
|
||||
|
||||
export function getThemeColors(theme) {
|
||||
const isDark = theme !== 'light'
|
||||
return {
|
||||
textPrimary: isDark ? '#FFFFFF' : '#2C2416',
|
||||
textSecondary: isDark ? '#C0C0D2' : '#8C8474',
|
||||
textTertiary: isDark ? '#9494AC' : '#B5AEA0',
|
||||
amber: isDark ? '#E8A838' : '#D49530',
|
||||
bgBase: isDark ? '#0B0B14' : '#FAF7F2',
|
||||
bgCard: isDark ? '#1A1A28' : '#FFFFFF',
|
||||
cardGradStart: isDark ? '#1A1510' : '#F5F0E8',
|
||||
cardGradEnd: isDark ? '#0D0B08' : '#EDE8DF',
|
||||
borderSubtle: isDark ? 'rgba(232,168,56,0.15)' : 'rgba(212,149,48,0.2)',
|
||||
bgPlaceholder: isDark ? 'rgba(255,255,255,0.03)' : 'rgba(0,0,0,0.04)',
|
||||
emojiBg: isDark ? 'rgba(232,168,56,0.08)' : 'rgba(212,149,48,0.1)'
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查成就解锁
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user