feat(app): 项目重命名为干杯日记并优化UI设计
- 将应用名称从"喝了么"更改为"干杯日记" - 更新所有相关文件中的品牌标识和描述信息 - 升级HaveADrink依赖包从1.0.3到1.0.4版本 - 在pages.json中新增分享个人资料页面配置 - 重构DrinkCard组件UI,增加装饰背景、酒类图标支持、饮酒感受徽章等功能 - 优化API错误处理逻辑,增加静默模式支持 - 修改白酒类别图标为 urn emoji,黄酒图标为 tea emoji - 添加分享功能按钮并优化页面返回交互体验 - 引入新的工具函数用于获取酒类图标和路径判断 - 更新主题混入、常量定义等基础配置文件 - 调整全局样式和设计令牌以匹配新品牌形象
This commit is contained in:
+22
-11
@@ -1,4 +1,4 @@
|
||||
/* 喝了么 - API 服务层
|
||||
/* 干杯日记 - API 服务层
|
||||
* 基于 HaveADrink SDK 封装后端接口
|
||||
*/
|
||||
import HaveADrink from 'HaveADrink'
|
||||
@@ -13,6 +13,8 @@ const API_HOST = 'https://dev.wash-painting.cn'
|
||||
// 参考 goodBooth 项目的 fetchsomething
|
||||
// ==========================================
|
||||
function httpRequest(url, params) {
|
||||
// 支持静默模式(如后台刷新token),不弹 toast 不跳转
|
||||
const silent = params.silent === true
|
||||
return new Promise((resolve, reject) => {
|
||||
// 自动注入 Authorization token
|
||||
const headers = Object.assign({}, params.headers || {})
|
||||
@@ -31,23 +33,31 @@ function httpRequest(url, params) {
|
||||
const code = res.statusCode
|
||||
if (code === 200 || code === 201 || code === 204) {
|
||||
resolve(res.data)
|
||||
} else if (code === 401) {
|
||||
// token 过期,清除登录态并跳转登录页
|
||||
} else if (code === 401 || code === 418) {
|
||||
// token/refresh_token 过期或无效,清除登录态
|
||||
uni.removeStorageSync('auth_token')
|
||||
uni.removeStorageSync('refresh_token')
|
||||
uni.removeStorageSync('is_logged_in')
|
||||
uni.reLaunch({ url: '/pages/login/login' })
|
||||
reject({ msg: '登录已过期,请重新登录' })
|
||||
if (!silent) {
|
||||
uni.reLaunch({ url: '/pages/login/login' })
|
||||
uni.showToast({ title: '登录已过期,请重新登录', icon: 'none', duration: 2500 })
|
||||
}
|
||||
reject({ msg: '登录已过期,请重新登录', code })
|
||||
} else {
|
||||
const rawMsg = (res.data && res.data.msg) || (res.data && res.data.errmsg) || '请求失败'
|
||||
const errMsg = `[${code}] ${rawMsg}`
|
||||
uni.showToast({ title: errMsg, icon: 'none', duration: 2500 })
|
||||
if (!silent) {
|
||||
uni.showToast({ title: errMsg, icon: 'none', duration: 2500 })
|
||||
}
|
||||
reject({ msg: errMsg, code })
|
||||
}
|
||||
},
|
||||
fail: (err) => {
|
||||
uni.showToast({ title: err.errMsg || '网络请求失败', icon: 'none', duration: 2500 })
|
||||
reject({ msg: err.errMsg || '网络请求失败' })
|
||||
const msg = (err && err.errMsg) || '网络请求失败'
|
||||
if (!silent) {
|
||||
uni.showToast({ title: msg, icon: 'none', duration: 2500 })
|
||||
}
|
||||
reject({ msg })
|
||||
}
|
||||
})
|
||||
})
|
||||
@@ -127,19 +137,20 @@ export function clearAuth() {
|
||||
client.setToken('')
|
||||
}
|
||||
|
||||
/** 尝试用 refresh_token 刷新 token */
|
||||
/** 尝试用 refresh_token 刷新 token(静默,不弹提示不跳转) */
|
||||
export async function refreshAuthToken() {
|
||||
const refreshToken = uni.getStorageSync('refresh_token')
|
||||
if (!refreshToken) return false
|
||||
try {
|
||||
const res = await client.RefreshToken({ refresh_token: refreshToken })
|
||||
const res = await client.RefreshToken({ refresh_token: refreshToken, silent: true })
|
||||
if (res && res.token) {
|
||||
saveAuthTokens(res)
|
||||
return true
|
||||
}
|
||||
return false
|
||||
} catch (e) {
|
||||
console.warn('刷新 token 失败:', e)
|
||||
// 静默失败:refresh token 无效时清除残留凭证
|
||||
uni.removeStorageSync('refresh_token')
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
+4
-4
@@ -1,12 +1,12 @@
|
||||
/* 喝了么 - 常量定义 */
|
||||
/* 干杯日记 - 常量定义 */
|
||||
|
||||
// 酒类分类
|
||||
export const DRINK_CATEGORIES = [
|
||||
{ id: 'baijiu', name: '白酒', emoji: '🥃', defaultDegree: 52 },
|
||||
{ id: 'baijiu', name: '白酒', emoji: '⚱️', icon: '/static/icons/baijiu.svg', defaultDegree: 52 },
|
||||
{ id: 'beer', name: '啤酒', emoji: '🍺', defaultDegree: 5 },
|
||||
{ id: 'wine', name: '红酒', emoji: '🍷', defaultDegree: 13 },
|
||||
{ id: 'whisky', name: '洋酒', emoji: '🥂', defaultDegree: 40 },
|
||||
{ id: 'huangjiu', name: '黄酒', emoji: '🍶', defaultDegree: 15 },
|
||||
{ id: 'huangjiu', name: '黄酒', emoji: '🫖', defaultDegree: 15 },
|
||||
{ id: 'sake', name: '清酒', emoji: '🍶', defaultDegree: 15 },
|
||||
{ id: 'fruit', name: '果酒', emoji: '🍹', defaultDegree: 8 },
|
||||
{ id: 'cocktail', name: '调酒', emoji: '🍸', defaultDegree: 15 },
|
||||
@@ -176,7 +176,7 @@ export const ACHIEVEMENTS = [
|
||||
id: 'baijiu_master',
|
||||
name: '白酒达人',
|
||||
desc: '白酒累计打卡20次',
|
||||
icon: '🥃',
|
||||
icon: '⚱️',
|
||||
condition: { type: 'category_records', category: 'baijiu', value: 20 }
|
||||
},
|
||||
{
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
/* 喝了么 - Mock 数据 */
|
||||
/* 干杯日记 - Mock 数据 */
|
||||
import { formatDate, calcStandardCups, unitToMl } from './utils'
|
||||
|
||||
// 模拟用户数据
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* 喝了么 - 主题混入 (Theme Mixin)
|
||||
/* 干杯日记 - 主题混入 (Theme Mixin)
|
||||
* 每个页面混入此mixin,自动在onShow时刷新日夜主题
|
||||
* 页面根视图需绑定 :class="themeClass"
|
||||
*/
|
||||
|
||||
+16
-1
@@ -1,4 +1,19 @@
|
||||
/* 喝了么 - 工具函数 */
|
||||
/* 干杯日记 - 工具函数 */
|
||||
|
||||
import { DRINK_CATEGORIES } from './constants'
|
||||
|
||||
/**
|
||||
* 获取酒类图标:优先返回自定义图片路径,否则返回 emoji
|
||||
*/
|
||||
export function getCatIcon(catId) {
|
||||
const cat = DRINK_CATEGORIES.find(c => c.id === catId)
|
||||
if (!cat) return '🥃'
|
||||
return cat.icon || cat.emoji
|
||||
}
|
||||
|
||||
export function isIconPath(val) {
|
||||
return typeof val === 'string' && val.charAt(0) === '/'
|
||||
}
|
||||
|
||||
/**
|
||||
* 标准杯换算引擎
|
||||
|
||||
Reference in New Issue
Block a user