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.
226 lines
12 KiB
Plaintext
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>
|