Files
APP/pages/common/addDevice/addBle.vue

1296 lines
28 KiB
Vue
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.

<template>
<view class="content">
<view class="topStatric">
<view class="lblTitle">
<view class="red">搜不到设备时,请尝试重启蓝牙,或重启App后重试</view>
</view>
<view class="lblTitle">
<view>添加:{{type.typeName}} 设备数量:{{devicesCnt}}</view>
<view class="btn" style="color: #FFFFFF;" @click="ReSearch()">刷新</view>
</view>
<view class="lblTitle">
<uni-easyinput :styles="{color:'#ffffff'}" :clearable="true" class="uni-mt-5" :trim="'both'"
prefixIcon="search" v-model="search" placeholder="名称筛选"></uni-easyinput>
</view>
<view class="th">
<text>
蓝牙设备列表
</text>
<text class="margintLeft10">
{{SearchEquips.length}}
</text>
</view>
</view>
<view class="mainContent">
<view class="p100">
<view class="list searchList">
<view class="item" v-on:click="Link(item,index)" v-for="item, index in SearchEquips"
v-show="!item['linkStatu']"
:class="{'displayNone':item.name.toLowerCase().indexOf(search.toLowerCase())===-1}">
<view class="leftImg ">
<image src="/static/images/common/bluetooth.png" class="titleIco" mode="heightFix">
</image>
</view>
<view class="centertxt ">
<view class="name">
<text class="fleft">蓝牙名:{{item.name?item.name:'Unnamed'}}</text>
<text class="fright" :class="item.link?'green':'red'">{{item.link?'已连接':'未连接'}}</text>
<view class="clear"></view>
</view>
<view class="name lbl">Mac:
<text class="green" v-if="item.macAddress">{{item.macAddress}}</text>
<view class="red" v-if="!item.macAddress && item.link">
<view class="rotateAnimation">
<uni-icons type="spinner-cycle" color="#FFFFFF"></uni-icons>
</view>
</view>
</view>
<view class="name lbl">IMEI:
<text class="green" v-if="item.imei">{{item.imei}}</text>
<view class="red" v-if="!item.imei && item.link">
<view class="rotateAnimation">
<uni-icons type="spinner-cycle" color="#FFFFFF"></uni-icons>
</view>
</view>
</view>
<view class="name lbl">信号:{{item.RSSI}}dBm</view>
<view class="name lbl">
状态:
<text :class="item.isUpload?'green':'red'">{{item.remark}}</text>
</view>
<view class="name lbl">
设备名:
<text class="green">{{item.device_name}}</text>
</view>
</view>
<view class="rightIco " :class="item.isUpload?'bggreen':'bgred'">
<!-- <image :src="isItemLink(item,index,'upload')" class="img" mode="aspectFit">
</image> -->
</view>
</view>
</view>
</view>
</view>
<global-loading ref="loading" />
</view>
</template>
<script>
import bleTool from '@/utils/BleHelper.js';
import request from '@/utils/request.js';
import {
showLoading,
hideLoading,
updateLoading
} from '@/utils/loading.js'
import common from '@/utils/Common.js'
const pagePath = "pages/common/addBLE/addEquip";
var ble = null;
var these = null;
var eventChannel = null;
var time = null;
var time1 = null;
// var serv = null;
export default {
data() {
return {
Status: {
intval: null,
},
search: '',
groupid: '',
type: '',
deviceTypes: [], //设备类型
PairEquip: [], //已配对设备
EquipMents: [], //搜索出来的设备
devices: [],
devicesCnt: 0,
privateNetUrl: ''
}
},
computed: {
SearchEquips: function() {
let f = this.EquipMents.filter(v => {
return v.name.toLowerCase().indexOf(this.search.toLowerCase()) > -1
});
return f;
}
},
onHide: function() {
ble.StopSearch();
},
onUnload() {
ble.StopSearch().then(res => {
console.log("停止搜索成功")
}).catch(ex => {
console.error("停止搜索成功", ex);
});
ble.removeAllCallback(pagePath);
ble.disconnectDevice();
},
onLoad() {
this.groupid = common.DateFormat(new Date(), 'yyyy-MM-dd HH:mm:ss');
these = this;
ble = bleTool.getBleTool();
// serv = serTool.serverInit();
//已连接过但删除了设备
// #ifdef H5
this.EquipMents = [{
"RSSI": -62,
"advertisData": "",
"advertisServiceUUIDs": [
"0000FFE0-0000-1000-8000-00805F9B34FB"
],
"deviceId": "F281938F-27FC-4739-4ACA-58B8D3BC44A6",
"name": "JQZM-HBY670-1C7493",
"linkStatu": false,
link: true
},
{
"RSSI": -62,
"advertisData": "",
"advertisServiceUUIDs": [
"0000FFE0-0000-1000-8000-00805F9B34FB"
],
"deviceId": "469FB381-B47E-1E40-8073-EF50B5704AAB",
"name": "JQZM-EF4651",
"linkStatu": false
},
{
"RSSI": -62,
"advertisData": "",
"advertisServiceUUIDs": [
"0000FFE0-0000-1000-8000-00805F9B34FB"
],
"deviceId": "F281938F-27FC-4739-4ACA-58B8D3BC44A6",
"name": "JQZM-HBY670-1C7493",
"linkStatu": false,
link: true
},
{
"RSSI": -62,
"advertisData": "",
"advertisServiceUUIDs": [
"0000FFE0-0000-1000-8000-00805F9B34FB"
],
"deviceId": "469FB381-B47E-1E40-8073-EF50B5704AAB",
"name": "JQZM-EF4651",
"linkStatu": false
}, {
"RSSI": -62,
"advertisData": "",
"advertisServiceUUIDs": [
"0000FFE0-0000-1000-8000-00805F9B34FB"
],
"deviceId": "F281938F-27FC-4739-4ACA-58B8D3BC44A6",
"name": "JQZM-HBY670-1C7493",
"linkStatu": false,
link: true
},
{
"RSSI": -62,
"advertisData": "",
"advertisServiceUUIDs": [
"0000FFE0-0000-1000-8000-00805F9B34FB"
],
"deviceId": "469FB381-B47E-1E40-8073-EF50B5704AAB",
"name": "JQZM-EF4651",
"linkStatu": false
}, {
"RSSI": -62,
"advertisData": "",
"advertisServiceUUIDs": [
"0000FFE0-0000-1000-8000-00805F9B34FB"
],
"deviceId": "F281938F-27FC-4739-4ACA-58B8D3BC44A6",
"name": "JQZM-HBY670-1C7493",
"linkStatu": false,
link: true
},
{
"RSSI": -62,
"advertisData": "",
"advertisServiceUUIDs": [
"0000FFE0-0000-1000-8000-00805F9B34FB"
],
"deviceId": "469FB381-B47E-1E40-8073-EF50B5704AAB",
"name": "JQZM-EF4651",
"linkStatu": false
}, {
"RSSI": -62,
"advertisData": "",
"advertisServiceUUIDs": [
"0000FFE0-0000-1000-8000-00805F9B34FB"
],
"deviceId": "F281938F-27FC-4739-4ACA-58B8D3BC44A6",
"name": "JQZM-HBY670-1C7493",
"linkStatu": false,
link: true
},
{
"RSSI": -62,
"advertisData": "",
"advertisServiceUUIDs": [
"0000FFE0-0000-1000-8000-00805F9B34FB"
],
"deviceId": "469FB381-B47E-1E40-8073-EF50B5704AAB",
"name": "JQZM-EF4651",
"linkStatu": false
}, {
"RSSI": -62,
"advertisData": "",
"advertisServiceUUIDs": [
"0000FFE0-0000-1000-8000-00805F9B34FB"
],
"deviceId": "F281938F-27FC-4739-4ACA-58B8D3BC44A6",
"name": "JQZM-HBY670-1C7493",
"linkStatu": false,
link: true
},
{
"RSSI": -62,
"advertisData": "",
"advertisServiceUUIDs": [
"0000FFE0-0000-1000-8000-00805F9B34FB"
],
"deviceId": "469FB381-B47E-1E40-8073-EF50B5704AAB",
"name": "JQZM-EF4651",
"linkStatu": false
}, {
"RSSI": -62,
"advertisData": "",
"advertisServiceUUIDs": [
"0000FFE0-0000-1000-8000-00805F9B34FB"
],
"deviceId": "F281938F-27FC-4739-4ACA-58B8D3BC44A6",
"name": "JQZM-HBY670-1C7493",
"linkStatu": false,
link: true
},
{
"RSSI": -62,
"advertisData": "",
"advertisServiceUUIDs": [
"0000FFE0-0000-1000-8000-00805F9B34FB"
],
"deviceId": "469FB381-B47E-1E40-8073-EF50B5704AAB",
"name": "JQZM-EF4651",
"linkStatu": false
}, {
"RSSI": -62,
"advertisData": "",
"advertisServiceUUIDs": [
"0000FFE0-0000-1000-8000-00805F9B34FB"
],
"deviceId": "F281938F-27FC-4739-4ACA-58B8D3BC44A6",
"name": "JQZM-HBY670-1C7493",
"linkStatu": false,
link: true
},
{
"RSSI": -62,
"advertisData": "",
"advertisServiceUUIDs": [
"0000FFE0-0000-1000-8000-00805F9B34FB"
],
"deviceId": "469FB381-B47E-1E40-8073-EF50B5704AAB",
"name": "JQZM-EF4651",
"linkStatu": false
}, {
"RSSI": -62,
"advertisData": "",
"advertisServiceUUIDs": [
"0000FFE0-0000-1000-8000-00805F9B34FB"
],
"deviceId": "F281938F-27FC-4739-4ACA-58B8D3BC44A6",
"name": "JQZM-HBY670-1C7493",
"linkStatu": false,
link: true
},
{
"RSSI": -62,
"advertisData": "",
"advertisServiceUUIDs": [
"0000FFE0-0000-1000-8000-00805F9B34FB"
],
"deviceId": "469FB381-B47E-1E40-8073-EF50B5704AAB",
"name": "JQZM-EF4651",
"linkStatu": false
}
]
// #endif
// #ifdef APP
this.EquipMents = [];
// these.EquipMents=[];
ble.addDeviceFound((arr) => {
// console.log("发现新设备,",arr);
arr = arr.devices;
let promis = [];
for (var i = 0; i < arr.length; i++) {
arr[i].linkStatu = false;
if (!arr[i].name) {
continue;
}
arr[i].name=arr[i].name.replace(/\r\n/g, '').replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
let f = these.EquipMents.find(function(v, index) {
if (v.deviceId == arr[i].deviceId) {
these.$set(these.EquipMents[index], "RSSI", arr[i].RSSI);
return true;
}
return false;
});
if (!f) {
arr[i].remark = '正在校验...';
these.EquipMents.push(arr[i]);
these.getDevice(arr[i]);
// console.log("EquipMents=", these.EquipMents);
}
}
// console.log("equip=", these.EquipMents)
}, pagePath);
// console.log("addEquip")
ble.addReceiveCallback((receivData, f, path, arr) => {
console.log("收到消息", receivData)
console.log("f=", f)
let item = null;
if (f.macAddress) {
item = this.EquipMents.find((v, index) => {
if (v.deviceId == f.deviceId) {
v.macAddress = f.macAddress;
this.$set(this.EquipMents[index], "macAddress", f.macAddress);
console.log("22222");
return true;
}
return false;
});
console.log("111111");
}
if (f.imei) {
item = this.EquipMents.find((v, index) => {
if (v.deviceId == f.deviceId) {
v.imei = f.imei;
this.$set(this.EquipMents[index], "imei", f.imei);
return true;
}
return false;
});
}
if (this.type.communicationMode == 2) {
if (f.macAddress || f.imei) {
this.uploadItem(item);
}
} else { //==1
if (f.macAddress) {
this.uploadItem(item);
}
}
}, pagePath);
ble.addStateBreakCallback(() => {
uni.showModal({
title: '提示',
content: '蓝牙不可用'
});
these.EquipMents.filter((v, i) => {
these.$set(these.EquipMents[i], 'link', false);
});
}, pagePath);
ble.addStateRecoveryCallback(() => {
uni.showModal({
title: '提示',
content: '蓝牙恢复可用'
});
},
pagePath);
ble.addDisposeCallback((res) => {
these.EquipMents.find((v, i) => {
if (res.deviceId == v.deviceId) {
these.$set(these.EquipMents[i], 'link', false);
return true;
}
return false;
});
}, pagePath);
ble.addRecoveryCallback((res) => {
these.EquipMents.find((v, i) => {
if (res.deviceId == v.deviceId) {
these.$set(these.EquipMents[i], 'link', true);
return true;
}
return false;
});
}, pagePath);
// #endif
eventChannel = this.getOpenerEventChannel();
eventChannel.on('addType', function(rec) {
console.log("接收到父页面的参数:", rec);
these.type = rec.data;
let callback = () => {
these.getTypeDeviceCnt().then(res => {
console.error("设备数量:",res);
these.devicesCnt = res;
if (res > 0 && res <= 10000) {
these.getAlltypeDevices().then(devs => {
these.devices = devs;
these.ReSearch();
});
return;
}
these.ReSearch();
}).catch(ex => {
these.devicesCnt = 0;
these.ReSearch();
});
}
callback();
});
},
onShow: function() {
if (these.type) {
this.ReSearch();
}
},
methods: {
//获取某个类型下的所有设备
getAlltypeDevices() {
return new Promise((succ, err) => {
let json = {
"tenant_id": this.type.tenantId,
"deviceType": this.type.deviceTypeId
};
request({
url: "/app/xinghan/device/getEquipAllByType",
method: 'POST',
data: json,
}).then(res=>{
if(res && res.code==200){
succ(res.data);
return;
}
err(res);
}).catch(ex=>{
console.error("ex=",ex);
err(ex);
});
});
},
//获取类型下的设备数量
getTypeDeviceCnt() {
return new Promise((resolve, reject) => {
let json = {
"tenant_id": this.type.tenantId,
"deviceType": this.type.deviceTypeId
};
console.error("json=",json);
request({
url: "/app/xinghan/device/getEquipCountByType",
method: 'POST',
data: json,
}).then(res=>{
console.error("getEquipCountByType res.data=",res.data)
if(res && res.code==200){
resolve(res.data);
return;
}
reject(res);
}).catch(ex=>{
console.error("ex=",ex);
reject(ex);
});
});
},
getDevice(item) {
//从后台通过类型和名称查询设备
return new Promise((resolve, reject) => {
let f = null;
let fIndex = -1;
these.EquipMents.find(function(v, index) {
if (v.deviceId == item.deviceId) {
f = v;
fIndex = index;
return true;
}
return false;
});
if (this.devicesCnt > 0) {
if (this.devices && this.devices.length > 0) {
let eqp = this.devices.find(v => {
let flag= v.bluetooth_name.replace(/\r\n/g, '').replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '') == item.name;
return flag;
});
if (eqp) {
these.$set(these.EquipMents[fIndex], "isUpload",
true);
these.$set(these.EquipMents[fIndex], "remark",
"校验完成,设备已入库");
these.$set(these.EquipMents[fIndex], "macAddress",
eqp.device_mac);
these.$set(these.EquipMents[fIndex], "device_name",eqp.device_name);
console.log("从缓存中找到了设备",eqp);
resolve(eqp);
return;
}
}
console.error("缓存中找不到此设备22222222",this.devices);
these.$set(these.EquipMents[fIndex], "remark",
"校验完成,设备未入库");
reject(null);
return;
}
let succCallback=(data)=>{
if(data){
these.$set(these.EquipMents[fIndex], "isUpload",
true);
these.$set(these.EquipMents[fIndex], "remark",
"校验完成,设备已入库");
these.$set(these.EquipMents[fIndex], "macAddress",
data.device_mac);
these.$set(these.EquipMents[fIndex], "imei", data
.device_imei);
these.$set(these.EquipMents[fIndex], "device_name",data.device_name);
}
else{
console.error("设备未入库111111",data)
these.$set(these.EquipMents[fIndex], "remark",
"校验完成,设备未入库");
}
}
let errCallback=()=>{
these.$set(these.EquipMents[fIndex], "remark",
"校验出现异常");
}
let p2=new Promise((resolve,reject)=>{
let json = {
"tenant_id": this.type.tenantId,
"deviceType": this.type.deviceTypeId,
"deviceName": item.name
};
request({
url:'/app/xinghan/device/GetDeviceByName',
data:json,
method: 'POST'
}).then(res=>{
if(res && res.code==200){
resolve(res.data);
return;
}
reject(res);
}).catch(ex=>{
reject(ex);
});
})
Promise.any([p2]).then(res=>{
succCallback(res);
}).catch(ex=>{
errCallback(ex);
});
});
},
ReSearch() {
if (!ble) {
return;
}
ble.disconnectDevice().finally(dis => {
ble.StopSearch().finally(res => {
this.EquipMents = [];
this.PairEquip = [];
ble.StartSearch().then(result => {
}).catch(err => {
console.error("err=", err);
});
}).catch(ex => {
console.error("ex=", ex);
});
});
},
uploadItem(item) {
clearTimeout(time);
ble.disconnectDevice(item.deviceId).catch(ex => {});
let exec = () => {
let json = {
// "assignId": 0,
"deviceType": this.type.id,
// "customerId": 0,
"deviceName": item.name, //typeName
"deviceMac": item.macAddress,
"bluetoothName": item.name,
"deviceImei": item.imei,
// "deviceSn": "",
// "file": "",
"remark": this.groupid
}
request({
url: '/app/xinghan/device/add',
method: 'post',
data: json
}).then(res => {
if (res && res.code == 200) {
console.log("res=", res);
this.EquipMents.find((v, index) => {
if (v.deviceId == item.deviceId) {
this.$set(this.EquipMents[index], "isUpload", true);
this.$set(this.EquipMents[index], "remark", "上传成功");
this.devices.push({
bluetooth_name: item.name,
device_mac: item.macAddress,
device_name:item.name
});
this.devicesCnt = this.devices.length;
return true;
}
return false;
});
} else {
console.error("出现错误,", item);
console.error("出现错误,", this.devices);
this.EquipMents.find((v, index) => {
if (v.deviceId == item.deviceId) {
this.$set(this.EquipMents[index], "isUpload", false);
this.$set(this.EquipMents[index], "remark", res.msg);
this.devices.find((d,i)=>{
if(d.device_mac==item.macAddress){
this.$set(this.EquipMents[index], "device_name", d.device_name);
return true;
}
});
return true;
}
return false;
});
}
})
}
time = setTimeout(exec, 100)
},
isItemLink: function(item, index, type) {
let src = '/static/images/BLEAdd/noLink.png';
if (!item) {
return src;
}
if (type == 'link') {
if (this.PairEquip && this.PairEquip.length) {
if (this.PairEquip.length > 0) {
let f = this.PairEquip.find(function(v) {
return v.deviceId == item.deviceId;
});
if (f) {
src = '/static/images/BLEAdd/linked.png';
}
}
}
} else if (type == 'mac') {
if (item.macAddress) {
src = '/static/images/BLEAdd/linked.png';
}
} else if (type == 'imei') {
if (item.imei) {
src = '/static/images/BLEAdd/linked.png';
}
} else if (type == 'upload') {
if (item.isUpload) {
src = '/static/images/BLEAdd/linked.png';
}
}
return src;
},
Link: function(item) {
let exec = () => {
showLoading(this, {
text: "正在连接:第1次"
});
let index = 1;
let total = 5;
let linkCallback = (res) => {
let c = these.PairEquip.find(function(v) {
return v.deviceId == item.deviceId;
});
if (!c) {
these.PairEquip.push(item);
}
console.log("连接成功", these.device);
hideLoading(these);
}
let execLink = () => {
return new Promise((resolve, reject) => {
if (index > total) {
reject({
msg: "连接超时"
});
return;
}
ble.LinkBlue(item.deviceId).then((res) => {
console.log("连接成功");
these.EquipMents.find((v, index) => {
if (v.deviceId == item.deviceId) {
this.$set(this.EquipMents[index], "link",
true);
return true;
}
return false;
});
ble.StopSearch();
resolve(res);
}).catch((ex) => {
if (index == total) {
console.log("连接了N次都没连上");
reject(ex);
return;
}
index++;
updateLoading(this, {
text: ex.msg + ",正在重试第" + index + "次"
})
execLink().then(resolve).catch(reject);
})
});
}
execLink().then((res) => {
linkCallback(res);
}).catch(ex => {
console.log("ex=", ex)
uni.showModal({
content: "连接失败:" + ex.msg
});
hideLoading(these);
});
}
if (this.PairEquip && this.PairEquip.length) {
ble && ble.disconnectDevice();
this.PairEquip = [];
exec();
} else {
exec();
}
}
}
}
</script>
<style>
.noLink {
text-align: center;
width: 100%;
font-size: 28rpx;
}
.content {
background-color: #121212;
color: #ffffffde;
box-sizing: border-box;
overflow: hidden;
width: 100%;
min-height: 100vh;
height: auto;
}
.p100 {
width: 100%;
height: 100%;
}
.fleft {
float: left;
}
.fright {
float: right;
}
.clear {
clear: both;
}
.center {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
align-content: center;
justify-content: center;
align-items: center;
}
.topAnimate {
position: absolute;
left: 0rpx;
width: 100%;
height: 400rpx;
top: 20px;
/* 距离视口顶部 20px 时固定 */
z-index: 100;
/* 确保元素显示在最上层 */
}
.animate {
width: 100%;
height: 400rpx;
position: relative;
}
.animate .animateContent {
position: relative;
z-index: 0;
}
.animate .imgContent {
position: absolute;
z-index: 1;
width: 100%;
height: 100%;
}
.animate .imgContent .img {
height: 100rpx;
width: 100rpx;
background: #bbe600;
border-radius: 50%;
}
.animate .titleIco {
width: 36rpx;
height: 36rpx;
}
.circle {
position: absolute;
border-radius: 50%;
background-color: #bbe60033;
animation: expand 4s infinite ease-out;
display: inline-block;
transform: translate(-50%, -50%);
}
.circle:nth-child(2) {
animation-delay: 1s;
}
.circle:nth-child(3) {
animation-delay: 2s;
}
@keyframes expand {
0% {
width: 0;
height: 0;
opacity: 0.8;
}
100% {
width: 18.75rem;
height: 18.75rem;
opacity: 0.2;
}
}
.mainContent {
padding: 30rpx;
box-sizing: border-box;
width: 100%;
overflow-y: scroll;
}
.mainContent .p100 {}
.lblTitle {
color: #26df1cde;
font-family: "PingFang SC";
font-size: 28rpx;
font-weight: 700;
text-align: left;
width: 100%;
height: 60rpx;
line-height: 60rpx;
display: flex;
flex-direction: row;
flex-wrap: nowrap;
align-content: center;
align-items: center;
justify-content: space-between;
}
.list {
min-height: 120rpx;
}
.searchList {
width: 100%;
height: calc(100% - 186rpx);
overflow-y: scroll;
}
.list .item {
width: 100%;
min-height: 120rpx;
height: auto;
box-sizing: border-box;
padding: 10rpx;
border-radius: 8px;
background: #1a1a1a;
display: flex;
flex-direction: row;
flex-wrap: nowrap;
justify-content: flex-start;
align-items: center;
margin-top: 20rpx;
position: relative;
}
.list .item .leftImg {
width: 60rpx;
height: 60rpx;
}
.list .item .centertxt {
width: calc(100% - 60rpx);
height: 100%;
padding-left: 10rpx;
display: flex;
flex-direction: column;
flex-wrap: nowrap;
justify-content: space-evenly;
align-items: flex-start;
align-content: flex-start;
}
.list .item .rightIco {
position: absolute;
bottom: 0px;
right: 0px;
width: 0;
height: 0;
border-style: solid;
border-width: 0 0 30rpx 30rpx;
}
.list .item .leftImg .titleIco {
width: 100%;
height: 100%;
}
.list .item .name {
color: #ffffffde;
font-family: "PingFang SC";
font-size: 28rpx;
font-weight: 400;
line-height: 36rpx;
text-align: left;
width: 100%;
}
.list .item .name.lbl {
font-size: 26rpx !important;
display: flex;
flex-direction: row;
flex-wrap: nowrap;
align-content: center;
align-items: center;
justify-content: flex-start;
}
.list .item .name .green {
color: limegreen;
}
.list .item .name .red {
color: #FF0000;
}
.list .item .id {
color: #ffffff99;
font-family: "PingFang SC";
font-size: 24rpx;
font-weight: 400;
line-height: 36rpx;
text-align: left;
}
.list .item .rightIco .img {
width: 45rpx;
height: 45rpx;
}
.openBlue {
padding: 30rpx;
width: 100%;
box-sizing: border-box;
height: auto;
}
.openBlue .txt {
color: rgba(255, 255, 255, 0.87);
font-family: "PingFang SC";
font-size: 28rpx;
font-weight: 400;
letter-spacing: 0.14rpx;
text-align: center;
}
.openBlue .btns {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
align-content: center;
align-items: center;
justify-content: space-evenly;
margin-top: 50rpx;
width: 100%;
height: auto;
}
.openBlue .btn {
border-radius: 91rpx;
box-sizing: border-box;
width: 25%;
height: 60rpx;
text-align: center;
font-family: "PingFang SC";
font-size: 28rpx;
letter-spacing: 12rpx;
display: flex !important;
align-items: center;
letter-spacing: 0.375rem;
flex-direction: row;
flex-wrap: nowrap;
align-content: center;
justify-content: center;
}
.openBlue .cancel {
border: 1px solid rgba(255, 255, 255, 1);
color: rgba(255, 255, 255, 1);
}
.openBlue .ok {
background-color: #BBE600;
color: #232323;
}
.margintLeft10 {
margin-left: 20rpx;
color: #BBE600;
font-size: 36rpx;
}
.bleIco {
width: 60rpx;
}
.th {
display: flex;
height: 70rpx;
line-height: 70rpx;
}
.bgred {
border-color: transparent transparent #FF0000 transparent;
}
.bggreen {
border-color: transparent transparent #4CAF50 transparent;
}
@keyframes rotateClockwise {
from {
transform: rotate(0deg);
/* 起始角度0度 */
}
to {
transform: rotate(360deg);
/* 结束角度360度顺时针一圈 */
}
}
/* 应用动画到元素 */
.rotateAnimation {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
align-content: center;
justify-content: center;
align-items: center;
width: 32rpx;
height: 32rpx;
animation: rotateClockwise 3s linear infinite;
}
/* #ifdef H5 */
.topStatric {
top: 44px;
}
.mainContent {
margin-top: 160rpx;
}
/* #endif */
/* #ifdef APP */
.mainContent {
margin-top: 240rpx;
}
/* #endif */
.topStatric {
width: 100%;
box-sizing: border-box;
padding: 30rpx;
position: fixed;
top: 0rpx;
z-index: 99;
background-color: #121212;
}
.uni-mt-5 {
background-color: #000000;
}
.uni-easyinput__content {
background-color: #121212 !important;
}
</style>