同步小程序与管理端更新,完善抽烟记录和解绑冷静期

This commit is contained in:
2026-10-09 22:15:51 +08:00
parent a68a4ef411
commit b10fc3c4ac
149 changed files with 3794 additions and 589 deletions
+4 -3
View File
@@ -1,8 +1,9 @@
const { withDataCache } = require('../../utils/page-cache');
const { getLayout } = require('../../utils/layout');
// pages/pet/achievements.js
const { api } = require('../../utils/request');
Page({
Page(withDataCache({
onResize: function() { this.setData(getLayout()); },
data: { loading: true, loadError: false,
achievements: [],
@@ -23,7 +24,7 @@ Page({
loadAchievements: async function() {
if (this._pageLoading) return;
this._pageLoading = true;
this.setData({loading:true, loadError:false});
this.setData({loading: !this._hasCachedData, loadError:false});
try {
const res = await api.petAchievements();
let list = res.achievements || [];
@@ -60,4 +61,4 @@ Page({
goBack: function() {
wx.navigateBack();
}
});
}, {"loadAchievements": ["petAchievements"]}));
+7 -3
View File
@@ -2,7 +2,7 @@
@import '../../styles/common.wxss';
page {
background: linear-gradient(180deg, #F4E2E3 0%, #FAF5EE 55%, #FAF5EE 100%);
background: linear-gradient(180deg, #FDE4EC 0%, #FFF0F5 48%, #FFF7FA 100%);
height: 100vh;
overflow: hidden;
}
@@ -11,12 +11,12 @@ scroll-view.page-bg {
padding-top: 196rpx;
overflow-y: scroll;
-webkit-overflow-scrolling: touch;
background: linear-gradient(180deg, #F4E2E3 0%, #FAF5EE 55%, #FAF5EE 100%);
background: linear-gradient(180deg, #FDE4EC 0%, #FFF0F5 48%, #FFF7FA 100%);
}
/* ===== 顶部导航(与其他页面一致,fixed 定位与微信胶囊对齐) ===== */
.top-nav-card {
background: linear-gradient(180deg, #F4E2E3 0%, #FAF5EE 55%, #FAF5EE 100%);
background: linear-gradient(180deg, #FDE4EC 0%, #FFF0F5 48%, #FFF7FA 100%);
}
.nav-title {
font-size: 34rpx;
@@ -181,3 +181,7 @@ scroll-view.page-bg {
@import '../../styles/journal.wxss';
.adopt-card,.stat-card,.action-card,.dynamics-card,.ach-card { background:#FFFDF8; border:1rpx solid #E9DDD0; box-shadow:none; }.adopt-title,.ach-card-name { color:#352E2A; }.adopt-desc,.ach-card-desc { color:#85776D; }.ach-summary { background:#F4E2E3; color:#943C58; box-shadow:none; }.ach-deco { display:none; }
@import '../../styles/button-theme.wxss';
@import '../../styles/typography.wxss';
+22 -6
View File
@@ -1,3 +1,4 @@
const { withDataCache } = require('../../utils/page-cache');
const { getLayout } = require('../../utils/layout');
// pages/pet/pet.js
const { api } = require('../../utils/request');
@@ -18,9 +19,9 @@ const BREED_EMOJIS = {
const STAGE_NAMES = ['', '幼犬期', '少年期', '青年期', '成年期', '终极期'];
Page({
Page(withDataCache({
onResize: function() { this.setData(getLayout()); },
data: { loading: true, loadError: false,
data: { loading: true, loadError: false, needsBinding: false,
hasPet: false,
pet: null,
daily: null,
@@ -70,8 +71,14 @@ Page({
loadPetInfo: async function() {
if (this._pageLoading) return;
this._pageLoading = true;
this.setData({loading:true, loadError:false});
this.setData({loading: !this._hasCachedData, loadError:false});
try {
const relationship = await api.coupleInfo();
if (relationship.not_bound) {
this.setData({needsBinding:true,hasPet:false,pet:null,daily:null,achievements:[],dynamics:[],displayDynamics:[],showRename:false});
return;
}
this.setData({needsBinding:false});
const res = await api.petInfo();
if (res.has_pet && res.pet) {
const pet = res.pet;
@@ -130,8 +137,12 @@ Page({
this.setData({ hasPet: false, pet:null, daily:null, achievements:[], dynamics:[], displayDynamics:[] });
}
} catch (e) {
this.setData({loadError:true});
console.error(e);
if (e && e.error === '请先绑定情侣') {
this.setData({needsBinding:true,hasPet:false,pet:null,showRename:false});
} else {
this.setData({loadError:true});
console.error(e);
}
}
finally { this._pageLoading = false; this.setData({loading:false}); }
},
@@ -300,10 +311,15 @@ Page({
wx.navigateTo({ url: '/pages/pet/achievements' });
},
bindPartner: function() {
getApp().globalData.openProfileBind = true;
wx.switchTab({url:'/pages/profile/profile'});
},
// 返回
goBack: function() {
wx.navigateBack();
},
stopPropagation: function() {}
});
}, {"loadPetInfo": ["coupleInfo", "petInfo"]}));
+3 -3
View File
@@ -5,7 +5,7 @@
<scroll-view class="page-bg" scroll-y show-scrollbar="{{false}}" bounces="{{true}}">
<view class="c-body">
<page-state wx:if="{{loading}}" kind="loading" title="正在加载" /><page-state wx:elif="{{loadError}}" kind="error" title="加载失败" action="重试" bind:action="loadPetInfo" /><block wx:else>
<page-state wx:if="{{loading}}" kind="loading" title="正在加载" /><page-state wx:elif="{{needsBinding}}" title="绑定另一半后一起养宠物" description="邀请TA加入,一起领养和照顾你们的伙伴" action="去绑定" bind:action="bindPartner" /><page-state wx:elif="{{loadError}}" kind="error" title="加载失败" action="重试" bind:action="loadPetInfo" /><block wx:else>
<!-- ===== 未领养:领养引导 ===== -->
<view wx:if="{{!hasPet}}" class="adopt-section">
@@ -34,7 +34,7 @@
</view>
</view>
<view class="input-group" style="margin-top:32rpx;">
<input class="input" placeholder="给宠物取个名字吧" value="{{petName}}" bindinput="onNameInput" maxlength="20" />
<input placeholder-class="handwritten-placeholder" class="input" placeholder="给宠物取个名字吧" value="{{petName}}" bindinput="onNameInput" maxlength="20" />
</view>
<view class="gender-select">
<view class="gender-option {{genderSelect==1?'active':''}}" bindtap="selectGender" data-gender="1">
@@ -214,7 +214,7 @@
<view wx:if="{{showRename}}" class="modal-overlay" bindtap="hideRenameModal">
<view class="rename-modal" catchtap="stopPropagation">
<text class="rename-modal-title">给宠物改名</text>
<input class="rename-input" placeholder="输入新名字" placeholder-class="rename-placeholder" value="{{renameValue}}" bindinput="onRenameInput" maxlength="20" />
<input class="rename-input" placeholder="输入新名字" placeholder-class="rename-placeholder handwritten-placeholder" value="{{renameValue}}" bindinput="onRenameInput" maxlength="20" />
<view class="rename-actions">
<button class="btn btn-secondary rename-btn" bindtap="hideRenameModal">取消</button>
<button class="btn btn-primary rename-btn" bindtap="doRename" loading="{{renaming}}">确定</button>
+4
View File
@@ -17,3 +17,7 @@
.adopt-hero { text-align:center; margin:12rpx 0 28rpx; }.adopt-hero-emoji { font-size:64rpx; }.adopt-card { background:#FFFDF8; border:1rpx solid #E9DDD0; border-radius:16rpx; padding:28rpx; }.adopt-title { display:block; font-size:31rpx; font-weight:600; color:#352E2A; text-align:center; }.adopt-desc { display:block; font-size:24rpx; line-height:1.6; color:#85776D; margin-top:14rpx; text-align:center; }
.breed-select { display:grid; grid-template-columns:repeat(4,1fr); gap:12rpx; margin-top:28rpx; }.breed-option { display:flex; flex-direction:column; align-items:center; gap:10rpx; padding:18rpx 4rpx; border:1rpx solid #E9DDD0; border-radius:12rpx; }.breed-option.active { background:#F4E2E3; border-color:#D5A6AE; }.breed-emoji { font-size:35rpx; }.breed-name { font-size:22rpx; color:#65594F; }.gender-select { display:flex; gap:16rpx; margin:24rpx 0; }.gender-option { display:flex; flex:1; justify-content:center; padding:20rpx 8rpx; border:1rpx solid #E9DDD0; border-radius:12rpx; color:#85776D; font-size:25rpx; }.gender-option.active { background:#F4E2E3; border-color:#D5A6AE; color:#943C58; }.adopt-btn { width:100%; font-size:26rpx; border-radius:18rpx; padding:24rpx 12rpx; }
.modal-overlay { z-index:1200; }.rename-modal { width:100%; max-width:600rpx; padding:36rpx; background:#FFFDF8; border:1rpx solid #E9DDD0; border-radius:24rpx; box-sizing:border-box; }.rename-modal-title { display:block; color:#352E2A; font-weight:600; font-size:31rpx; margin-bottom:26rpx; }.rename-input { width:100%; height:84rpx; padding:0 20rpx; background:#FAF5EE; border:1rpx solid #E9DDD0; border-radius:14rpx; box-sizing:border-box; font-size:27rpx; }.rename-actions { display:flex; gap:20rpx; margin-top:28rpx; }.rename-btn { flex:1; min-width:0; padding:24rpx 10rpx; font-size:26rpx; }.rename-placeholder { color:#A39386; }
@import '../../styles/button-theme.wxss';
@import '../../styles/typography.wxss';