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
这个提交包含在:
Guoguo
2026-05-15 09:07:41 -07:00
父节点 7e036576e3
当前提交 92416261ee
修改 23 个文件,包含 421 行新增33 行删除
+133
查看文件
@@ -107,11 +107,144 @@
color: #999;
}
.loading-container {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 200rpx 0;
}
.loading-spinner {
width: 64rpx;
height: 64rpx;
border: 6rpx solid #f0f0f0;
border-top-color: #E6508C;
border-radius: 50%;
animation: spin 0.8s linear infinite;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
.loading-text {
margin-top: 20rpx;
font-size: 28rpx;
color: #999;
}
.sub-card-inactive {
background: #f5f5f5;
border: 1px dashed #d9d9d9;
}
.user-avatar-img {
width: 88rpx;
height: 88rpx;
border-radius: 50%;
flex-shrink: 0;
}
.edit-profile-btn {
font-size: 24rpx;
color: rgba(255, 255, 255, 0.9);
border: 1rpx solid rgba(255, 255, 255, 0.6);
border-radius: 24rpx;
padding: 6rpx 20rpx;
flex-shrink: 0;
}
.edit-mask {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.5);
z-index: 100;
}
.edit-modal {
position: fixed;
left: 10%;
right: 10%;
top: 50%;
transform: translateY(-50%);
background: #fff;
border-radius: 24rpx;
padding: 40rpx;
z-index: 101;
}
.edit-modal-title {
font-size: 32rpx;
font-weight: 600;
text-align: center;
margin-bottom: 32rpx;
color: #333;
}
.edit-avatar-row {
display: flex;
flex-direction: column;
align-items: center;
margin-bottom: 32rpx;
}
.edit-avatar-img {
width: 120rpx;
height: 120rpx;
border-radius: 50%;
}
.edit-avatar-placeholder {
width: 120rpx;
height: 120rpx;
background: #f5f5f5;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 56rpx;
}
.edit-avatar-hint {
font-size: 24rpx;
color: #999;
margin-top: 12rpx;
}
.edit-field {
margin-bottom: 32rpx;
}
.edit-label {
font-size: 26rpx;
color: #666;
margin-bottom: 12rpx;
display: block;
}
.edit-input {
border: 2rpx solid #e0e0e0;
border-radius: 12rpx;
padding: 16rpx 20rpx;
font-size: 28rpx;
color: #333;
}
.edit-actions {
display: flex;
gap: 20rpx;
}
.edit-btn {
flex: 1;
margin: 0 !important;
font-size: 28rpx;
}
.logout-btn {
text-align: center;
color: #ff4d4f;