676 lines
35 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(function(vue) {
"use strict";
const _sfc_main$2 = vue.defineComponent({
data() {
return {
foundDevices: [],
isScanning: false,
bluetoothEnabled: false,
connectedDeviceId: ""
};
},
onLoad() {
this.initBluetooth();
},
onUnload() {
this.stopScan();
uni.closeBluetoothAdapter();
uni.offBluetoothDeviceFound(this.onDeviceFound);
},
methods: {
// 初始化蓝牙适配器
initBluetooth() {
uni.openBluetoothAdapter(new UTSJSONObject({
success: () => {
this.bluetoothEnabled = true;
},
fail: (err = null) => {
this.bluetoothEnabled = false;
uni.showModal(new UTSJSONObject({
title: "蓝牙开启失败",
content: "请检查设备蓝牙是否开启",
showCancel: false
}));
uni.__log__("error", "at pages/index/index.uvue:88", "蓝牙初始化失败:", err);
}
}));
},
// 切换扫描状态(开始/停止)
toggleScan() {
if (!this.bluetoothEnabled) {
this.initBluetooth();
return null;
}
if (this.isScanning) {
this.stopScan();
} else {
this.startScan();
}
},
// 开始扫描设备
startScan() {
this.isScanning = true;
this.foundDevices = [];
uni.startBluetoothDevicesDiscovery(new UTSJSONObject({
services: [],
allowDuplicatesKey: false,
success: () => {
uni.showToast({ title: "开始扫描", icon: "none" });
uni.onBluetoothDeviceFound(this.onDeviceFound);
},
fail: (err = null) => {
this.isScanning = false;
uni.showToast({ title: "扫描失败", icon: "none" });
uni.__log__("error", "at pages/index/index.uvue:124", "扫描失败:", err);
}
}));
setTimeout(() => {
if (this.isScanning)
this.stopScan();
}, 5e3);
},
// 停止扫描
stopScan() {
if (!this.isScanning)
return null;
uni.stopBluetoothDevicesDiscovery(new UTSJSONObject({
success: () => {
this.isScanning = false;
if (this.foundDevices.length == 0) {
uni.showToast({
title: "暂未扫描到任何设备",
icon: "none"
});
return null;
}
uni.showToast({
title: "扫描完成,发现".concat(this.foundDevices.length, "台设备"),
icon: "none"
});
},
fail: (err = null) => {
uni.__log__("error", "at pages/index/index.uvue:154", "停止扫描失败:", err);
}
}));
},
// 设备发现回调(处理去重和数据格式化)
onDeviceFound(res = null) {
const devices = res.devices || [];
devices.forEach((device = null) => {
if (!device.deviceId)
return null;
const isExist = this.foundDevices.some((d) => {
return d.deviceId === device.deviceId;
});
if (isExist)
return null;
var is_bj = false;
const advData = new Uint8Array(device.advertisData);
const devicenameData = advData.slice(2, 6);
const devicename = String.fromCharCode(...devicenameData);
if (devicename == "dzbj")
is_bj = true;
this.foundDevices.push({
is_bj,
name: device.name || "未知设备",
deviceId: device.deviceId,
rssi: device.RSSI,
connected: device.deviceId === this.connectedDeviceId
});
});
},
// 计算信号强度条宽度(-100dBm为0%-30dBm为100%
getRssiWidth(rssi = null) {
const minRssi = -100;
const maxRssi = -30;
let ratio = (rssi - minRssi) / (maxRssi - minRssi);
ratio = Math.max(0, Math.min(1, ratio));
return "".concat(ratio * 100, "%");
},
connectDevice(device = null) {
var that = this;
this.stopScan();
uni.showLoading({ title: "连接中..." });
uni.createBLEConnection(new UTSJSONObject({
deviceId: device.deviceId,
success(res = null) {
that.foundDevices = that.foundDevices.map((d) => {
return Object.assign(Object.assign({}, d), { connected: d.deviceId === device.deviceId });
});
uni.hideLoading();
uni.showToast({ title: "已连接".concat(device.name), icon: "none" });
uni.navigateTo({
url: "../connect/connect?deviceId=" + device.deviceId,
fail: (err) => {
uni.showToast({ title: "连接失败,请稍后重试", icon: "error" });
uni.closeBLEConnection(new UTSJSONObject({
deviceId: device.deviceId,
success() {
console("断开连接成功");
}
}));
}
});
},
fail() {
uni.hideLoading();
uni.showToast({ title: "连接失败", icon: "error" });
}
}));
}
}
});
const _style_0$2 = { "container": { "": { "paddingTop": "16rpx", "paddingRight": "16rpx", "paddingBottom": "16rpx", "paddingLeft": "16rpx", "backgroundColor": "#f5f5f5" } }, "title-bar": { "": { "display": "flex", "justifyContent": "space-between", "alignItems": "center", "paddingTop": "20rpx", "paddingRight": 0, "paddingBottom": "20rpx", "paddingLeft": 0, "borderBottomWidth": 1, "borderBottomStyle": "solid", "borderBottomColor": "#eeeeee", "marginBottom": "20rpx", "marginTop": "80rpx" } }, "title": { "": { "fontSize": "36rpx", "fontWeight": "bold", "color": "#333333" } }, "scan-btn": { "": { "backgroundColor": "#00c900", "color": "#FFFFFF", "paddingTop": "0rpx", "paddingRight": "24rpx", "paddingBottom": "0rpx", "paddingLeft": "24rpx", "borderTopLeftRadius": "8rpx", "borderTopRightRadius": "8rpx", "borderBottomRightRadius": "8rpx", "borderBottomLeftRadius": "8rpx", "fontSize": "28rpx", "marginRight": "5%", "backgroundColor:disabled": "#cccccc" } }, "status-tip": { "": { "textAlign": "center", "paddingTop": "40rpx", "paddingRight": 0, "paddingBottom": "40rpx", "paddingLeft": 0, "color": "#666666", "fontSize": "28rpx" } }, "loading": { "": { "width": "30rpx", "height": "30rpx", "borderTopWidth": "3rpx", "borderRightWidth": "3rpx", "borderBottomWidth": "3rpx", "borderLeftWidth": "3rpx", "borderTopStyle": "solid", "borderRightStyle": "solid", "borderBottomStyle": "solid", "borderLeftStyle": "solid", "borderTopColor": "rgba(0,0,0,0)", "borderRightColor": "#007aff", "borderBottomColor": "#007aff", "borderLeftColor": "#007aff", "marginTop": "20rpx", "marginRight": "auto", "marginBottom": "20rpx", "marginLeft": "auto", "animation": "spin 1s linear infinite" } }, "device-list": { "": { "display": "flex", "flexDirection": "column", "gap": "16rpx" } }, "device-item": { "": { "backgroundColor": "#FFFFFF", "borderTopLeftRadius": "12rpx", "borderTopRightRadius": "12rpx", "borderBottomRightRadius": "12rpx", "borderBottomLeftRadius": "12rpx", "paddingTop": "24rpx", "paddingRight": "24rpx", "paddingBottom": "24rpx", "paddingLeft": "24rpx", "boxShadow": "0 2rpx 8rpx rgba(0,0,0,0.1)", "cursor": "pointer" } }, "device-name": { "": { "display": "flex", "justifyContent": "space-between", "marginBottom": "16rpx" } }, "is_bj": { "": { "paddingTop": 3, "paddingRight": 8, "paddingBottom": 3, "paddingLeft": 8, "borderTopLeftRadius": 5, "borderTopRightRadius": 5, "borderBottomRightRadius": 5, "borderBottomLeftRadius": 5, "color": "#FFFFFF", "backgroundColor": "rgba(30,228,156,0.4)", "position": "relative", "right": 30 } }, "device-id": { "": { "fontSize": "24rpx", "color": "#999999" } }, "device-rssi": { "": { "display": "flex", "flexDirection": "column", "gap": "8rpx" } }, "rssi-bar": { "": { "height": "8rpx", "backgroundColor": "#eeeeee", "borderTopLeftRadius": "4rpx", "borderTopRightRadius": "4rpx", "borderBottomRightRadius": "4rpx", "borderBottomLeftRadius": "4rpx", "overflow": "hidden", "content::after": "''", "height::after": "100%", "backgroundImage::after": "linear-gradient(to right, #ff4d4f, #faad14, #52c41a)", "backgroundColor::after": "rgba(0,0,0,0)" } }, "device-status": { "": { "marginTop": "16rpx", "textAlign": "right" } }, "connected": { "": { "fontSize": "26rpx", "color": "#07c160", "backgroundColor": "#f0fff4", "paddingTop": "4rpx", "paddingRight": "16rpx", "paddingBottom": "4rpx", "paddingLeft": "16rpx", "borderTopLeftRadius": "12rpx", "borderTopRightRadius": "12rpx", "borderBottomRightRadius": "12rpx", "borderBottomLeftRadius": "12rpx" } }, "@FONT-FACE": [{}] };
const _export_sfc = (sfc, props) => {
const target = sfc.__vccOpts || sfc;
for (const [key, val] of props) {
target[key] = val;
}
return target;
};
function _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) {
return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
vue.createElementVNode("view", { class: "title-bar" }, [
vue.createElementVNode("text", { class: "title" }, "连接设备"),
vue.createElementVNode("button", {
class: "scan-btn",
disabled: $data.isScanning,
onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleScan && $options.toggleScan(...args))
}, vue.toDisplayString($data.isScanning ? "停止扫描" : "开始扫描"), 9, ["disabled"])
]),
$data.isScanning ? (vue.openBlock(), vue.createElementBlock("view", {
key: 0,
class: "status-tip"
}, [
vue.createElementVNode("text", null, "正在扫描设备..."),
vue.createElementVNode("view", { class: "loading" })
])) : $data.foundDevices.length === 0 ? (vue.openBlock(), vue.createElementBlock("view", {
key: 1,
class: "status-tip"
}, [
vue.createElementVNode("text", null, '未发现设备,请点击"开始扫描"')
])) : vue.createCommentVNode("", true),
vue.createElementVNode("view", { class: "device-list" }, [
(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList($data.foundDevices, (device, index) => {
return vue.openBlock(), vue.createElementBlock("view", {
class: "device-item",
key: device.deviceId,
onClick: ($event) => $options.connectDevice(device)
}, [
vue.createElementVNode("view", { class: "device-name" }, [
vue.createElementVNode("text", null, vue.toDisplayString(device.name || "未知设备"), 1),
device.is_bj ? (vue.openBlock(), vue.createElementBlock("view", {
key: 0,
class: "is_bj"
}, "吧唧")) : vue.createCommentVNode("", true),
vue.createElementVNode("text", { class: "device-id" }, vue.toDisplayString(device.deviceId), 1)
]),
vue.createElementVNode("view", { class: "device-rssi" }, [
vue.createElementVNode("text", null, "信号: " + vue.toDisplayString(device.rssi) + " dBm", 1),
vue.createElementVNode("view", {
class: "rssi-bar",
style: vue.normalizeStyle({ width: $options.getRssiWidth(device.rssi) })
}, null, 4)
]),
device.connected ? (vue.openBlock(), vue.createElementBlock("view", {
key: 0,
class: "device-status"
}, [
vue.createElementVNode("text", { class: "connected" }, "已连接")
])) : vue.createCommentVNode("", true)
], 8, ["onClick"]);
}), 128))
])
]);
}
const PagesIndexIndex = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["render", _sfc_render$1], ["styles", [_style_0$2]]]);
const _sfc_main$1 = vue.defineComponent({
data() {
return {
// 图片相关
uploadedImages: [],
currentImageUrl: "",
currentImageIndex: -1,
imageDir: "",
// BLE设备数据
isConnected: true,
isScanning: false,
batteryLevel: 0,
temperature: 0,
humidity: 0,
faceStatus: 0,
// statusPotColor:'Green',
deviceId: "",
imageServiceuuid: "",
imageWriteuuid: "",
// 模拟数据定时器
dataTimer: null
};
},
computed: {
// 表盘状态文本
faceStatusText() {
switch (this.faceStatus) {
case 0:
return "正常";
case 1:
return "更新中";
case 2:
return "异常";
default:
return "未知";
}
},
// 电池颜色(根据电量变化)
batteryColor() {
if (this.batteryLevel > 70)
return "#52c41a";
if (this.batteryLevel > 30)
return "#faad14";
return "#ff4d4f";
}
},
onLoad(options) {
this.deviceId = options.deviceId;
this.initImageDir();
this.loadSavedImages();
this.setBleMtu();
},
onUnload() {
this.stopDataSimulation();
if (this.isConnected) {
this.disconnectDevice();
}
},
methods: {
writeBleImage() {
},
getBleService() {
var that = this;
uni.getBLEDeviceServices(new UTSJSONObject({
deviceId: that.deviceId,
success(services = null) {
that.imageServiceuuid = services.services[2].uuid;
that.getBleChar();
},
fail() {
uni.__log__("log", "at pages/connect/connect.uvue:224", "获取服务Id失败");
}
}));
},
getBleChar() {
var that = this;
uni.getBLEDeviceCharacteristics(new UTSJSONObject({
deviceId: that.deviceId,
serviceId: that.imageServiceuuid,
success(res = null) {
that.imageWriteuuid = res.characteristics[0].uuid;
},
fail() {
uni.__log__("log", "at pages/connect/connect.uvue:237", "获取特征Id失败");
}
}));
},
setBleMtu() {
var that = this;
uni.setBLEMTU(new UTSJSONObject({
deviceId: that.deviceId,
mtu: 512,
success() {
that.isConnected = true;
uni.__log__("log", "at pages/connect/connect.uvue:249", "MTU设置成功");
that.getBleService();
},
fail() {
uni.__log__("log", "at pages/connect/connect.uvue:253", "MTU设置失败");
}
}));
},
// 初始化图片保存目录
initImageDir() {
this.imageDir = "watch_faces/";
},
loadSavedImages() {
const savedImages = uni.getStorageSync("watch_face_images") || [];
this.uploadedImages = savedImages;
if (savedImages.length > 0) {
this.currentImageUrl = savedImages[0].url;
this.currentImageIndex = 0;
}
},
// 判断是否为图片文件
isImageFile(filename = null) {
const ext = filename.toLowerCase().split(".").pop();
return ["jpg", "jpeg", "png", "gif", "bmp"].includes(ext);
},
// 选择图片
chooseImage() {
uni.chooseImage(new UTSJSONObject({
count: 1,
sizeType: ["compressed"],
sourceType: ["album", "camera"],
success: (res) => {
uni.__log__("log", "at pages/connect/connect.uvue:329", res);
const tempFilePath = res.tempFilePaths[0];
const fs = uni.getFileSystemManager();
fs.readFile({
filePath: tempFilePath,
encoding: "binary",
success: (res2) => {
this.imageBuffer = res2.data;
this.log = "图片读取成功,大小:" + this.imageBuffer.byteLength + "字节";
}
});
this.saveImageToLocal(tempFilePath);
},
fail: (err) => {
uni.__log__("error", "at pages/connect/connect.uvue:343", "选择图片失败:", err);
uni.showToast({ title: "选择图片失败", icon: "none" });
}
}));
},
// 保存图片到本地目录
saveImageToLocal(tempPath = null) {
const fileName = "face_".concat(Date.now(), ".png");
this.uploadedImages.push({
name: fileName,
url: tempPath
});
uni.setStorageSync("watch_face_images", this.uploadedImages);
this.currentImageIndex = this.uploadedImages.length - 1;
this.currentImageUrl = tempPath;
uni.showToast({ title: "图片保存成功", icon: "success" });
},
// 选择轮播中的图片
selectImage(index = null) {
this.currentImageIndex = index;
this.currentImageUrl = this.uploadedImages[index].url;
},
// 轮播图变化时触发
handleCarouselChange(e = null) {
const index = e.detail.current;
this.currentImageIndex = index;
this.currentImageUrl = this.uploadedImages[index].url;
},
// 设置为当前表盘
setAsCurrentFace() {
this.faceStatus = 1;
setTimeout(() => {
this.faceStatus = 0;
uni.showToast({ title: "表盘已更新", icon: "success" });
uni.setStorageSync("current_watch_face", this.currentImageUrl);
}, 1500);
},
// 切换设备连接状态
toggleConnection() {
if (this.isConnected) {
this.disconnectDevice();
} else {
this.connectDevice();
}
},
// 连接设备
connectDevice() {
var that = this;
this.isScanning = true;
uni.showToast({ title: "正在连接设备...", icon: "none" });
uni.createBLEConnection(new UTSJSONObject({
deviceId: that.deviceId,
success() {
that.isScanning = false;
that.isConnected = true;
uni.showToast({ title: "设备连接成功", icon: "success" });
that.setBleMtu();
that.startDataSimulation();
}
}));
},
// 断开连接
disconnectDevice() {
var that = this;
uni.closeBLEConnection(new UTSJSONObject({
deviceId: that.deviceId,
success() {
that.isConnected = false;
that.statusPotColor = "red";
uni.showToast({ title: "已断开连接", icon: "none" });
that.stopDataSimulation();
},
fail(res = null) {
if (res == 1e4) {
uni.openBluetoothAdapter(new UTSJSONObject({
success() {
that.isConnected = false;
},
fail() {
uni.__log__("log", "at pages/connect/connect.uvue:464", "初始化失败");
}
}));
}
}
}));
},
// 开始模拟数据更新
startDataSimulation() {
if (this.dataTimer) {
clearInterval(this.dataTimer);
}
this.batteryLevel = Math.floor(Math.random() * 30) + 70;
this.temperature = Math.floor(Math.random() * 10) + 20;
this.humidity = Math.floor(Math.random() * 30) + 40;
this.dataTimer = setInterval(() => {
if (this.batteryLevel > 1) {
this.batteryLevel = Math.max(1, this.batteryLevel - Math.random() * 2);
}
this.temperature = Math.max(15, Math.min(35, this.temperature + (Math.random() * 2 - 1)));
this.humidity = Math.max(30, Math.min(80, this.humidity + (Math.random() * 4 - 2)));
}, 5e3);
},
// 停止数据模拟
stopDataSimulation() {
if (this.dataTimer) {
clearInterval(this.dataTimer);
this.dataTimer = null;
}
}
}
});
const _style_0$1 = { "status-pot": { "": { "width": 16, "height": 16 } }, "container": { "": { "backgroundColor": "#f5f5f7" } }, "nav-bar": { "": { "display": "flex", "justifyContent": "space-between", "alignItems": "center", "paddingTop": "20rpx", "paddingRight": "30rpx", "paddingBottom": "20rpx", "paddingLeft": "30rpx", "backgroundColor": "#ffffff" } }, "nav-title": { "": { "color": "#FFFFFF", "fontSize": "36rpx" } }, "upload-btn": { "": { "alignItems": "center", "gap": "8rpx", "backgroundColor": "#28d50e", "color": "#FFFFFF", "width": "35%", "marginTop": 10, "paddingTop": "14rpx", "paddingRight": "0rpx", "paddingBottom": "14rpx", "paddingLeft": "0rpx", "borderTopLeftRadius": "8rpx", "borderTopRightRadius": "8rpx", "borderBottomRightRadius": "8rpx", "borderBottomLeftRadius": "8rpx", "fontSize": "26rpx" } }, "content": { "": { "paddingTop": "30rpx", "paddingRight": "30rpx", "paddingBottom": "30rpx", "paddingLeft": "30rpx" } }, "section-title": { "": { "fontSize": "32rpx", "color": "#333333", "marginTop": "30rpx", "marginRight": 0, "marginBottom": "20rpx", "marginLeft": 0 } }, "preview-container": { "": { "display": "flex", "flexDirection": "column", "alignItems": "center", "marginBottom": "20rpx" } }, "preview-frame": { "": { "width": "480rpx", "height": "480rpx", "backgroundColor": "#ffffff", "boxShadow": "0 4rpx 12rpx rgba(0, 0, 0, 0.1)", "display": "flex", "justifyContent": "center", "alignItems": "center", "overflow": "hidden", "position": "relative" } }, "preview-image": { "": { "width": "100%", "height": "100%" } }, "empty-preview": { "": { "display": "flex", "flexDirection": "column", "alignItems": "center", "color": "#cccccc" } }, "set-btn": { "": { "marginTop": "20rpx", "backgroundColor": "#3cbb19", "color": "#FFFFFF", "width": "35%", "paddingTop": "15rpx", "paddingRight": "0rpx", "paddingBottom": "15rpx", "paddingLeft": "0rpx", "borderTopLeftRadius": "8rpx", "borderTopRightRadius": "8rpx", "borderBottomRightRadius": "8rpx", "borderBottomLeftRadius": "8rpx", "fontSize": "28rpx" } }, "carousel-section": { "": { "marginBottom": "30rpx" } }, "carousel-container": { "": { "backgroundColor": "#FFFFFF", "borderTopLeftRadius": "16rpx", "borderTopRightRadius": "16rpx", "borderBottomRightRadius": "16rpx", "borderBottomLeftRadius": "16rpx", "paddingTop": "20rpx", "paddingRight": 0, "paddingBottom": "20rpx", "paddingLeft": 0, "boxShadow": "0 2rpx 8rpx rgba(0, 0, 0, 0.05)", "overflow": "hidden" } }, "card-swiper": { "": { "width": "100%", "height": "240rpx" } }, "swiper-item": { ".card-swiper ": { "display": "flex", "justifyContent": "center", "alignItems": "center", "transitionProperty": "all", "transitionDuration": "0.3s", "transitionTimingFunction": "ease" } }, "card-item": { "": { "width": "240rpx", "height": "240rpx" } }, "card-frame": { "": { "width": "240rpx", "height": "100%", "overflow": "hidden", "boxShadow": "0 6rpx 16rpx rgba(0, 0, 0, 0.15)", "position": "relative" } }, "card-image": { "": { "width": "240rpx", "height": "100%" } }, "card-overlay": { "": { "position": "absolute", "top": 0, "left": 0, "width": "240rpx", "height": "100%", "backgroundColor": "rgba(0,0,0,0.3)", "display": "flex", "justifyContent": "center", "alignItems": "center" } }, "swiper-item-active": { ".card-swiper ": { "transform": "scale(1)", "zIndex": 2 } }, "carousel-hint": { "": { "height": "200rpx", "display": "flex", "justifyContent": "center", "alignItems": "center", "color": "#999999", "fontSize": "26rpx", "textAlign": "center" } }, "data-section": { "": { "backgroundColor": "#FFFFFF", "borderTopLeftRadius": "16rpx", "borderTopRightRadius": "16rpx", "borderBottomRightRadius": "16rpx", "borderBottomLeftRadius": "16rpx", "paddingTop": "20rpx", "paddingRight": "30rpx", "paddingBottom": "20rpx", "paddingLeft": "30rpx", "boxShadow": "0 2rpx 8rpx rgba(0, 0, 0, 0.05)" } }, "data-grid": { "": { "gridTemplateColumns": "1fr 1fr", "gap": "20rpx", "marginBottom": "30rpx" } }, "data-card": { "": { "backgroundColor": "#f9f9f9", "borderTopLeftRadius": "12rpx", "borderTopRightRadius": "12rpx", "borderBottomRightRadius": "12rpx", "borderBottomLeftRadius": "12rpx", "paddingTop": "20rpx", "paddingRight": "20rpx", "paddingBottom": "20rpx", "paddingLeft": "20rpx", "display": "flex", "alignItems": "center", "gap": "20rpx" } }, "data-icon": { "": { "width": "60rpx", "height": "60rpx", "borderTopLeftRadius": "12rpx", "borderTopRightRadius": "12rpx", "borderBottomRightRadius": "12rpx", "borderBottomLeftRadius": "12rpx", "display": "flex", "justifyContent": "center", "alignItems": "center" } }, "battery-icon": { "": { "backgroundColor": "#f6ffed" } }, "temp-icon": { "": { "backgroundColor": "#fff7e6" } }, "humidity-icon": { "": { "backgroundColor": "#e6f7ff" } }, "status-icon": { "": { "backgroundColor": "#f0f9ff" } }, "data-info": { "": { "flex": 1 } }, "data-value": { "": { "fontSize": "32rpx", "fontWeight": "bold", "color": "#333333" } }, "data-label": { "": { "fontSize": "24rpx", "color": "#666666" } }, "connection-status": { "": { "display": "flex", "justifyContent": "space-between", "alignItems": "center", "paddingTop": "15rpx", "paddingRight": 0, "paddingBottom": "15rpx", "paddingLeft": 0, "borderTopWidth": "1rpx", "borderTopStyle": "solid", "borderTopColor": "#f0f0f0" } }, "status-text": { "": { "flex": 1, "marginTop": 0, "marginRight": "15rpx", "marginBottom": 0, "marginLeft": "15rpx", "fontSize": "28rpx", "color": "#333333" } }, "connect-btn": { "": { "paddingTop": "12rpx", "paddingRight": "24rpx", "paddingBottom": "12rpx", "paddingLeft": "24rpx", "borderTopLeftRadius": "8rpx", "borderTopRightRadius": "8rpx", "borderBottomRightRadius": "8rpx", "borderBottomLeftRadius": "8rpx", "fontSize": "26rpx", "backgroundColor": "#007aff", "color": "#FFFFFF", "backgroundColor:disabled": "#cccccc" } }, "@TRANSITION": { "swiper-item": { "property": "all", "duration": "0.3s", "timingFunction": "ease" } } };
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
const _component_uni_icons = vue.resolveComponent("uni-icons");
return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
vue.createElementVNode("view", { class: "nav-bar" }, [
vue.createElementVNode("text", { class: "nav-title" }, "表盘管理器")
]),
vue.createElementVNode("view", { class: "content" }, [
vue.createElementVNode("view", { class: "preview-container" }, [
vue.createElementVNode("view", { class: "preview-frame" }, [
$data.currentImageUrl ? (vue.openBlock(), vue.createElementBlock("image", {
key: 0,
src: $data.currentImageUrl,
class: "preview-image",
mode: "aspectFill"
}, null, 8, ["src"])) : (vue.openBlock(), vue.createElementBlock("view", {
key: 1,
class: "empty-preview"
}, [
vue.createVNode(_component_uni_icons, {
type: "image",
size: "60",
color: "#ccc"
}),
vue.createElementVNode("text", null, "请选择表盘图片")
]))
]),
$data.currentImageUrl ? (vue.openBlock(), vue.createElementBlock("button", {
key: 0,
class: "set-btn",
onClick: _cache[0] || (_cache[0] = (...args) => $options.setAsCurrentFace && $options.setAsCurrentFace(...args))
}, " 设置为当前表盘 ")) : vue.createCommentVNode("", true),
vue.createElementVNode("button", {
class: "upload-btn",
onClick: _cache[1] || (_cache[1] = (...args) => $options.chooseImage && $options.chooseImage(...args))
}, [
vue.createVNode(_component_uni_icons, {
type: "camera",
size: "24",
color: "#fff"
}),
vue.createElementVNode("text", null, "上传图片")
])
]),
vue.createElementVNode("view", { class: "carousel-section" }, [
vue.createElementVNode("text", { class: "section-title" }, "已上传表盘"),
vue.createElementVNode("view", { class: "carousel-container" }, [
vue.createElementVNode("swiper", {
class: "card-swiper",
circular: "",
"previous-margin": "200rpx",
"next-margin": "200rpx",
onChange: _cache[2] || (_cache[2] = (...args) => $options.handleCarouselChange && $options.handleCarouselChange(...args))
}, [
(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList($data.uploadedImages, (img, index) => {
return vue.openBlock(), vue.createElementBlock("swiper-item", { key: index }, [
vue.createElementVNode("view", {
class: "card-item",
onClick: ($event) => $options.selectImage(index)
}, [
vue.createElementVNode("view", { class: "card-frame" }, [
vue.createElementVNode("image", {
src: img.url,
class: "card-image",
mode: "aspectFill"
}, null, 8, ["src"]),
$data.currentImageIndex === index ? (vue.openBlock(), vue.createElementBlock("view", {
key: 0,
class: "card-overlay"
}, [
vue.createVNode(_component_uni_icons, {
type: "checkmark",
size: "30",
color: "#007aff"
})
])) : vue.createCommentVNode("", true)
])
], 8, ["onClick"])
]);
}), 128))
], 32),
$data.uploadedImages.length === 0 ? (vue.openBlock(), vue.createElementBlock("view", {
key: 0,
class: "carousel-hint"
}, [
vue.createElementVNode("text", null, "暂无上传图片,请点击上方上传按钮添加")
])) : vue.createCommentVNode("", true)
])
]),
vue.createElementVNode("view", { class: "data-section" }, [
vue.createElementVNode("text", { class: "section-title" }, "设备状态"),
vue.createElementVNode("view", { class: "data-grid" }, [
vue.createElementVNode("view", { class: "data-card" }, [
vue.createElementVNode("view", { class: "data-icon battery-icon" }, [
vue.createVNode(_component_uni_icons, {
type: "battery",
size: "36",
color: $options.batteryColor
}, null, 8, ["color"])
]),
vue.createElementVNode("view", { class: "data-info" }, [
vue.createElementVNode("text", { class: "data-value" }, vue.toDisplayString($data.batteryLevel) + "%", 1),
vue.createElementVNode("text", { class: "data-label" }, "电量")
])
]),
vue.createElementVNode("view", { class: "data-card" }, [
vue.createElementVNode("view", { class: "data-icon temp-icon" }, [
vue.createVNode(_component_uni_icons, {
type: "thermometer",
size: "36",
color: "#ff7a45"
})
]),
vue.createElementVNode("view", { class: "data-info" }, [
vue.createElementVNode("text", { class: "data-value" }, vue.toDisplayString($data.temperature) + "°C", 1),
vue.createElementVNode("text", { class: "data-label" }, "温度")
])
]),
vue.createElementVNode("view", { class: "data-card" }, [
vue.createElementVNode("view", { class: "data-icon humidity-icon" }, [
vue.createVNode(_component_uni_icons, {
type: "water",
size: "36",
color: "#40a9ff"
})
]),
vue.createElementVNode("view", { class: "data-info" }, [
vue.createElementVNode("text", { class: "data-value" }, vue.toDisplayString($data.humidity) + "%", 1),
vue.createElementVNode("text", { class: "data-label" }, "湿度")
])
]),
vue.createElementVNode("view", { class: "data-card" }, [
vue.createElementVNode("view", { class: "data-icon status-icon" }, [
vue.createVNode(_component_uni_icons, {
type: "watch",
size: "36",
color: "#52c41a"
})
]),
vue.createElementVNode("view", { class: "data-info" }, [
vue.createElementVNode("text", { class: "data-value" }, vue.toDisplayString($options.faceStatusText), 1),
vue.createElementVNode("text", { class: "data-label" }, "表盘状态")
])
])
]),
vue.createElementVNode("view", { class: "connection-status" }, [
vue.createVNode(_component_uni_icons, {
type: "bluetooth",
size: "24",
color: $data.isConnected ? "#52c41a" : "#ff4d4f",
animation: $data.isScanning ? "spin" : ""
}, null, 8, ["color", "animation"]),
vue.createElementVNode("view", {
class: "status-pot",
style: vue.normalizeStyle({
backgroundColor: $data.isConnected ? "Green" : "red"
})
}, null, 4),
vue.createElementVNode("text", { class: "status-text" }, vue.toDisplayString($data.isConnected ? "已连接设备" : $data.isScanning ? "正在搜索设备..." : "未连接设备"), 1),
vue.createElementVNode("button", {
class: "connect-btn",
onClick: _cache[3] || (_cache[3] = (...args) => $options.toggleConnection && $options.toggleConnection(...args)),
disabled: $data.isScanning
}, vue.toDisplayString($data.isConnected ? "断开连接" : "连接设备"), 9, ["disabled"])
])
])
])
]);
}
const PagesConnectConnect = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["render", _sfc_render], ["styles", [_style_0$1]]]);
__definePage("pages/index/index", PagesIndexIndex);
__definePage("pages/connect/connect", PagesConnectConnect);
const _sfc_main = vue.defineComponent(new UTSJSONObject({
onLaunch: function() {
uni.__log__("log", "at App.uvue:7", "App Launch");
},
onShow: function() {
uni.__log__("log", "at App.uvue:10", "App Show");
},
onHide: function() {
uni.__log__("log", "at App.uvue:13", "App Hide");
},
onExit: function() {
uni.__log__("log", "at App.uvue:34", "App Exit");
}
}));
const _style_0 = { "uni-row": { "": { "flexDirection": "row" } }, "uni-column": { "": { "flexDirection": "column" } } };
const App = /* @__PURE__ */ _export_sfc(_sfc_main, [["styles", [_style_0]]]);
const __global__ = typeof globalThis === "undefined" ? Function("return this")() : globalThis;
__global__.__uniX = true;
function createApp() {
const app = vue.createSSRApp(App);
return {
app
};
}
createApp().app.mount("#app");
})(Vue);