diff --git a/.gitignore b/.gitignore
index 9b33c61..af898b3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,6 +22,7 @@ dist
.hbuilderx
.trae
.claude/settings.local.json
+*.pen
nul
*.timestamp-*
diff --git a/src/pages/scan/bluetooth-debug/index.vue b/src/pages/scan/bluetooth-debug/index.vue
new file mode 100644
index 0000000..f209568
--- /dev/null
+++ b/src/pages/scan/bluetooth-debug/index.vue
@@ -0,0 +1,1469 @@
+
+
+
+
+
+
+
+
+
+ {{ step > i ? '✓' : i + 1 }}
+
+ {{ s }}
+
+
+
+
+
+
+
+
+
+
+ iOS 限制说明
+
+
+ 苹果系统会屏蔽 BLE 扫描中的 iBeacon 广播包,因此 BLE 扫描无法发现 iBeacon 设备。
+
+
+ 请直接跳到第 2 步,手动输入信标的 iBeacon UUID 进行监听。
+ 可先用安卓手机扫描获取 UUID。
+
+
+ 跳到「识别信标」输入 UUID →
+
+
+
+
+
+
+
+
+
+ BLE 通用扫描
+
+
+ 扫描所有 BLE 设备{{ isIOS ? '' : ',自动解析 iBeacon 广播帧' }}
+
+
+ 设备 {{ devices.length }} 个{{ isIOS ? '' : `,其中 iBeacon ${ibeaconDevices.length} 个` }}
+
+
+
+ {{ scanning ? '停止' : '开始' }}
+
+
+
+
+
+
+ {{ errorMsg }}
+
+
+
+
+
+
+ 全部 ({{ devices.length }})
+
+
+ iBeacon ({{ ibeaconDevices.length }})
+
+
+ 有名称
+
+
+ 清空
+
+
+
+
+
+
+
+
+ 清除
+
+
+
+
+
+
+
+
+ {{ scanning ? '正在搜索 BLE 设备...' : '点击「开始」扫描附近设备' }}
+
+
+ 会自动解析 iBeacon 广播帧,提取 UUID / Major / Minor
+
+
+
+
+
+
+
+ 设备 ID
+ {{ device.deviceId }}
+
+
+ 解析 MAC
+ {{ device.mac }}
+
+
+ UUID
+ {{ device.ibeacon.uuid }}
+
+
+ Major/Minor
+ {{ device.ibeacon.major }} / {{ device.ibeacon.minor }}
+
+
+ 广播数据
+ {{ device.advertisData }}
+
+
+
+
+
+ 用此 UUID 进入 iBeacon 监听 →
+
+
+ {{ connectingId === device.deviceId ? '连接中...' : '连接读取设备信息' }}
+
+
+
+
+
+
+ 设备信息(0x180A)
+
+
+ {{ char.name }}
+ {{ char.value }}
+
+
+ 该设备不支持 Device Information Service
+
+
+
+
+
+
+
+
+
+
+
+ 确认目标信标
+
+
+ {{ isIOS
+ ? 'iOS 无法通过 BLE 扫描发现 iBeacon,请在下方手动输入 UUID'
+ : '以下是从 BLE 扫描中发现的 iBeacon 信标,选择你的目标信标'
+ }}
+
+
+
+
+
+
+
+
+ 输入 iBeacon UUID
+
+
+
+
+
+ UUID 通常为 36 位格式,如 FDA50693-A4E2-4FB1-AFCB-194215961234
+
+
+
+ 使用此 UUID 进入 iBeacon 监听 →
+
+
+
+
+
+
+
+
+ 未发现 iBeacon 设备
+
+
+ 请返回第一步先进行 BLE 扫描
+
+
+ 返回扫描
+
+
+
+
+
+
+
+
+ UUID
+ {{ device.ibeacon!.uuid }}
+
+
+ Major/Minor
+ {{ device.ibeacon!.major }} / {{ device.ibeacon!.minor }}
+
+
+ 解析 MAC
+ {{ device.mac }}
+
+
+
+
+
+
+ 确认,进入 iBeacon 精确监听 →
+
+
+
+
+
+
+
+ 或手动输入 iBeacon UUID
+
+
+
+
+
+
+ 使用此 UUID 进入监听 →
+
+
+
+
+
+
+
+
+
+
+
+
+ 目标 iBeacon
+
+
+ UUID
+ {{ activeBeaconUuid }}
+
+
+ 设备名
+ {{ selectedDevice.name || '未知' }}
+
+
+
+
+
+
+
+
+
+ iBeacon 监听
+
+
+ 信标 {{ beacons.length }} 个
+
+
+
+
+ {{ scanning ? '停止' : '开始' }}
+
+
+
+
+
+
+ {{ errorMsg }}
+
+
+
+
+
+
+
+ {{ scanning ? '正在监听 iBeacon...' : '点击「开始」监听信标' }}
+
+
+
+
+
+
+ UUID
+ {{ b.uuid }}
+
+
+ Major
+ {{ b.major }}
+
+
+ Minor
+ {{ b.minor }}
+
+
+ 精度
+ {{ b.accuracy.toFixed(2) }} m
+
+
+ RSSI
+
+ {{ b.rssi }}
+
+
+
+
+
+
+
+
+ 日志 ({{ logs.length }})
+
+ {{ showLog ? '收起' : '展开' }}
+ 清空
+
+
+
+
+ [{{ log.time }}] {{ log.msg }}
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/user/index.vue b/src/pages/user/index.vue
index 5c0b792..66e0cae 100644
--- a/src/pages/user/index.vue
+++ b/src/pages/user/index.vue
@@ -93,9 +93,12 @@
-
-
+
+
+
+
+
@@ -200,6 +203,14 @@ page {
overflow: hidden;
}
+.tabbar-placeholder {
+ flex-shrink: 0;
+ height: 140rpx;
+ // iOS 安全区
+ padding-bottom: constant(safe-area-inset-bottom, 0px);
+ padding-bottom: env(safe-area-inset-bottom, 0px);
+}
+
.avatar-wrapper {
border: 4rpx solid rgba(255, 255, 255, 0.3);
box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.15);
diff --git a/src/utils/constants/dict-enum.ts b/src/utils/constants/dict-enum.ts
index 3d93608..272b8bd 100644
--- a/src/utils/constants/dict-enum.ts
+++ b/src/utils/constants/dict-enum.ts
@@ -40,6 +40,11 @@ const INFRA_DICT = {
INFRA_OPERATE_TYPE: 'infra_operate_type',
} as const
+/** ========== OPS - 运维模块 ========== */
+const OPS_DICT = {
+ OPS_ORDER_PRIORITY: 'ops_order_priority',
+} as const
+
/** ========== BPM - 工作流模块 ========== */
const BPM_DICT = {
BPM_MODEL_FORM_TYPE: 'bpm_model_form_type', // BPM 模型表单类型
@@ -55,6 +60,7 @@ const BPM_DICT = {
/** 字典类型枚举 - 统一导出 */
export const DICT_TYPE = {
...BPM_DICT,
+ ...OPS_DICT,
...INFRA_DICT,
...SYSTEM_DICT,
...COMMON_DICT,