Miniprogram: - Profile "我的设备": show unbind option when device bound, scan when not - Add device status indicator (已绑定/未绑定) to profile menu Admin console: - Login: add @confirm to inputs so Enter key submits the form - Record detail: wire up 详情 link with modal showing full record info - Dashboard: add subscription stats row (月卡/年卡/试用/收入) - Subscription: add 取消 action for active subscriptions - Format: fix -8h timezone display for UTC ISO date strings Server: - POST /api/v1/admin/subscriptions/cancel: cancel active subscriptions - Dashboard API: include sub_stats (plan counts + monthly revenue) - IP extraction: add X-Forwarded-For fallback for logging
119 行
1.7 KiB
Plaintext
119 行
1.7 KiB
Plaintext
.user-row {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 20rpx;
|
|
padding: 24rpx;
|
|
background: linear-gradient(135deg, #E6508C 0%, #DCB982 100%);
|
|
border-radius: 24rpx;
|
|
margin-bottom: 24rpx;
|
|
}
|
|
|
|
.user-avatar {
|
|
width: 88rpx;
|
|
height: 88rpx;
|
|
background: #ffffff;
|
|
border-radius: 50%;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-size: 44rpx;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
.user-name {
|
|
font-size: 32rpx;
|
|
font-weight: 600;
|
|
color: #ffffff;
|
|
}
|
|
|
|
.user-phone {
|
|
font-size: 24rpx;
|
|
color: rgba(255, 255, 255, 0.9);
|
|
}
|
|
|
|
.sub-card {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
padding: 24rpx;
|
|
background: #ffffff;
|
|
border-radius: 20rpx;
|
|
margin-bottom: 24rpx;
|
|
border: 2rpx solid #DCB982;
|
|
}
|
|
|
|
.sub-left {
|
|
flex: 1;
|
|
}
|
|
|
|
.sub-name {
|
|
font-size: 26rpx;
|
|
color: #333333;
|
|
}
|
|
|
|
.sub-remain {
|
|
font-size: 24rpx;
|
|
color: #999999;
|
|
margin-top: 4rpx;
|
|
}
|
|
|
|
.menu-list {
|
|
background: #ffffff;
|
|
border-radius: 24rpx;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.menu-item {
|
|
display: flex;
|
|
align-items: center;
|
|
padding: 24rpx;
|
|
border-bottom: 2rpx solid #f5f5f5;
|
|
}
|
|
|
|
.menu-item:last-child {
|
|
border-bottom: none;
|
|
}
|
|
|
|
.menu-icon {
|
|
width: 52rpx;
|
|
height: 52rpx;
|
|
background: #fdf2f8;
|
|
border-radius: 12rpx;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-size: 28rpx;
|
|
margin-right: 16rpx;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
.menu-text {
|
|
flex: 1;
|
|
font-size: 26rpx;
|
|
color: #333333;
|
|
}
|
|
|
|
.menu-arrow {
|
|
color: #cccccc;
|
|
font-size: 32rpx;
|
|
}
|
|
|
|
.menu-device-status {
|
|
font-size: 24rpx;
|
|
color: #52c41a;
|
|
margin-right: 8rpx;
|
|
}
|
|
.menu-device-unbound {
|
|
color: #999;
|
|
}
|
|
|
|
.logout-btn {
|
|
text-align: center;
|
|
color: #ff4d4f;
|
|
font-size: 28rpx;
|
|
margin-top: 32rpx;
|
|
padding: 24rpx;
|
|
background: #ffffff;
|
|
border-radius: 24rpx;
|
|
}
|