feat(userManagement): 用户列表按本人/员工/家庭用户分组展示

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
17792275749
2026-08-19 16:33:48 +08:00
co-authored by Claude Opus 4.7
parent 97dffd9893
commit 48ac39f0e0
3 changed files with 218 additions and 125 deletions
@@ -13,13 +13,12 @@
.device-card {
width: 100%;
padding: 32rpx;
padding: 30rpx;
display: flex;
border-radius: 24rpx;
background-color: #FFFFFF;
box-sizing: border-box;
margin-bottom: 24rpx;
display: flex;
align-items: center;
.device-icon {
width: 88rpx;
@@ -28,7 +27,6 @@
margin-right: 24rpx;
border-radius: 24rpx;
background-color: #1385FA;
flex-shrink: 0;
}
.device-info {
@@ -36,6 +34,7 @@
.device-name-row {
width: 100%;
height: 40rpx;
display: flex;
align-items: center;
justify-content: space-between;
@@ -45,13 +44,17 @@
color: #252535;
height: 32rpx;
font-size: 32rpx;
font-weight: bolder;
line-height: 32rpx;
}
.device-status {
height: 22rpx;
height: 40rpx;
display: flex;
padding: 0 16rpx;
border-radius: 20rpx;
align-items: center;
background-color: #EAFAF6;
.status-dot {
width: 12rpx;
@@ -75,13 +78,13 @@
height: 26rpx;
font-size: 26rpx;
line-height: 26rpx;
margin-bottom: 8rpx;
}
}
}
.section-header {
width: 100%;
height: 48rpx;
display: flex;
align-items: center;
justify-content: space-between;
@@ -91,17 +94,18 @@
color: #252535;
height: 32rpx;
font-size: 32rpx;
font-weight: bolder;
line-height: 32rpx;
}
.sync-btn {
height: 48rpx;
padding: 0 20rpx;
border-radius: 24rpx;
background-color: #1385FA;
color: #FFFFFF;
height: 48rpx;
font-size: 24rpx;
line-height: 48rpx;
padding: 0 20rpx;
border-radius: 8rpx;
background-color: #1385FA;
}
}
@@ -142,124 +146,166 @@
.scrollViewContent {
width: 100%;
padding: 0 30rpx;
padding: 0 30rpx 30rpx;
box-sizing: border-box;
.group-title {
color: #252535;
height: 26rpx;
font-size: 26rpx;
line-height: 26rpx;
margin-bottom: 24rpx;
}
.member-card {
width: 100%;
padding: 32rpx;
padding: 30rpx;
border-radius: 24rpx;
background-color: #FFFFFF;
box-sizing: border-box;
margin-bottom: 24rpx;
display: flex;
align-items: center;
.member-avatar {
width: 88rpx;
height: 88rpx;
border-radius: 24rpx;
margin-right: 24rpx;
flex-shrink: 0;
}
.member-avatar--male {
background-color: #C6E6FF;
}
.member-avatar--female {
background-color: #FFD5E3;
}
.member-info {
flex: 1;
.member-name-row {
display: flex;
align-items: center;
margin-bottom: 16rpx;
.member-name {
color: #252535;
height: 32rpx;
font-size: 32rpx;
line-height: 32rpx;
margin-right: 16rpx;
}
.member-type-tag {
height: 40rpx;
padding: 0 10rpx;
font-size: 24rpx;
line-height: 40rpx;
border-radius: 8rpx;
color: #FFFFFF;
}
.member-type-tag--self {
background-color: #1385FA;
}
.member-type-tag--employee {
background-color: #10B981;
}
.member-type-tag--family {
background-color: #F59E0B;
}
}
.member-sub {
color: #808080;
height: 26rpx;
font-size: 26rpx;
line-height: 26rpx;
}
}
.member-right {
.member-top {
width: 100%;
display: flex;
flex-direction: column;
align-items: flex-end;
align-items: center;
.member-avatar {
width: 88rpx;
height: 88rpx;
overflow: hidden;
border-radius: 24rpx;
margin-right: 24rpx;
&.member-avatar--male {
background-color: #C6E6FF;
}
&.member-avatar--female {
background-color: #FFD5E3;
}
}
.member-info {
width: 0;
flex: 1;
.member-name-row {
width: 100%;
height: 36rpx;
display: flex;
flex-wrap: nowrap;
align-items: center;
margin-bottom: 14rpx;
.member-name {
color: #252535;
height: 36rpx;
font-size: 32rpx;
font-weight: bolder;
line-height: 36rpx;
margin-right: 16rpx;
text {
color: #808080;
font-weight: normal;
font-size: 24rpx;
}
}
.member-type-tag {
color: #FFFFFF;
height: 36rpx;
padding: 0 10rpx;
font-size: 24rpx;
line-height: 36rpx;
border-radius: 8rpx;
}
.member-type-tag--self {
background-color: #1385FA;
}
}
> .member-name {
color: #252535;
height: 40rpx;
font-size: 32rpx;
font-weight: bolder;
line-height: 40rpx;
margin-bottom: 10rpx;
}
.member-sub {
color: #808080;
height: 26rpx;
font-size: 26rpx;
line-height: 26rpx;
}
}
.member-sync {
height: 22rpx;
font-size: 22rpx;
line-height: 22rpx;
margin-bottom: 16rpx;
}
.member-sync--done {
color: #2AC79F;
}
.member-sync--pending {
color: #F2994A;
}
.member-sync--deleted {
color: #F24439;
}
.member-ops {
display: flex;
align-items: center;
.op-edit {
color: #77849E;
height: 26rpx;
font-size: 26rpx;
line-height: 26rpx;
margin-right: 24rpx;
> view:nth-of-type(1) {
width: 12rpx;
height: 12rpx;
border-radius: 50%;
margin-right: 8rpx;
}
.op-delete {
color: #F24439;
height: 26rpx;
font-size: 26rpx;
line-height: 26rpx;
> view:nth-of-type(2) {
height: 22rpx;
font-size: 22rpx;
line-height: 22rpx;
}
&.member-sync--done {
color: #2AC79F;
> view:nth-of-type(1) {
background-color: #2AC79F;
}
}
&.member-sync--pending {
color: #F2994A;
> view:nth-of-type(1) {
background-color: #F2994A;
}
}
}
}
.member-divider {
width: 100%;
height: 2rpx;
background-color: #EAECF1;
margin: 24rpx 0;
}
.member-ops {
display: flex;
justify-content: flex-end;
.op-edit {
color: #77849E;
height: 26rpx;
font-size: 26rpx;
line-height: 26rpx;
margin-right: 60rpx;
}
.op-delete {
color: #F24439;
height: 26rpx;
font-size: 26rpx;
line-height: 26rpx;
}
}
}
@@ -7,13 +7,31 @@ Page({
model: 'BS-A100',
serial: 'BL2024B00321'
},
memberCount: 4,
members: [
{ id: 1, name: '张晓敏', gender: '男', age: 36, height: 172, type: '本人', typeClass: 'self', sync: '已同步', syncClass: 'done' },
{ id: 2, name: '李建国', gender: '男', age: 36, height: 182, type: '员工', typeClass: 'employee', sync: '已同步', syncClass: 'done' },
{ id: 3, name: '吉夏', gender: '', age: 28, height: 165, type: '家庭用户', typeClass: 'family', sync: '未同步', syncClass: 'pending' },
{ id: 4, name: '张雪(他人添加)', gender: '女', age: 32, height: 158, type: '家庭用户', typeClass: 'family', sync: '已同步', syncClass: 'done' },
{ id: 5, name: '赵明亮', gender: '男', age: 32, height: 172, type: '员工', typeClass: 'employee', sync: '已删除未同步', syncClass: 'deleted' }
memberCount: 5,
hasData: true,
self: {
name: '张晓敏',
gender: '',
age: 36,
height: 172,
sync: '已同步',
syncClass: 'done'
},
groups: [
{
title: '员工',
members: [
{ id: 2, name: '李建国', gender: '男', age: 36, height: 182, sync: '已同步', syncClass: 'done' },
{ id: 5, name: '赵明亮', gender: '男', age: 32, height: 172, sync: '已同步', syncClass: 'done' }
]
},
{
title: '家庭用户',
members: [
{ id: 3, name: '吉夏', gender: '女', age: 28, height: 165, sync: '已同步', syncClass: 'done' },
{ id: 4, name: '张雪', gender: '女', age: 32, height: 158, sync: '未同步', syncClass: 'pending' }
]
}
],
syncShow: false,
syncPercent: 0,
@@ -12,7 +12,7 @@
<view class="status-text">{{ device.connected ? '已连接' : '未连接' }}</view>
</view>
</view>
<view class="device-meta">型号:{{ device.model }}</view>
<view class="device-meta" style="margin-bottom: 20rpx">型号:{{ device.model }}</view>
<view class="device-meta">设备编号:{{ device.serial }}</view>
</view>
</view>
@@ -29,26 +29,55 @@
<!-- 用户列表滚动区 -->
<view class="body">
<scroll-view scroll-y class="scrollView" wx:if="{{ members.length }}">
<scroll-view scroll-y class="scrollView" wx:if="{{ hasData }}">
<view class="scrollViewContent">
<block wx:for="{{ members }}" wx:key="id">
<view class="member-card">
<view class="member-avatar {{ item.gender === '女' ? 'member-avatar--female' : 'member-avatar--male' }}"></view>
<!-- 本人 -->
<view class="member-card">
<view class="member-top">
<view class="member-avatar member-avatar--male"></view>
<view class="member-info">
<view class="member-name-row">
<view class="member-name">{{ item.name }}</view>
<view class="member-type-tag member-type-tag--{{ item.typeClass }}">{{ item.type }}</view>
<view class="member-name">{{ self.name }}</view>
<view class="member-type-tag member-type-tag--self">本人</view>
</view>
<view class="member-sub">{{ item.gender }}·{{ item.age }}岁 丨 {{ item.height }}cm</view>
<view class="member-sub">{{ self.gender }}·{{ self.age }}岁 丨 {{ self.height }}cm</view>
</view>
<view class="member-right">
<view class="member-sync member-sync--{{ item.syncClass }}">{{ item.sync }}</view>
<view class="member-sync member-sync--{{ self.syncClass }}">
<view></view>
<view>{{ self.sync }}</view>
</view>
</view>
<view class="member-divider"></view>
<view class="member-ops">
<view class="op-delete">删除</view>
</view>
</view>
<!-- 分组 -->
<block wx:for="{{ groups }}" wx:key="title" wx:for-item="group">
<view class="group-title">{{ group.title }}</view>
<block wx:for="{{ group.members }}" wx:key="id" wx:for-item="member">
<view class="member-card">
<view class="member-top">
<view class="member-avatar {{ member.gender === '女' ? 'member-avatar--female' : 'member-avatar--male' }}"></view>
<view class="member-info">
<view class="member-name-row">
<view class="member-name">{{ member.name }} <text>(他人添加)</text></view>
</view>
<view class="member-sub">{{ member.gender }}·{{ member.age }}岁 丨 {{ member.height }}cm</view>
</view>
<view class="member-sync member-sync--{{ member.syncClass }}">
<view></view>
<view>{{ member.sync }}</view>
</view>
</view>
<view class="member-divider"></view>
<view class="member-ops">
<view class="op-edit">编辑</view>
<view class="op-delete">删除</view>
</view>
</view>
</view>
</block>
</block>
</view>
</scroll-view>