diff --git a/App.vue b/App.vue
index 37d64e9..8a02f6c 100644
--- a/App.vue
+++ b/App.vue
@@ -59,17 +59,12 @@ export default {
}
} catch (e) { /* ignore */ }
},
- // 启动时检查登录与引导状态,决定跳转目标
+ // 启动时检查引导状态,决定跳转目标
checkLaunchRoute() {
const isFirst = uni.getStorageSync('is_first_launch')
- const isLoggedIn = uni.getStorageSync('is_logged_in')
-
if (!isFirst || isFirst === 'true') {
// 首次使用 → 引导页
uni.reLaunch({ url: '/pages/onboarding/onboarding' })
- } else if (!isLoggedIn || isLoggedIn !== 'true') {
- // 未登录 → 登录页
- uni.reLaunch({ url: '/pages/login/login' })
}
// 否则正常进入首页(index)
}
@@ -98,6 +93,7 @@ page {
background-color: $bg-base;
color: $text-primary;
padding-bottom: env(safe-area-inset-bottom);
+ box-sizing: border-box;
}
.card {
@@ -255,6 +251,35 @@ page {
}
}
+/* 添加酒水按钮(Step 1 底部) */
+.btn-add-drink {
+ background: linear-gradient(135deg, $amber, $amber-deep);
+ color: $text-on-amber;
+ font-size: $fs-md;
+ font-weight: $fw-bold;
+ padding: $sp-md $sp-xl;
+ border-radius: $radius-full;
+ border: none;
+ text-align: center;
+ box-shadow: $shadow-amber;
+ transition: all $duration-fast $ease-out;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ &:active {
+ transform: scale(0.97);
+ box-shadow: 0 4rpx 16rpx rgba(232, 168, 56, 0.2);
+ }
+
+ &[disabled] {
+ background: transparent;
+ color: $text-tertiary;
+ border: 2rpx solid var(--border-subtle, rgba(255, 255, 255, 0.10));
+ box-shadow: none;
+ }
+}
+
.btn-text {
background: none;
border: none;
diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json
index 5f675e1..f9cc112 100644
--- a/node_modules/.package-lock.json
+++ b/node_modules/.package-lock.json
@@ -4,9 +4,9 @@
"requires": true,
"packages": {
"node_modules/HaveADrink": {
- "version": "1.0.2",
- "resolved": "https://npm.wash-painting.cn/HaveADrink/-/HaveADrink-1.0.2.tgz",
- "integrity": "sha512-rhcILwsr6F1SBK7z+C4HMemUHHd63pl5ggxHisky0ZDgCOL7bITf3TGgvoiqXRoAGe4qmV+4FT8E6oCbvD1PIg==",
+ "version": "1.0.3",
+ "resolved": "https://npm.wash-painting.cn/HaveADrink/-/HaveADrink-1.0.3.tgz",
+ "integrity": "sha512-Mp4WRwqFmrf9CQhlF+gdJQ4YGRZkrBSbcu1l+XF4nq5dZmrFW7iggzFH4XSIXewBME1svk+cMhN6vetZVVOA6Q==",
"license": "ISC"
}
}
diff --git a/node_modules/HaveADrink/README.md b/node_modules/HaveADrink/README.md
index 9196d80..4b1a0f1 100644
--- a/node_modules/HaveADrink/README.md
+++ b/node_modules/HaveADrink/README.md
@@ -14,7 +14,7 @@
* 6. 社交模块 - 朋友圈动态、点赞
-**版本:** v1.0.2
+**版本:** v1.0.3
## 安装
@@ -816,18 +816,12 @@ client.DeleteRecord(req).then(...).catch(...)
#### 返回值
|名称|类型|说明|
|:-|:-:|:-|
-|data|`CalendarData`| 日历数据
|
+|year|`number`| 年份
|
+|month|`number`| 月份
|
+|days|`Array`| 每天的打卡数据,null表示当天无记录
|
-**CalendarData**
-|名称|类型|说明|
-|:-|:-|:-|
-|year|`number`| 年份|
-|month|`number`| 月份|
-|days|`Array`| 每天的打卡数据,null表示当天无记录|
-
-
**CalendarDayData**
|名称|类型|说明|
|:-|:-|:-|
@@ -835,6 +829,57 @@ client.DeleteRecord(req).then(...).catch(...)
|hasRecord|`boolean`| 是否有记录|
|mode|`Mode`| 打卡模式|
|standardCupsTotal|`number`| 标准杯总数|
+|id|`string\|number`| 记录ID|
+|drinks|`Array`| 酒水列表|
+|food|`FoodInfo`| 配餐信息|
+|feeling|`Feeling`| 感受|
+|photos|`Array`| 照片URL数组|
+|visibility|`Visibility`| 可见范围|
+|quote|`string`| 酒言酒语|
+|createdAt|`string`| 创建时间|
+
+
+**Mode**
+|名称|值|类型|说明|
+|:-|:-:|:-|:-|
+|Drank|"drank"|`Mode`|今日喝了|
+|Abstain|"abstain"|`Mode`|今日未喝|
+
+
+**DrinkItem**
+|名称|类型|说明|
+|:-|:-|:-|
+|category|`Category`| 酒类分类ID|
+|brand|`string`| 品牌名称|
+|product|`string`| 产品名|
+|amount|`number`| 饮用量数值|
+|unit|`Unit`| 单位|
+|degree|`number`| 酒精度数(%)|
+|standardCups|`number`| 标准杯数(前端计算,后端应校验)|
+
+
+**FoodInfo**
+|名称|类型|说明|
+|:-|:-|:-|
+|category|`FoodCategory`| 配餐分类ID|
+|name|`string`| 具体菜名|
+
+
+**Feeling**
+|名称|值|类型|说明|
+|:-|:-:|:-|:-|
+|Tipsy|"tipsy"|`Feeling`|微醺|
+|Buzzed|"buzzed"|`Feeling`|到位|
+|Drunk|"drunk"|`Feeling`|醉了|
+|Blackout|"blackout"|`Feeling`|断片|
+
+
+**Visibility**
+|名称|值|类型|说明|
+|:-|:-:|:-|:-|
+|Public|"public"|`Visibility`|公开|
+|Friends|"friends"|`Visibility`|仅好友|
+|Private|"private"|`Visibility`|仅自己|
diff --git a/node_modules/HaveADrink/index.d.ts b/node_modules/HaveADrink/index.d.ts
index 9aa88e2..192ac28 100644
--- a/node_modules/HaveADrink/index.d.ts
+++ b/node_modules/HaveADrink/index.d.ts
@@ -1594,14 +1594,54 @@ export declare class CalendarDayData {
* 标准杯总数
*/
standardCupsTotal: number;
+ /**
+ * 记录ID
+ */
+ id: string|number;
+ /**
+ * 酒水列表
+ */
+ drinks: Array;
+ /**
+ * 配餐信息
+ */
+ food: FoodInfo;
+ /**
+ * 感受
+ */
+ feeling: Feeling;
+ /**
+ * 照片URL数组
+ */
+ photos: Array;
+ /**
+ * 可见范围
+ */
+ visibility: Visibility;
+ /**
+ * 酒言酒语
+ */
+ quote: string;
+ /**
+ * 创建时间
+ */
+ createdAt: string;
/**
* @param date string 日期YYYY-MM-DD
* @param hasRecord boolean 是否有记录
* @param mode Mode 打卡模式
* @param standardCupsTotal number 标准杯总数
+ * @param id string|number 记录ID
+ * @param drinks Array 酒水列表
+ * @param food FoodInfo 配餐信息
+ * @param feeling Feeling 感受
+ * @param photos Array 照片URL数组
+ * @param visibility Visibility 可见范围
+ * @param quote string 酒言酒语
+ * @param createdAt string 创建时间
*/
- constructor(date: string,hasRecord: boolean,mode: Mode,standardCupsTotal: number,);
+ constructor(date: string,hasRecord: boolean,mode: Mode,standardCupsTotal: number,id: string|number,drinks: Array,food: FoodInfo,feeling: Feeling,photos: Array,visibility: Visibility,quote: string,createdAt: string,);
/**
* 从对象创建 CalendarDayData
*
@@ -1610,6 +1650,14 @@ export declare class CalendarDayData {
* - hasRecord: boolean, // 是否有记录
* - mode: Mode, // 打卡模式
* - standardCupsTotal: number, // 标准杯总数
+ * - id: string|number, // 记录ID
+ * - drinks: Array, // 酒水列表
+ * - food: FoodInfo, // 配餐信息
+ * - feeling: Feeling, // 感受
+ * - photos: Array, // 照片URL数组
+ * - visibility: Visibility, // 可见范围
+ * - quote: string, // 酒言酒语
+ * - createdAt: string, // 创建时间
*/
static fromObject(o: Object): CalendarDayData;
}
@@ -1620,19 +1668,31 @@ export declare class CalendarDayData {
export declare class GetCalendarResp {
[key: string]: any;
/**
- * 日历数据
+ * 年份
*/
- data: CalendarData;
+ year: number;
+ /**
+ * 月份
+ */
+ month: number;
+ /**
+ * 每天的打卡数据,null表示当天无记录
+ */
+ days: Array;
/**
- * @param data CalendarData 日历数据
+ * @param year number 年份
+ * @param month number 月份
+ * @param days Array 每天的打卡数据,null表示当天无记录
*/
- constructor(data: CalendarData,);
+ constructor(year: number,month: number,days: Array,);
/**
* 从对象创建 GetCalendarResp
*
* @param o Object
- * - data: CalendarData, // 日历数据
+ * - year: number, // 年份
+ * - month: number, // 月份
+ * - days: Array, // 每天的打卡数据,null表示当天无记录
*/
static fromObject(o: Object): GetCalendarResp;
}
diff --git a/node_modules/HaveADrink/index.js b/node_modules/HaveADrink/index.js
index 6202c4b..d130d35 100644
--- a/node_modules/HaveADrink/index.js
+++ b/node_modules/HaveADrink/index.js
@@ -1165,16 +1165,32 @@ export class CalendarDayData {
* @param hasRecord: boolean 是否有记录
* @param mode: Mode 打卡模式
* @param standardCupsTotal: number 标准杯总数
+ * @param id: string|number 记录ID
+ * @param drinks: Array 酒水列表
+ * @param food: FoodInfo 配餐信息
+ * @param feeling: Feeling 感受
+ * @param photos: Array 照片URL数组
+ * @param visibility: Visibility 可见范围
+ * @param quote: string 酒言酒语
+ * @param createdAt: string 创建时间
*/
- constructor(date,hasRecord,mode,standardCupsTotal,) {
+ constructor(date,hasRecord,mode,standardCupsTotal,id,drinks,food,feeling,photos,visibility,quote,createdAt,) {
this.date = date;
this.hasRecord = hasRecord;
this.mode = mode;
this.standardCupsTotal = standardCupsTotal;
+ this.id = id;
+ this.drinks = drinks;
+ this.food = food;
+ this.feeling = feeling;
+ this.photos = photos;
+ this.visibility = visibility;
+ this.quote = quote;
+ this.createdAt = createdAt;
}
static fromObject(o) {
- return new CalendarDayData(o.date,o.hasRecord,o.mode,o.standardCupsTotal,);
+ return new CalendarDayData(o.date,o.hasRecord,o.mode,o.standardCupsTotal,o.id,o.drinks,o.food,o.feeling,o.photos,o.visibility,o.quote,o.createdAt,);
}
}
@@ -1183,14 +1199,18 @@ export class CalendarDayData {
*/
export class GetCalendarResp {
/**
- * @param data: CalendarData 日历数据
+ * @param year: number 年份
+ * @param month: number 月份
+ * @param days: Array 每天的打卡数据,null表示当天无记录
*/
- constructor(data,) {
- this.data = data;
+ constructor(year,month,days,) {
+ this.year = year;
+ this.month = month;
+ this.days = days;
}
static fromObject(o) {
- return new GetCalendarResp(o.data,);
+ return new GetCalendarResp(o.year,o.month,o.days,);
}
}
diff --git a/node_modules/HaveADrink/package.json b/node_modules/HaveADrink/package.json
index 7e8edbe..39e6d7d 100644
--- a/node_modules/HaveADrink/package.json
+++ b/node_modules/HaveADrink/package.json
@@ -1,7 +1,7 @@
{
"name": "HaveADrink",
"type": "module",
- "version": "v1.0.2",
+ "version": "v1.0.3",
"description": "喝酒了么 API 服务",
"main": "index.js",
"scripts": {
diff --git a/package-lock.json b/package-lock.json
index a114846..a39a457 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -5,13 +5,13 @@
"packages": {
"": {
"dependencies": {
- "HaveADrink": "^1.0.2"
+ "HaveADrink": "^1.0.3"
}
},
"node_modules/HaveADrink": {
- "version": "1.0.2",
- "resolved": "https://npm.wash-painting.cn/HaveADrink/-/HaveADrink-1.0.2.tgz",
- "integrity": "sha512-rhcILwsr6F1SBK7z+C4HMemUHHd63pl5ggxHisky0ZDgCOL7bITf3TGgvoiqXRoAGe4qmV+4FT8E6oCbvD1PIg==",
+ "version": "1.0.3",
+ "resolved": "https://npm.wash-painting.cn/HaveADrink/-/HaveADrink-1.0.3.tgz",
+ "integrity": "sha512-Mp4WRwqFmrf9CQhlF+gdJQ4YGRZkrBSbcu1l+XF4nq5dZmrFW7iggzFH4XSIXewBME1svk+cMhN6vetZVVOA6Q==",
"license": "ISC"
}
}
diff --git a/package.json b/package.json
index 1771a26..d37c6c3 100644
--- a/package.json
+++ b/package.json
@@ -1,5 +1,5 @@
{
"dependencies": {
- "HaveADrink": "^1.0.2"
+ "HaveADrink": "^1.0.3"
}
}
diff --git a/pages/card/card.vue b/pages/card/card.vue
index 8cd1f74..f39514f 100644
--- a/pages/card/card.vue
+++ b/pages/card/card.vue
@@ -1,6 +1,6 @@
-
+
‹
@@ -21,6 +21,9 @@
+
@@ -41,7 +44,9 @@ export default {
mixins: [themeMixin],
components: { DrinkCard },
data() {
+ const sysInfo = uni.getSystemInfoSync()
return {
+ statusBarHeight: sysInfo.statusBarHeight || 25,
record: null,
saving: false,
saved: false
@@ -410,8 +415,9 @@ export default {
shareToFriend() { uni.showToast({ title: '点击右上角分享', icon: 'none' }) },
goBack() {
+ console.log('goBack called, saved:', this.saved)
if (this.saved) {
- uni.navigateBack()
+ this._doBack()
return
}
uni.showModal({
@@ -420,12 +426,34 @@ export default {
confirmText: '保存并离开',
cancelText: '直接离开',
success: async (res) => {
+ console.log('modal result:', res)
if (res.confirm) {
- await this.saveToAlbum()
+ try { await this.saveToAlbum() } catch (e) { /* ignore */ }
}
- uni.navigateBack()
+ this._doBack()
+ },
+ fail: (err) => {
+ console.error('showModal fail:', err)
+ this._doBack()
}
})
+ },
+ closeToHome() {
+ uni.switchTab({ url: '/pages/index/index' })
+ },
+ _doBack() {
+ console.log('_doBack called, pages:', getCurrentPages().length)
+ if (getCurrentPages().length > 1) {
+ uni.navigateBack({
+ fail: (err) => {
+ console.error('navigateBack fail:', err)
+ uni.reLaunch({ url: '/pages/index/index' })
+ }
+ })
+ } else {
+ console.log('no pages to go back to, reLaunch to index')
+ uni.reLaunch({ url: '/pages/index/index' })
+ }
}
},
onShareAppMessage() {
@@ -452,6 +480,7 @@ export default {
align-items: center;
gap: $sp-md;
padding: $sp-md $sp-lg;
+ padding-top: 0;
}
.step-back {
@@ -462,6 +491,7 @@ export default {
justify-content: center;
border-radius: $radius-full;
background: $bg-card;
+ flex-shrink: 0;
}
.step-back-arrow {
@@ -524,6 +554,17 @@ export default {
justify-content: center;
}
+.close-home-btn {
+ width: 100%;
+ background: transparent;
+ border: none;
+ color: $text-tertiary;
+ font-size: $fs-sm;
+ padding: $sp-sm 0;
+
+ &::after { display: none; }
+}
+
.export-canvas {
position: fixed;
left: -9999px;
diff --git a/pages/index/index.vue b/pages/index/index.vue
index e454ac4..cd2be9f 100644
--- a/pages/index/index.vue
+++ b/pages/index/index.vue
@@ -91,7 +91,7 @@
- {{ drink.emoji || '🥃' }} {{ drink.brand }} {{ drink.product }}
+ {{ getCatEmoji(drink.category) }} {{ drink.brand }} {{ drink.product }}
@@ -118,8 +118,9 @@