feat(userManagement): 新增用户管理页面并接入导航

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
17792275749
2026-08-19 15:29:53 +08:00
co-authored by Claude Opus 4.7
parent b66caf515e
commit 9040fc4fba
5 changed files with 419 additions and 2 deletions
+2 -1
View File
@@ -1,11 +1,12 @@
{
"pages": [
"pages/equipment/equipment",
"pages/userManagement/userManagement",
"pages/login/login",
"pages/supplementPersonal/supplementPersonal",
"pages/connectedDevice/connectedDevice",
"pages/connectedWifi/connectedWifi",
"pages/home/home",
"pages/equipment/equipment",
"pages/addUser/addUser",
"pages/data/data",
"pages/my/my",
@@ -0,0 +1,6 @@
{
"usingComponents": {},
"navigationBarTitleText": "用户管理",
"navigationBarTextStyle": "black",
"navigationBarBackgroundColor": "#FFFFFF"
}
@@ -0,0 +1,312 @@
.userManagement {
width: 100%;
min-height: 100%;
padding: 24rpx 30rpx;
box-sizing: border-box;
/* 设备卡片 */
.device-card {
width: 100%;
padding: 30rpx;
display: flex;
flex-wrap: nowrap;
border-radius: 24rpx;
background-color: #FFFFFF;
box-sizing: border-box;
margin-bottom: 32rpx;
.device-icon {
width: 88rpx;
height: 88rpx;
overflow: hidden;
margin-right: 24rpx;
border-radius: 24rpx;
background-color: #1385FA;
}
.device-info {
flex: 1;
.device-name-row {
width: 100%;
height: 40rpx;
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 14rpx;
.device-name {
color: #252535;
height: 40rpx;
font-size: 32rpx;
font-weight: bolder;
line-height: 40rpx;
}
.device-status {
height: 40rpx;
padding: 0 16rpx;
display: flex;
flex-wrap: nowrap;
align-items: center;
border-radius: 20rpx;
background-color: #EAFAF6;
.status-dot {
width: 12rpx;
height: 12rpx;
margin-right: 8rpx;
border-radius: 50%;
background-color: #2AC79F;
}
.status-text {
color: #2AC79F;
height: 22rpx;
font-size: 22rpx;
line-height: 22rpx;
}
}
}
.device-meta {
color: #808080;
height: 26rpx;
font-size: 26rpx;
line-height: 26rpx;
}
}
}
/* 已录入用户 + 同步按钮 */
.section-header {
width: 100%;
height: 48rpx;
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 16rpx;
.section-title {
color: #252535;
height: 32rpx;
font-size: 32rpx;
font-weight: bolder;
line-height: 32rpx;
}
.sync-btn {
color: #FFFFFF;
height: 48rpx;
font-size: 24rpx;
padding: 0 16rpx;
line-height: 48rpx;
border-radius: 8rpx;
background-color: #1385FA;
}
}
/* 同步提示 */
.sync-tip {
color: #F2994A;
font-size: 24rpx;
line-height: 34rpx;
margin-bottom: 24rpx;
}
/* 用户卡片 */
.member-card {
width: 100%;
padding: 32rpx;
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 {
display: flex;
flex-direction: column;
align-items: flex-end;
.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;
.op-edit {
color: #77849E;
height: 26rpx;
font-size: 26rpx;
line-height: 26rpx;
margin-right: 24rpx;
}
.op-delete {
color: #F24439;
height: 26rpx;
font-size: 26rpx;
line-height: 26rpx;
}
}
}
}
/* 底部添加用户按钮 */
.add-btn {
width: 100%;
height: 96rpx;
border-radius: 48rpx;
background-color: #1385FA;
color: #FFFFFF;
font-size: 36rpx;
line-height: 96rpx;
text-align: center;
margin-top: 8rpx;
}
/* 同步进度弹框 */
.sync-mask {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(37, 37, 53, 0.6);
z-index: 100;
}
.sync-panel {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 560rpx;
box-sizing: border-box;
background-color: #FFFFFF;
border-radius: 24rpx;
z-index: 101;
display: flex;
flex-direction: column;
align-items: center;
padding: 64rpx 48rpx;
.sync-title {
color: #252535;
height: 32rpx;
font-size: 32rpx;
line-height: 32rpx;
}
.sync-status {
color: #808080;
height: 24rpx;
font-size: 24rpx;
line-height: 24rpx;
margin-top: 24rpx;
}
.sync-percent {
color: #77849E;
height: 24rpx;
font-size: 24rpx;
line-height: 24rpx;
margin-top: 48rpx;
}
.sync-progress {
width: 464rpx;
height: 10rpx;
border-radius: 6rpx;
background-color: #D9D9D9;
margin-top: 16rpx;
overflow: hidden;
.sync-progress-inner {
height: 10rpx;
border-radius: 6rpx;
background-color: #1385FA;
}
}
}
}
@@ -0,0 +1,35 @@
// pages/userManagement/userManagement.ts
Page({
data: {
device: {
name: '家庭蓝牙体脂秤 S1',
connected: true,
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' }
],
syncShow: false,
syncPercent: 0,
syncStatus: ''
},
/** 同步用户至设备 */
onTapSync() {
this.setData({ syncShow: true, syncPercent: 32, syncStatus: '正在同步信息,请勿离开...' })
setTimeout(() => {
this.setData({ syncPercent: 100, syncStatus: '同步完成' })
}, 2000)
},
/** 添加用户 */
onTapAddUser() {
wx.navigateTo({ url: '/pages/addUser/addUser' })
}
})
@@ -0,0 +1,63 @@
<view class="userManagement">
<!-- 设备卡片 -->
<view class="device-card">
<view class="device-icon"></view>
<view class="device-info">
<view class="device-name-row">
<view class="device-name">{{ device.name }}</view>
<view class="device-status">
<view class="status-dot"></view>
<view class="status-text">{{ device.connected ? '已连接' : '未连接' }}</view>
</view>
</view>
<view class="device-meta" style="margin-bottom: 20rpx;">型号:{{ device.model }}</view>
<view class="device-meta">设备编号:{{ device.serial }}</view>
</view>
</view>
<!-- 已录入用户 + 同步按钮 -->
<view class="section-header">
<view class="section-title">已录入用户({{ memberCount }}/10</view>
<view class="sync-btn" bind:tap="onTapSync">同步用户至设备</view>
</view>
<!-- 同步提示 -->
<view class="sync-tip">当前用户信息未同步至设备,请在连接设备的状态下,点击同步按钮完成信息同步</view>
<!-- 用户列表 -->
<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-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>
<view class="member-sub">{{ item.gender }}·{{ item.age }}岁 丨 {{ item.height }}cm</view>
</view>
<view class="member-right">
<view class="member-sync member-sync--{{ item.syncClass }}">{{ item.sync }}</view>
<view class="member-ops">
<view class="op-edit">编辑</view>
<view class="op-delete">删除</view>
</view>
</view>
</view>
</block>
<!-- 底部添加用户按钮 -->
<view class="add-btn" bind:tap="onTapAddUser">添加用户(最多10位)</view>
<!-- 同步进度弹框 -->
<block wx:if="{{ syncShow }}">
<view class="sync-mask"></view>
<view class="sync-panel">
<view class="sync-title">同步成员至设备</view>
<view class="sync-status">{{ syncStatus }}</view>
<view class="sync-percent">{{ syncPercent }}%</view>
<view class="sync-progress">
<view class="sync-progress-inner" style="width: {{ syncPercent }}%;"></view>
</view>
</view>
</block>
</view>