文件
jw-beauty/miniprogram/pages/profile/profile.wxml
T
Guoguo 92416261ee feat: production readiness — feature gaps + config hardening
Miniprogram:
- Add BLE reconnect button on home page when disconnected
- Add loading states to index, profile, subscribe-plans pages
- Add profile editing (avatar + nickname) with COS upload
- Enable pull-to-refresh on history page
- Fix auto-scan self.options → self.data inconsistency
- Add console.error to silent catch blocks
- Gate 'Simple Peripheral' BLE scan behind __DEV__ flag
- Add production config comment to env.js

Admin console:
- Add empty state '暂无数据' to all 5 list views
- Replace plain text plan input with select dropdown
- Add type="date" to record date filters
- Add production config comment

Server:
- CORS origin restricted in production (env CORS_ORIGIN)
- DB pool size configurable via DB_POOL_SIZE env var
- .env.example updated with WeChat Pay + production fields
2026-05-15 09:07:41 -07:00

85 行
3.7 KiB
Plaintext
原始文件 Blame 文件历史

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
<view class="page">
<view class="loading-container" wx:if="{{loading}}">
<view class="loading-spinner"></view>
<text class="loading-text">加载中...</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 || '未登录'}}</view>
<view class="user-phone">{{userInfo.phone || ''}}</view>
</view>
<view class="edit-profile-btn" bindtap="onEditProfile">编辑资料</view>
</view>
<view class="sub-card" wx:if="{{subscription && subscription.status === 'active' && subRemaining > 0}}">
<view class="sub-left">
<view class="sub-name">✨ 智能模式</view>
<view class="sub-remain">剩余 {{subRemaining}}天</view>
</view>
<text class="status-badge status-badge-gold">使用中</text>
</view>
<view class="sub-card sub-card-inactive" wx:else bindtap="onViewSubscription">
<view class="sub-left">
<view class="sub-name">智能模式</view>
<view class="sub-remain">未订阅</view>
</view>
<text class="status-badge" style="background:#eee;color:#999;">去订阅 </text>
</view>
<view class="menu-list">
<view class="menu-item" bindtap="onManageDevice">
<view class="menu-icon">📱</view>
<view class="menu-text">我的设备</view>
<text class="menu-device-status" wx:if="{{deviceCount > 0}}">已绑定</text>
<text class="menu-device-status menu-device-unbound" wx:else>未绑定</text>
<text class="menu-arrow"></text>
</view>
<view class="menu-item" bindtap="onViewHistory">
<view class="menu-icon">📋</view>
<view class="menu-text">护理记录</view>
<text class="menu-arrow"></text>
</view>
<view class="menu-item" bindtap="onViewSubscription">
<view class="menu-icon">💳</view>
<view class="menu-text">订阅管理</view>
<text class="menu-arrow"></text>
</view>
<view class="menu-item" bindtap="onHelp">
<view class="menu-icon">❓</view>
<view class="menu-text">使用帮助</view>
<text class="menu-arrow"></text>
</view>
<view class="menu-item" bindtap="onContact">
<view class="menu-icon">📞</view>
<view class="menu-text">联系我们</view>
<text class="menu-arrow"></text>
</view>
</view>
<view class="logout-btn" bindtap="onLogout">退出登录</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">编辑资料</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">点击更换头像</text>
</view>
<view class="edit-field">
<text class="edit-label">昵称</text>
<input class="edit-input" value="{{editNickname}}" bindinput="onEditNicknameInput" placeholder="请输入昵称" maxlength="20" />
</view>
<view class="edit-actions">
<button class="btn-secondary edit-btn" bindtap="onCancelEdit">取消</button>
<button class="btn-primary edit-btn" bindtap="onSaveProfile" disabled="{{saving}}" loading="{{saving}}">保存</button>
</view>
</view>
</view>