初始化
This commit is contained in:
420
pages/HostUpgrade/HostUpgrade.js
Normal file
420
pages/HostUpgrade/HostUpgrade.js
Normal file
@@ -0,0 +1,420 @@
|
||||
|
||||
|
||||
const app = getApp()
|
||||
function inArray(arr, key, val) {
|
||||
for (let i = 0; i < arr.length; i++) {
|
||||
if (arr[i][key] === val) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
// ArrayBuffer转16进度字符串示例
|
||||
function ab2hex(buffer) {
|
||||
var hexArr = Array.prototype.map.call(
|
||||
new Uint8Array(buffer),
|
||||
function (bit) {
|
||||
return ('00' + bit.toString(16)).slice(-2)
|
||||
}
|
||||
)
|
||||
return hexArr.join('');
|
||||
}
|
||||
|
||||
|
||||
|
||||
Component({
|
||||
properties: {
|
||||
paramA: Number,
|
||||
paramB: String,
|
||||
// 定义属性,属性值可以是任意类型
|
||||
myProperty: {
|
||||
type: Array,
|
||||
value: {}
|
||||
}
|
||||
},
|
||||
data: {
|
||||
devices: [],
|
||||
connected: false,
|
||||
chs: [],
|
||||
TimerNumber:0,
|
||||
myArray: [],
|
||||
index: null,
|
||||
firmwareName:"这里显示文件名称",
|
||||
devicedisplay:0,
|
||||
dat_filename:"",
|
||||
dat_filePath:"",
|
||||
hex_filename:"",
|
||||
hex_filePath:"",
|
||||
},
|
||||
|
||||
methods: {
|
||||
onLoad: function() {
|
||||
this.data.paramA // 页面参数 paramA 的值
|
||||
this.data.paramB // 页面参数 paramB 的值
|
||||
|
||||
},
|
||||
bindPickerChange: function(e) {
|
||||
console.log('picker发送选择改变,携带值为', e.detail.value)
|
||||
this.setData({
|
||||
index: e.detail.value
|
||||
})
|
||||
},
|
||||
// 初始化蓝牙
|
||||
openBluetoothAdapter() {
|
||||
wx.openBluetoothAdapter({
|
||||
success: (res) => {
|
||||
console.log('openBluetoothAdapter success', res)
|
||||
this.startBluetoothDevicesDiscovery()
|
||||
},
|
||||
fail: (res) => {
|
||||
if (res.errCode === 10001) {
|
||||
wx.onBluetoothAdapterStateChange(function (res) {
|
||||
console.log('onBluetoothAdapterStateChange', res)
|
||||
if (res.available) {
|
||||
this.startBluetoothDevicesDiscovery()
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
var _this =this;
|
||||
let num =setTimeout(function(){
|
||||
_this.stopBluetoothDevicesDiscovery()
|
||||
},20000)
|
||||
// console.log('setTimeout'+num)
|
||||
this.setData({
|
||||
TimerNumber: num,
|
||||
})
|
||||
// console.log('setTimeout'+this.data.TimerNumber)
|
||||
},
|
||||
|
||||
|
||||
startBluetoothDevicesDiscovery() {
|
||||
console.log('startBluetoothDevicesDiscovery ')
|
||||
if (this._discoveryStarted) {
|
||||
return
|
||||
}
|
||||
this._discoveryStarted = true
|
||||
wx.startBluetoothDevicesDiscovery({
|
||||
allowDuplicatesKey: true,
|
||||
success: (res) => {
|
||||
console.log('startBluetoothDevicesDiscovery success', res)
|
||||
this.onBluetoothDeviceFound()
|
||||
},
|
||||
fail(res) {
|
||||
console.error('startBluetoothDevicesDiscovery', res)
|
||||
}
|
||||
})
|
||||
},
|
||||
closeBLEConnection() {
|
||||
wx.closeBLEConnection({
|
||||
deviceId: this.data.deviceId
|
||||
})
|
||||
this.setData({
|
||||
connected: false,
|
||||
chs: [],
|
||||
canWrite: false,
|
||||
devicedisplay:-1
|
||||
})
|
||||
},
|
||||
onBluetoothDeviceFound() {
|
||||
// console.log('onBluetoothDeviceFound ')
|
||||
wx.onBluetoothDeviceFound((res) => {
|
||||
// console.log('onBluetoothDeviceFound ',res)
|
||||
res.devices.forEach(device => {
|
||||
if (!device.name && !device.localName) {
|
||||
return
|
||||
}
|
||||
const foundDevices = this.data.devices
|
||||
const idx = inArray(foundDevices, 'deviceId', device.deviceId)
|
||||
const data = {}
|
||||
if (idx === -1) {
|
||||
data[`devices[${foundDevices.length}]`] = device
|
||||
} else {
|
||||
data[`devices[${idx}]`] = device
|
||||
}
|
||||
this.setData(data)
|
||||
})
|
||||
})
|
||||
},
|
||||
getBluetoothAdapterState() {
|
||||
wx.getBluetoothAdapterState({
|
||||
success: (res) => {
|
||||
console.log('getBluetoothAdapterState', res)
|
||||
if (res.discovering) {
|
||||
this.onBluetoothDeviceFound()
|
||||
} else if (res.available) {
|
||||
this.startBluetoothDevicesDiscovery()
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
startBluetoothDevicesDiscovery() {
|
||||
console.log('startBluetoothDevicesDiscovery ')
|
||||
if (this._discoveryStarted) {
|
||||
return
|
||||
}
|
||||
this._discoveryStarted = true
|
||||
wx.startBluetoothDevicesDiscovery({
|
||||
allowDuplicatesKey: true,
|
||||
success: (res) => {
|
||||
console.log('startBluetoothDevicesDiscovery success', res)
|
||||
this.onBluetoothDeviceFound()
|
||||
},
|
||||
fail(res) {
|
||||
console.error('startBluetoothDevicesDiscovery', res)
|
||||
}
|
||||
})
|
||||
},
|
||||
stopBluetoothDevicesDiscovery() {
|
||||
// console.log('setTimeout'+this.data.TimerNumber)
|
||||
|
||||
wx.stopBluetoothDevicesDiscovery()
|
||||
if (this.data.TimerNumber!=0){
|
||||
// console.log('timeoutID'+ this.data.TimerNumber)
|
||||
clearTimeout(this.data.TimerNumber)
|
||||
}
|
||||
|
||||
},
|
||||
createBLEConnection(e) {
|
||||
|
||||
const ds = e.currentTarget.dataset
|
||||
const deviceId = ds.deviceId
|
||||
const name = ds.name
|
||||
|
||||
console.log('createBLEConnection:'+deviceId)
|
||||
wx.createBLEConnection({
|
||||
deviceId,
|
||||
success: (res) => {
|
||||
this.setData({
|
||||
connected: true,
|
||||
name,
|
||||
deviceId,
|
||||
devicedisplay:deviceId,
|
||||
})
|
||||
console.log('kkkkk:'+this.devicedisplay)
|
||||
this.getBLEDeviceServices(deviceId)
|
||||
},
|
||||
fail: (res) => {
|
||||
console.error('createBLEConnection', res.errMsg)
|
||||
}
|
||||
}
|
||||
)
|
||||
this.stopBluetoothDevicesDiscovery()
|
||||
},
|
||||
|
||||
getBLEDeviceServices(deviceId) {
|
||||
wx.getBLEDeviceServices({
|
||||
deviceId,
|
||||
success: (res) => {
|
||||
console.log('getBLEDeviceServices', res.characteristics)
|
||||
for (let i = 0; i < res.services.length; i++) {
|
||||
if (res.services[i].isPrimary) {
|
||||
this.getBLEDeviceCharacteristics(deviceId, res.services[i].uuid)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
getBLEDeviceCharacteristics(deviceId, serviceId) {
|
||||
wx.getBLEDeviceCharacteristics({
|
||||
deviceId,
|
||||
serviceId,
|
||||
success: (res) => {
|
||||
console.log('getBLEDeviceCharacteristics success', res.characteristics)
|
||||
for (let i = 0; i < res.characteristics.length; i++) {
|
||||
let item = res.characteristics[i]
|
||||
|
||||
if (item.properties.read) {
|
||||
console.log('read characteristicId:'+item.uuid, res.errMsg)
|
||||
wx.readBLECharacteristicValue({
|
||||
deviceId,
|
||||
serviceId,
|
||||
characteristicId: item.uuid,
|
||||
})
|
||||
}
|
||||
if (item.properties.write && item.properties.notify) {
|
||||
this.setData({
|
||||
canWrite: true
|
||||
})
|
||||
this._deviceId = deviceId
|
||||
this._serviceId = serviceId
|
||||
this._characteristicId = item.uuid
|
||||
console.log('Write _characteristicId:'+item.uuid, res.errMsg)
|
||||
|
||||
// this.writeBLECharacteristicValue('11223344AABBCC')
|
||||
}
|
||||
if (item.properties.notify || item.properties.indicate) {
|
||||
console.log('notify OR indicate characteristicId:'+item.uuid, res.errMsg)
|
||||
wx.notifyBLECharacteristicValueChange({
|
||||
deviceId,
|
||||
serviceId,
|
||||
characteristicId: item.uuid,
|
||||
state: true,
|
||||
})
|
||||
}
|
||||
}
|
||||
},
|
||||
fail(res) {
|
||||
console.error('getBLEDeviceCharacteristics', res)
|
||||
}
|
||||
})
|
||||
// 操作之前先监听,保证第一时间获取数据
|
||||
wx.onBLECharacteristicValueChange((characteristic) => {
|
||||
const idx = inArray(this.data.chs, 'uuid', characteristic.characteristicId)
|
||||
const data = {}
|
||||
if (idx === -1) {
|
||||
data[`chs[${this.data.chs.length}]`] = {
|
||||
uuid: characteristic.characteristicId,
|
||||
value: ab2hex(characteristic.value)
|
||||
}
|
||||
} else {
|
||||
data[`chs[${idx}]`] = {
|
||||
uuid: characteristic.characteristicId,
|
||||
value: ab2hex(characteristic.value)
|
||||
}
|
||||
}
|
||||
// data[`chs[${this.data.chs.length}]`] = {
|
||||
// uuid: characteristic.characteristicId,
|
||||
// value: ab2hex(characteristic.value)
|
||||
// }
|
||||
this.setData(data)
|
||||
})
|
||||
},
|
||||
|
||||
stringToBytes : function(strtxt) {
|
||||
return new TextEncoder().encode(strtxt)
|
||||
},
|
||||
stringToByteArray:function (str) {
|
||||
console.log('str'+str)
|
||||
var array = new Uint8Array(str.length);
|
||||
for (var i = 0; i < str.length; i++) {
|
||||
array[i] = str.charCodeAt(i);
|
||||
console.log('array[i]'+array[i])
|
||||
}
|
||||
return array;
|
||||
} ,
|
||||
chooseMessageFile(e){
|
||||
const ds = e.currentTarget.dataset;
|
||||
const name = ds.name;
|
||||
const _this =this
|
||||
let array = [name]
|
||||
|
||||
|
||||
console.log(_this.properties.paramA)
|
||||
console.log(app.globalData.roomIDName.length)
|
||||
console.log(_this.data.myArray.length)
|
||||
console.log(_this.properties.myProperty.length)
|
||||
|
||||
|
||||
wx.chooseMessageFile({
|
||||
count: 1,
|
||||
type:'file',
|
||||
extension:array,
|
||||
success(res){
|
||||
console.log(res)
|
||||
if (name === '.hex')
|
||||
{
|
||||
console.log('chooseMessageFile True HEX:'+res.tempFiles[0].path)
|
||||
_this.setData({
|
||||
hex_filename:res.tempFiles[0].name,
|
||||
hex_filePath:res.tempFiles[0].path,
|
||||
|
||||
})
|
||||
}
|
||||
else if (name === '.dat') {
|
||||
console.log('chooseMessageFile True DAT:'+res.tempFiles[0].path)
|
||||
_this.setData({
|
||||
dat_filename:res.tempFiles[0].name,
|
||||
dat_filePath:res.tempFiles[0].path,
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
},
|
||||
fail (res) {
|
||||
console.log('Failed to get file', res.errMsg)
|
||||
}
|
||||
|
||||
|
||||
})
|
||||
},
|
||||
|
||||
|
||||
writeBLECharacteristicValue(sendstr) {
|
||||
// 向蓝牙设备发送一个0x00的16进制数据
|
||||
|
||||
console.log(sendstr)
|
||||
let datebuffer =this.stringToByteArray(sendstr);
|
||||
// console.log('buffer Size:'+buffer.length)
|
||||
|
||||
let buffer = datebuffer.buffer
|
||||
console.log('datebuffer'+datebuffer)
|
||||
// let dataView = new Uint8Array(buffer)
|
||||
// dataView.a
|
||||
console.log('buffer.leng'+buffer.byteLength)
|
||||
console.log('buffer.leng'+buffer)
|
||||
// dataView.setUint8(1,11)
|
||||
// dataView.setUint8(2,16)
|
||||
// dataView.setUint8(3,13)
|
||||
// dataView.setUint8(4,18)
|
||||
// dataView.setUint8(5,12)
|
||||
// dataView.setUint8(6,24)
|
||||
// dataView.setUint8(7,54)
|
||||
// dataView.setUint8(8,34)
|
||||
|
||||
console.log('UUID :'+this._characteristicId)
|
||||
|
||||
wx.writeBLECharacteristicValue({
|
||||
deviceId: this._deviceId,
|
||||
serviceId: this._serviceId,
|
||||
characteristicId: this._characteristicId,
|
||||
value: buffer,
|
||||
success (res) {
|
||||
console.log('writeBLECharacteristicValue success', res.errMsg)
|
||||
},
|
||||
fail (res) {
|
||||
console.log('writeBLECharacteristicValue fail', res.errMsg)
|
||||
}
|
||||
})
|
||||
},
|
||||
writeBLECharacteristicValue1(){
|
||||
this.writeBLECharacteristicValue('1233456789a')
|
||||
},
|
||||
|
||||
closeBluetoothAdapter() {
|
||||
wx.closeBluetoothAdapter()
|
||||
this._discoveryStarted = false
|
||||
},
|
||||
|
||||
|
||||
|
||||
},
|
||||
|
||||
|
||||
|
||||
ready: function () {
|
||||
|
||||
console.log(app.globalData.roomIDName)
|
||||
this.setData({
|
||||
myArray:app.globalData.roomIDName
|
||||
})
|
||||
console.log( this.data.myArray)
|
||||
},
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// 蓝牙操作
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
})
|
||||
3
pages/HostUpgrade/HostUpgrade.json
Normal file
3
pages/HostUpgrade/HostUpgrade.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"usingComponents": {}
|
||||
}
|
||||
117
pages/HostUpgrade/HostUpgrade.wxml
Normal file
117
pages/HostUpgrade/HostUpgrade.wxml
Normal file
@@ -0,0 +1,117 @@
|
||||
<view class="cu-item">
|
||||
<view class="flex align-center bg-gray">
|
||||
|
||||
<view class="flex-sub ">
|
||||
<text >房型:</text>
|
||||
</view>
|
||||
|
||||
<view class="flex-eight " style=" justify-content: center; align-items: center;padding: 5rpx 20rpx;"> <!--padding: 5rpx 30rpx;-->
|
||||
<picker bindchange="bindPickerChange" class="" mode="selector" range="{{myArray}}" >
|
||||
<view class="cu-tag line-cyan basis-xl " style="width: 100%;" >
|
||||
<view class="basis-xxl" style=" text-align: center; ">{{myArray[index]}}</view>
|
||||
<text class=" cuIcon-triangledownfill"style="padding: 5rpx 30rpx;" ></text>
|
||||
</view>
|
||||
</picker>
|
||||
</view>
|
||||
|
||||
<view>
|
||||
<button style=" font-size: 28rpx;" data-index="0" bindtap="openBluetoothAdapter" class=" flex-sub cu-btn bg-{{showinfo==0?'green':'grey'}} ">搜索蓝牙</button>
|
||||
</view>
|
||||
|
||||
</view>
|
||||
|
||||
<view class="flex solid-bottom align-center "style="padding: 8rpx 8rpx;">
|
||||
|
||||
<view class="flex-nine " style="padding: 2rpx 0rpx;display: inline-block;">
|
||||
<view class="flex newcu-tag line-olive" style="padding: 5rpx 5rpx;width: 100%;">
|
||||
<view class=" flex-sub newcu-tag line-olive">
|
||||
<text >固件:</text>
|
||||
</view>
|
||||
<view class=" flex-five newcu-tag line-olive" style="width: 65%;">
|
||||
<text>{{hex_filename}}</text>
|
||||
</view>
|
||||
<view class=" flex-sub newcu-tag line-olive">
|
||||
<view class="newcu-tag line-olive"style="padding: 5rpx 5rpx;">
|
||||
<button class="cu-btn" data-name=".hex" style=" font-size: 24rpx; "bindtap="chooseMessageFile" >···</button>
|
||||
</view>
|
||||
<view class="newcu-tag line-olive" style="padding: 5rpx 5rpx;">
|
||||
<button class="cu-btn"style=" font-size: 24rpx;" >下发</button>
|
||||
</view>
|
||||
|
||||
</view>
|
||||
</view>
|
||||
<view class="flex newcu-tag line-blue" style="padding: 5rpx 5rpx;width: 100%;">
|
||||
<view class=" flex-sub newcu-tag line-blue">
|
||||
<text >配置:</text>
|
||||
</view>
|
||||
<view class=" flex-five newcu-tag line-blue" style="width: 65%;">
|
||||
<text>{{dat_filename}}</text>
|
||||
</view>
|
||||
<view class=" flex-sub newcu-tag line-blue">
|
||||
<view class="newcu-tag line-blue"style="padding: 5rpx 5rpx;">
|
||||
<button class="cu-btn" data-name=".dat" style=" font-size: 24rpx; "bindtap="chooseMessageFile" >···</button>
|
||||
</view>
|
||||
<view class="newcu-tag line-blue" style="padding: 5rpx 5rpx;">
|
||||
<button class="cu-btn"style=" font-size: 24rpx;" >下发</button>
|
||||
</view>
|
||||
|
||||
</view>
|
||||
</view>
|
||||
|
||||
</view>
|
||||
|
||||
<view hover-class="device_item_hover" class="flex-twice align-center bg-grey " style="padding: 2rpx 0rpx;display: inline-block;">
|
||||
<view class="flex newcu-tag "style="padding: 5rpx 5rpx;width: 100%;" >获取</view>
|
||||
<view class="flex newcu-tag " style="padding: 5rpx 5rpx;width: 100%;">文件</view>
|
||||
<!-- <button class="bg-grey padding-5 margin-5 " style=" font-size: 38rpx; " data-index="0" bindtap="GetshowinfoClick" >获取\r文件</button> -->
|
||||
</view>
|
||||
</view>
|
||||
<view class=" bg-white">
|
||||
<view class="flex ">
|
||||
<view class="cu-progress round">
|
||||
<view class="bg-green" style="width:{{loading?'80%':''}};"></view>
|
||||
</view>
|
||||
<text class="margin-left">80%</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view>
|
||||
<view class="flex align-center ">
|
||||
<view class="devices_summary">已发现 {{devices.length}} 个外围设备:</view>
|
||||
<button style=" font-size: 28rpx;" data-index="0" bindtap="openBluetoothAdapter" class=" flex-sub cu-btn bg-{{showinfo==0?'green':'grey'}} ">设置</button>
|
||||
<button style=" font-size: 28rpx;" data-index="0" bindtap="openBluetoothAdapter" class=" flex-sub cu-btn bg-{{showinfo==0?'green':'grey'}} ">通信日志</button>
|
||||
</view>
|
||||
|
||||
<scroll-view class="device_list" scroll-y scroll-with-animation>
|
||||
<view wx:for="{{devices}}" wx:key="index"
|
||||
|
||||
class="device_item cf padding-sm">
|
||||
<view data-device-id="{{item.deviceId}}" data-name="{{item.name || item.localName}}" class="fl flex-eight bg-{{devicedisplay==item.deviceId?'green':'white'}}" bindtap="createBLEConnection" hover-class="device_item_hover" >
|
||||
<view style="font-size: 16px; color: #333;"> {{item.name}}</view>
|
||||
<view style="font-size: 10px">信号强度: {{item.RSSI}}dBm ({{utils.max(0, item.RSSI + 100)}}%)</view>
|
||||
<view style="font-size: 10px">UUID: {{item.deviceId}}</view>
|
||||
<view style="font-size: 10px">Service数量: {{utils.len(item.advertisServiceUUIDs)}}</view>
|
||||
<!-- <view class="bg-gray margin-xs" style="padding:2rpx;"></view> -->
|
||||
</view>
|
||||
<view class="fr flex-twice">
|
||||
<button class="bg-red padding-lg margin-xs radius " style="font-size: 26rpx; " data-index="0" bindtap="closeBLEConnection" wx:if="{{devicedisplay==item.deviceId}}">断开连接</button>
|
||||
</view>
|
||||
</view>
|
||||
</scroll-view>
|
||||
|
||||
<!-- <view class="connected_info" wx:if="{{connected}}">
|
||||
<view>
|
||||
<text>已连接到 {{name}}</text>
|
||||
<view class="operation">
|
||||
<button wx:if="{{canWrite}}" size="mini" bindtap="writeBLECharacteristicValue1">写数据</button>
|
||||
<button size="mini" bindtap="closeBLEConnection">断开连接</button>
|
||||
</view>
|
||||
</view>
|
||||
<view wx:for="{{chs}}" wx:key="index" style="font-size: 12px; margin-top: 10px;">
|
||||
<view>特性UUID: {{item.uuid}}</view>
|
||||
<view>特性值: {{item.value}}</view>
|
||||
</view>
|
||||
</view> -->
|
||||
|
||||
|
||||
</view>
|
||||
80
pages/HostUpgrade/HostUpgrade.wxss
Normal file
80
pages/HostUpgrade/HostUpgrade.wxss
Normal file
@@ -0,0 +1,80 @@
|
||||
/* pages/HostUpgrade/HostUpgrade.wxss */@import "../../colorui/main.wxss";
|
||||
@import "../../colorui/icon.wxss";
|
||||
|
||||
.flex-nine
|
||||
{
|
||||
flex: 8;
|
||||
}
|
||||
.flex-five
|
||||
{
|
||||
flex: 5;
|
||||
}
|
||||
|
||||
.newcu-tag{
|
||||
font-size: 32rpx;
|
||||
vertical-align: middle;
|
||||
position: relative;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
box-sizing: border-box;
|
||||
padding: 0rpx 0rpx;
|
||||
height: 70rpx;
|
||||
font-family: Helvetica Neue, Helvetica, sans-serif;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.newcu-tag[class*="line-"]::after {
|
||||
content: " ";
|
||||
width: 200%;
|
||||
height: 200%;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
border: 1rpx solid currentColor;
|
||||
transform: scale(0.5);
|
||||
transform-origin: 0 0;
|
||||
box-sizing: border-box;
|
||||
border-radius: inherit;
|
||||
z-index: 1;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.devices_summary {
|
||||
margin-top: 2px;
|
||||
padding: 6px;
|
||||
font-size: 16px;
|
||||
}
|
||||
.device_list {
|
||||
height: 500px;
|
||||
margin: 50px 5px;
|
||||
margin-top: 0;
|
||||
border: 1px solid #EEE;
|
||||
border-radius: 5px;
|
||||
width: auto;
|
||||
}
|
||||
.device_item {
|
||||
border-bottom: 1px solid #EEE;
|
||||
padding: 10px;
|
||||
color: #666;
|
||||
}
|
||||
.device_item_hover {
|
||||
background-color: rgba(0, 0, 0, .1);
|
||||
}
|
||||
.connected_info {
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
background-color: #F0F0F0;
|
||||
padding: 10px;
|
||||
padding-bottom: 20px;
|
||||
margin-bottom: env(safe-area-inset-bottom);
|
||||
font-size: 14px;
|
||||
min-height: 100px;
|
||||
box-shadow: 0px 0px 3px 0px;
|
||||
}
|
||||
.connected_info .operation {
|
||||
position: absolute;
|
||||
display: inline-block;
|
||||
right: 30px;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user