105 行
5.0 KiB
Plaintext
105 行
5.0 KiB
Plaintext
<view class="page">
|
||
<view class="loading-container" wx:if="{{loading}}">
|
||
<view class="loading-spinner"></view>
|
||
<text class="loading-text">{{i18n.common.loading}}</text>
|
||
</view>
|
||
|
||
<view class="page-content" wx:if="{{!loading}}">
|
||
<view class="user-row">
|
||
<image class="user-avatar-img" wx:if="{{userInfo.avatar}}" src="{{userInfo.avatar}}" mode="aspectFill"></image>
|
||
<view class="user-avatar" wx:else>👤</view>
|
||
<view class="user-info">
|
||
<view class="user-name">{{userInfo.nickname || i18n.profile.notLoggedIn}}</view>
|
||
<view class="user-phone">{{userInfo.phone || ''}}</view>
|
||
</view>
|
||
<view class="edit-profile-btn" bindtap="onEditProfile">{{i18n.profile.editProfile}}</view>
|
||
</view>
|
||
|
||
<view class="sub-card" wx:if="{{subscription && subscription.plan === 'free'}}">
|
||
<view class="sub-left">
|
||
<view class="sub-name">✨ {{i18n.profile.smartMode}}</view>
|
||
<view class="sub-remain">{{i18n.profile.smartModeOpen}}</view>
|
||
</view>
|
||
<text class="status-badge status-badge-gold">{{i18n.profile.free}}</text>
|
||
</view>
|
||
<view class="sub-card" wx:elif="{{subscription && subscription.status === 'active' && subRemaining > 0}}">
|
||
<view class="sub-left">
|
||
<view class="sub-name">✨ {{i18n.profile.smartMode}}</view>
|
||
<view class="sub-remain">{{subRemainingText}}</view>
|
||
</view>
|
||
<text class="status-badge status-badge-gold">{{i18n.profile.inUse}}</text>
|
||
</view>
|
||
<view class="sub-card sub-card-inactive" wx:else bindtap="onViewSubscription">
|
||
<view class="sub-left">
|
||
<view class="sub-name">{{i18n.profile.smartMode}}</view>
|
||
<view class="sub-remain">{{i18n.profile.notSubscribed}}</view>
|
||
</view>
|
||
<text class="status-badge" style="background:#eee;color:#999;">{{i18n.profile.goSubscribe}}</text>
|
||
</view>
|
||
|
||
<view class="menu-list">
|
||
<view class="menu-item" bindtap="onManageDevice">
|
||
<view class="menu-icon">📱</view>
|
||
<view class="menu-text">{{i18n.profile.menuDevice}}</view>
|
||
<text class="menu-device-status" wx:if="{{deviceCount > 0}}">{{i18n.profile.bound}}</text>
|
||
<text class="menu-device-status menu-device-unbound" wx:else>{{i18n.profile.unbound}}</text>
|
||
<text class="menu-arrow">›</text>
|
||
</view>
|
||
<view class="menu-item" bindtap="onViewHistory">
|
||
<view class="menu-icon">📋</view>
|
||
<view class="menu-text">{{i18n.profile.menuHistory}}</view>
|
||
<text class="menu-arrow">›</text>
|
||
</view>
|
||
<view class="menu-item" bindtap="onViewSubscription" wx:if="{{!subscription || subscription.plan !== 'free'}}">
|
||
<view class="menu-icon">💳</view>
|
||
<view class="menu-text">{{i18n.profile.menuSubscription}}</view>
|
||
<text class="menu-arrow">›</text>
|
||
</view>
|
||
<view class="menu-item" bindtap="onLightInfo">
|
||
<view class="menu-icon">💡</view>
|
||
<view class="menu-text">{{i18n.profile.menuLightInfo}}</view>
|
||
<text class="menu-arrow">›</text>
|
||
</view>
|
||
<view class="menu-item" bindtap="onHelp">
|
||
<view class="menu-icon">❓</view>
|
||
<view class="menu-text">{{i18n.profile.menuHelp}}</view>
|
||
<text class="menu-arrow">›</text>
|
||
</view>
|
||
<view class="menu-item" bindtap="onContact">
|
||
<view class="menu-icon">📞</view>
|
||
<view class="menu-text">{{i18n.profile.menuContact}}</view>
|
||
<text class="menu-arrow">›</text>
|
||
</view>
|
||
<view class="menu-item" bindtap="onSwitchLanguage">
|
||
<view class="menu-icon">🌐</view>
|
||
<view class="menu-text">{{i18n.profile.language}}</view>
|
||
<text class="menu-device-status">{{locale === 'en' ? 'English' : '中文'}}</text>
|
||
<text class="menu-arrow">›</text>
|
||
</view>
|
||
</view>
|
||
|
||
<view class="logout-btn" bindtap="onLogout">{{i18n.profile.logout}}</view>
|
||
|
||
<view class="version-text">v0.2.0</view>
|
||
</view>
|
||
|
||
<!-- Edit profile modal -->
|
||
<view class="edit-mask" wx:if="{{editing}}" bindtap="onCancelEdit"></view>
|
||
<view class="edit-modal" wx:if="{{editing}}">
|
||
<view class="edit-modal-title">{{i18n.profile.editProfileTitle}}</view>
|
||
<view class="edit-avatar-row" bindtap="onPickAvatar">
|
||
<image class="edit-avatar-img" wx:if="{{editAvatarUrl}}" src="{{editAvatarUrl}}" mode="aspectFill"></image>
|
||
<view class="edit-avatar-placeholder" wx:else>👤</view>
|
||
<text class="edit-avatar-hint">{{i18n.profile.changeAvatar}}</text>
|
||
</view>
|
||
<view class="edit-field">
|
||
<text class="edit-label">{{i18n.profile.nickname}}</text>
|
||
<input class="edit-input" value="{{editNickname}}" bindinput="onEditNicknameInput" placeholder="{{i18n.profile.nicknamePlaceholder}}" maxlength="20" />
|
||
</view>
|
||
<view class="edit-actions">
|
||
<button class="btn-secondary edit-btn" bindtap="onCancelEdit">{{i18n.common.cancel}}</button>
|
||
<button class="btn-primary edit-btn" bindtap="onSaveProfile" disabled="{{saving}}" loading="{{saving}}">{{i18n.common.save}}</button>
|
||
</view>
|
||
</view>
|
||
</view>
|