Files
Blizzard b854d2873e feat: require couple binding and refine miniapp settings
Gate record features and storage entry points with invitation guidance; enforce record access in the backend. Add homepage greetings, right-swipe profile dismissal, and move the smoking switch to settings. Simplify API base configuration and remove the unused legacy tab bar component.
2026-11-04 21:27:03 +08:00

226 lines
12 KiB
Plaintext

<view wx:if="{{!recordAccessBlocked}}" capture-bind:tap="onLoginSubscribeTap" class="app-shell app-shell--secondary" style="{{layoutStyle}}">
<launch-transition />
<!-- pages/pet/pet.wxml -->
<app-nav title="宠物养成" back="{{true}}" />
<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="{{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">
<view class="adopt-hero">
<text class="adopt-hero-emoji">🐾</text>
</view>
<view class="adopt-card">
<text class="adopt-title">领养一只属于我们的宠物</text>
<text class="adopt-desc">一起照顾它,见证它成长</text>
<view class="breed-select">
<view class="breed-option {{breedSelect=='golden'?'active':''}}" bindtap="selectBreed" data-breed="golden">
<text class="breed-emoji">🐕</text>
<text class="breed-name">金毛</text>
</view>
<view class="breed-option {{breedSelect=='husky'?'active':''}}" bindtap="selectBreed" data-breed="husky">
<text class="breed-emoji">🐺</text>
<text class="breed-name">哈士奇</text>
</view>
<view class="breed-option {{breedSelect=='corgi'?'active':''}}" bindtap="selectBreed" data-breed="corgi">
<text class="breed-emoji">🦊</text>
<text class="breed-name">柯基</text>
</view>
<view class="breed-option {{breedSelect=='shiba'?'active':''}}" bindtap="selectBreed" data-breed="shiba">
<text class="breed-emoji">🐶</text>
<text class="breed-name">柴犬</text>
</view>
</view>
<view class="input-group" style="margin-top:32rpx;">
<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">
<text>♂ 男孩</text>
</view>
<view class="gender-option {{genderSelect==2?'active':''}}" bindtap="selectGender" data-gender="2">
<text>♀ 女孩</text>
</view>
</view>
<button class="btn btn-primary adopt-btn" bindtap="doAdopt" loading="{{adopting}}">领养我们的伙伴</button>
</view>
</view>
<!-- ===== 已领养:宠物主界面 ===== -->
<view wx:else class="pet-main">
<view class="pet-profile">
<view class="pet-profile-heading"><text class="j-eyebrow">OUR LITTLE COMPANION</text><view class="pet-profile-actions"><view bindtap="showRenameModal">改名</view><view bindtap="goToAchievements">成就</view></view></view>
<view class="pet-profile-main"><view class="pet-avatar-wrap"><view class="pet-avatar-ring"><text class="pet-avatar">{{petEmoji}}</text></view><view class="pet-equip" wx:if="{{equippedCollar}}"><text>🎀</text></view></view><view class="pet-profile-info"><view class="pet-name-row"><text class="pet-name">{{pet.name}}</text><text class="pet-gender-text">{{pet.gender==1?'♂':'♀'}}</text></view><text class="pet-description">{{breedName}} · {{stageName}}</text><text class="pet-adopt-days">一起照顾了 {{adoptDays || 0}} 天</text></view></view>
<view class="pet-level-bar"><text class="level-label">Lv.{{pet.level}}</text><view class="exp-track"><view class="exp-fill" style="width:{{expProgress}}%;" /></view><text class="exp-text">{{pet.exp}} / {{expForNextLevel}}</text></view>
</view>
<!-- 属性卡片 -->
<view class="stats-grid">
<view class="stat-card stat-happiness">
<view class="stat-head">
<text class="stat-icon">😊</text>
<text class="stat-label">心情</text>
<text class="stat-value">{{pet.happiness}}</text>
</view>
<view class="stat-bar"><view class="stat-fill" style="width:{{pet.happiness}}%;"></view></view>
</view>
<view class="stat-card stat-hunger">
<view class="stat-head">
<text class="stat-icon">🍖</text>
<text class="stat-label">饱腹</text>
<text class="stat-value">{{pet.hunger}}</text>
</view>
<view class="stat-bar"><view class="stat-fill" style="width:{{pet.hunger}}%;"></view></view>
</view>
<view class="stat-card stat-energy">
<view class="stat-head">
<text class="stat-icon">⚡</text>
<text class="stat-label">精力</text>
<text class="stat-value">{{pet.energy}}</text>
</view>
<view class="stat-bar"><view class="stat-fill" style="width:{{pet.energy}}%;"></view></view>
</view>
<view class="stat-card stat-cleanliness">
<view class="stat-head">
<text class="stat-icon">✨</text>
<text class="stat-label">清洁</text>
<text class="stat-value">{{pet.cleanliness}}</text>
</view>
<view class="stat-bar"><view class="stat-fill" style="width:{{pet.cleanliness}}%;"></view></view>
</view>
</view>
<!-- 今日任务 -->
<view class="section-title">
<text>今日照顾</text>
<text class="section-subtitle">一起完成</text>
</view>
<view class="daily-grid">
<view class="daily-item {{dailyStatus.feed?'done':''}}" bindtap="doDailyAction" data-action="feed">
<view class="daily-icon-wrap">
<text class="daily-icon">🍖</text>
<view class="daily-check {{dailyStatus.feed?'checked':''}}">
<text wx:if="{{dailyStatus.feed}}">✓</text>
</view>
</view>
<text class="daily-label">喂食</text>
<text class="daily-partner {{partnerDaily.feed?'partner-done':''}}">{{partnerDaily.feed ? 'TA已完成' : 'TA未完成'}}</text>
</view>
<view class="daily-item {{dailyStatus.water?'done':''}}" bindtap="doDailyAction" data-action="water">
<view class="daily-icon-wrap">
<text class="daily-icon">💧</text>
<view class="daily-check {{dailyStatus.water?'checked':''}}">
<text wx:if="{{dailyStatus.water}}">✓</text>
</view>
</view>
<text class="daily-label">喂水</text>
<text class="daily-partner {{partnerDaily.water?'partner-done':''}}">{{partnerDaily.water ? 'TA已完成' : 'TA未完成'}}</text>
</view>
<view class="daily-item {{dailyStatus.walk?'done':''}}" bindtap="doDailyAction" data-action="walk">
<view class="daily-icon-wrap">
<text class="daily-icon">🐾</text>
<view class="daily-check {{dailyStatus.walk?'checked':''}}">
<text wx:if="{{dailyStatus.walk}}">✓</text>
</view>
</view>
<text class="daily-label">遛狗</text>
<text class="daily-partner {{partnerDaily.walk?'partner-done':''}}">{{partnerDaily.walk ? 'TA已完成' : 'TA未完成'}}</text>
</view>
<view class="daily-item {{dailyStatus.bath?'done':''}}" bindtap="doDailyAction" data-action="bath">
<view class="daily-icon-wrap">
<text class="daily-icon">🛁</text>
<view class="daily-check {{dailyStatus.bath?'checked':''}}">
<text wx:if="{{dailyStatus.bath}}">✓</text>
</view>
</view>
<text class="daily-label">洗澡</text>
<text class="daily-partner {{partnerDaily.bath?'partner-done':''}}">{{partnerDaily.bath ? 'TA已完成' : 'TA未完成'}}</text>
</view>
<view class="daily-item {{dailyStatus.sleep?'done':''}}" bindtap="doDailyAction" data-action="sleep">
<view class="daily-icon-wrap">
<text class="daily-icon">😴</text>
<view class="daily-check {{dailyStatus.sleep?'checked':''}}">
<text wx:if="{{dailyStatus.sleep}}">✓</text>
</view>
</view>
<text class="daily-label">睡觉</text>
<text class="daily-partner {{partnerDaily.sleep?'partner-done':''}}">{{partnerDaily.sleep ? 'TA已完成' : 'TA未完成'}}</text>
</view>
<view class="daily-item {{dailyStatus.play?'done':''}}" bindtap="doDailyAction" data-action="play">
<view class="daily-icon-wrap">
<text class="daily-icon">🎾</text>
<view class="daily-check {{dailyStatus.play?'checked':''}}">
<text wx:if="{{dailyStatus.play}}">✓</text>
</view>
</view>
<text class="daily-label">玩耍</text>
<text class="daily-partner {{partnerDaily.play?'partner-done':''}}">{{partnerDaily.play ? 'TA已完成' : 'TA未完成'}}</text>
</view>
</view>
<!-- 全部完成庆祝 -->
<view wx:if="{{allDone}}" class="all-done-banner">
<text>今天的照顾已完成,辛苦啦</text>
</view>
<!-- 成就入口 -->
<view class="section-title">
<text>成长纪念</text>
<text class="section-subtitle" bindtap="goToAchievements">查看全部 →</text>
</view>
<view class="achievement-strip">
<view wx:for="{{recentAchievements}}" wx:key="key" class="ach-badge">
<text class="ach-icon">{{item.icon}}</text>
<text class="ach-name">{{item.name}}</text>
</view>
<view wx:if="{{achievementCount==0}}" class="ach-empty">
<text>完成日常任务解锁成就</text>
</view>
</view>
<!-- 动态 -->
<view class="section-title">
<text>最近的陪伴</text>
<text class="section-subtitle" wx:if="{{dynamics.length>1}}" bindtap="toggleDynamics">{{showAllDynamics?'收起':'查看全部'}} ({{dynamics.length}})</text>
</view>
<view class="dynamics-list">
<view wx:for="{{displayDynamics}}" wx:key="id" class="dynamic-item" wx:for-item="d">
<view class="dynamic-avatar">
<image wx:if="{{d.avatar}}" class="dynamic-avatar-img" src="{{d.avatar}}" mode="aspectFill" />
<text wx:else>{{d.initial}}</text>
</view>
<view class="dynamic-content">
<text class="dynamic-text">{{d.message}}</text>
<text class="dynamic-time">{{d.time_text}}</text>
</view>
</view>
<view wx:if="{{dynamics.length==0}}" class="empty-state">
<text>🐾</text>
<text>还没有动态,快去照顾宠物吧</text>
</view>
</view>
</view>
<view style="height:60rpx;"></view>
</block>
</view>
</scroll-view>
<!-- 改名弹窗 -->
<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 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>
</view>
</view>
</view>
</view>