微信小程序获取蓝牙并实现内容打印

news2024/11/15 12:22:44

通过微信小程序如何实现获取蓝牙打印机并实现打印能力,之前做过一个测试Dome,能够获取附近的蓝牙打印机设备并实现打印,今天开放出来供大家参考。

wxml

<!--右下角搜索-->
<view class="ly-cass-box">
    <view class="ly-cass" bindtap="openBluetoothAdapter">
        <image src="/images/search.png" style="width: 70rpx;height: 70rpx;" />
    </view>
    <text class="ly-text">{{ly_text}}</text>
</view>


<view style="margin: 80rpx 20rpx 30rpx 20rpx;">
    <view class="has-devices-list-container">
        <view class="tip-search">搜索到的设备</view>
        <view class="devices-list">
            <view wx:for="{{devices}}" wx:key="index" class="devices-item">
                <view style="flex:2">{{item.name? item.name:item.localName}}</view>
                <button  style="flex:1;" id="{{index}}"  bindtap="_createBLEConnection">连接</button>
            </view>
        </view>
    </view>
</view>

以下图片左侧是布局样式,列表中是扫描出来的附近可以连接的蓝牙设备,右侧是我在一个超市扫描附近的设备后的实际打印效果。PS:实际打印前我已和超市收银员沟通,我在做测试代码实际打印效果,请不要用在未经许可的非法用途。

wxss

/* 搜索 */
.ly-cass-box{
    width: 150rpx;
    height: auto;
    display: flex;
    align-items: center;
    justify-content: center;
    flex-direction: column;
    position: fixed;
    bottom:70rpx;
    right: 50rpx;
    z-index: 500;
}
.ly-cass{
    width: 120rpx;
    height: 120rpx;
    background-color: #f4f4f5;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
}
.ly-text{
  margin-top: 20rpx;
  background-color: #eee;
  padding: 2rpx 8rpx 2rpx 8rpx;
  border-radius: 6rpx;
  font-size: 25rpx;
}


 .no-open-gps-tip {
    width: 100%;
    display: flex;
    flex-direction: row;
    align-items: center;
    color: #fa3534;
    font-weight: 400;
    font-size: 30rpx;
    background: rgba(235, 207, 48, 0.8);
    padding: 30rpx;
}
.devices-item {
    width: 100%;
    display: flex;
    justify-content: space-between;
    margin-top: 20rpx;
    align-items: flex-end;
    padding-bottom: 5rpx;
    border-bottom: 1px solid #f4f4f5;
}

.devices-list {
    width: 100%;
    padding: 0 20rpx;
    display: flex;
    flex-direction: column;

}

.tip-search {
    width: 100%;
    margin: 20rpx 0;
    text-align: left;
    font-size: 16px;
    color: #2979ff;
}

.has-devices-list-container {
    width: 100%;
    display: flex;
    flex-direction: column;
    margin: 30rpx 0;
}


这是我刚开发上线的的两个小游戏,欢迎大家扫码体验!

 以上两个《蛇王传说》《番茄花园》已上线微信/抖音平台运营。

《番茄花园》游戏源码已上架Cocos Store 商店,欢迎围观!Cocos StoreCocos商城 Creator扩展icon-default.png?t=N7T8https://store.cocos.com/app/detail/6122

js

const LAST_CONNECTED_DEVICE = 'last_connected_device';
const PrinterJobs = require('../../printer/printerjobs');
const printerUtil = require('../../printer/printerutil');
Page({
    data: {
        ly_text: "点击搜索",
        connected_ly: false, //蓝牙按钮是否显示
        blue_list_ly: false, //蓝牙连接列表显示
        discoveryStarted: false,
        devices: [], //已发现的蓝牙设备列表
        name: '', //已连接的设备名称
        deviceId: '', //已连接的设备deviceId
        chs: [],
        canWrite: false,

    },

    /**
     * 第一步 判断初始化蓝牙模块是否可用
     */
    openBluetoothAdapter() {
        if (!wx.openBluetoothAdapter) {
            wx.showModal({
                title: '提示',
                content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。'
            })
            return
        }
        this.openBluetoothAdapters()
    },
    /**
     * 第二步 初始化蓝牙模块
     */
    openBluetoothAdapters() {
        this.setData({
            ly_text: '搜索设备中'
        })
        wx.openBluetoothAdapter({ //请求打开蓝牙情况
            success: res => {
                //console.log('初始化蓝牙模块->res:', res)
                this.startBluetoothDevicesDiscovery(); //打开蓝牙后 开始搜索
            },
            fail: err => {
                console.log('初始化蓝牙模块->err:', err)
                // 错误码	错误信息	说明
                // 0	ok	正常
                // -1	already connect	已连接
                // 10000	not init	未初始化蓝牙适配器
                // 10001	not available	当前蓝牙适配器不可用
                // 10002	no device	没有找到指定设备
                // 10003	connection fail	连接失败
                // 10004	no service	没有找到指定服务
                // 10005	no characteristic	没有找到指定特征
                // 10006	no connection	当前连接已断开
                // 10007	property not support	当前特征不支持此操作
                // 10008	system error	其余所有系统上报的异常
                // 10009	system not support	Android 系统特有,系统版本低于 4.3 不支持 BLE
                // 10012	operate time out	连接超时
                // 10013	invalid_data	连接 deviceId 为空或者是格式不正确
                // object.fail 回调函数返回的 state 参数(仅 iOS)
                // 状态码	说明
                // 0	未知
                // 1	重置中
                // 2	不支持
                // 3	未授权
                // 4	未开启
                if (err.errCode === 10001) { //10001 当前蓝牙适配器不可用
                    wx.showModal({
                        title: '错误',
                        content: '当前蓝牙适配器不可用,请打开手机蓝牙后重试!',
                        showCancel: false
                    });
                    //监听蓝牙适配器状态变化事件
                    wx.onBluetoothAdapterStateChange(res => {
                        console.log('蓝牙适配器是否可用->res:', res);
                        if (res.available) { //available=true 蓝牙适配器可用
                            wx.onBluetoothAdapterStateChange(() => {});
                            this.startBluetoothDevicesDiscovery();
                        }
                    })
                } else {
                    wx.showModal({
                        title: '错误',
                        content: `错误码:[${err.errCode}] 错误信息:[${err.errMsg}]`,
                        showCancel: false
                    });
                }
            }
        });
    },
    /** 
     * 第三步 开始搜寻附近的蓝牙外围设备
     */
    startBluetoothDevicesDiscovery() {
        this.data.discoveryStarted = true
        wx.startBluetoothDevicesDiscovery({
            success: res => {
                console.log('开始搜寻附近的蓝牙外围设备->res', res)
                this.onBluetoothDeviceFound(); //蓝牙搜索成功后监听搜索
            },
            fail: (err) => {
                console.log('开始搜寻附近的蓝牙外围设备->err', err)
            }
        })
    },

    /**
     * 第四步 监听搜索到新设备的事件
     */
    onBluetoothDeviceFound() {
        wx.onBluetoothDeviceFound(res => {
            res.devices.forEach(device => {
                if (!device.name && !device.localName) {
                    return
                }
                let foundDevices = this.data.devices || []
                let idx = this.inArray(foundDevices, 'deviceId', device.deviceId);
                if (idx === -1) {
                    this.data.devices.push(device);
                    console.log('发现新设备:', device); //添加新设备
                } else {
                    this.data.devices[idx] = device; //更新设备数据
                }
            })
            if (this.data.devices.length >= 1) {
                this.setData({
                    blue_list_ly: true,
                    ly_text: '发现设备'
                })

            } else {
                this.setData({
                    ly_text: '未发现设备'
                })
            }
            this.setData({
                devices: this.data.devices
            })
        })
    },
    /**
     * 第五步 连接蓝牙低功耗设备
     * @param {手动点击连接蓝牙事件}
     * @param {创建连接蓝牙}
     * @param {如果已经连接过可直接连接}
     */
    _createBLEConnection(e) {
        let idx = e.currentTarget.id
        let name = this.data.devices[idx].name
        let deviceId = this.data.devices[idx].deviceId
        this.setData({
            name,
            deviceId
        })
        console.log(name)
        //连接蓝牙低功耗设备。
        // 若小程序在之前已有搜索过某个蓝牙设备,并成功建立连接,可直接传入之前搜索获取的 deviceId 直接尝试连接该设备,无需再次进行搜索操作
        wx.createBLEConnection({
            deviceId,
            success: (res) => {
                console.log('连接蓝牙低功耗设备->res:', res);
                this.setData({
                    blue_list_ly: false,
                    connected_ly: true,
                    ly_text: '已连接'
                })
                //获取蓝牙->保存到缓存
                this.getBLEDeviceServices(deviceId);
                wx.setStorage({
                    key: LAST_CONNECTED_DEVICE,
                    data: {
                        name,
                        deviceId
                    }
                })
            },
            fail: (err) => {
                console.log('连接蓝牙低功耗设备->err', err.errno);
                this.setData({
                    connected_ly: false,
                    ly_text: '连接失败'
                })
            }
        })
        this.stopBluetoothDevicesDiscovery();
    },
    /**
     * 第六步 停止搜寻附近的蓝牙外围设备
     * @param {蓝牙连接成功关闭监听搜索}
     * @param {蓝牙搜索比较消耗资源}
     */
    stopBluetoothDevicesDiscovery() {
        wx.stopBluetoothDevicesDiscovery({
            complete: () => {
                console.log('停')
                this.data.discoveryStarted = false
            }
        })
    },
    /**
     * 第七步 断开与蓝牙低功耗设备的连接
     * @param {蓝牙连接成功关闭搜索}
     * @param {功能}
     */
    closeBLEConnection(e) {
        wx.closeBLEConnection({
            deviceId: e.deviceId
        })
        this.connected_ly = false;
    },
    /**
     * 第八步  获取蓝牙低功耗设备所有服务
     * @param {蓝牙功能查询}
     * @param {蓝牙连接成功后}
     * @param {找到主要服务功能}
     */
    getBLEDeviceServices(deviceId) {
        wx.getBLEDeviceServices({
            deviceId,
            success: (res) => {
                for (let i = 0; i < res.services?.length; i++) {
                    //该服务是否为主服务
                    if (res.services[i].isPrimary) {
                        this.getBLEDeviceCharacteristics(deviceId, res.services[i].uuid);
                        return
                    }
                }
            }
        })
    },
    /**
     * 第九步 获取蓝牙低功耗设备某个服务中所有特征 
     * @param {蓝牙功能特征查询}
     * @param {主要功能的特性}
     * @param {找到主要服务功能的特征}
     * @param {到此步骤连接结束}
     */
    getBLEDeviceCharacteristics(deviceId, serviceId) {
        //获取蓝牙低功耗设备某个服务中所有特征 (characteristic)
        // read	boolean	该特征是否支持 read 操作
        // write	boolean	该特征是否支持 write 操作
        // notify	boolean	该特征是否支持 notify 操作
        // indicate	boolean	该特征是否支持 indicate 操作
        // writeNoResponse	boolean	该特征是否支持无回复写操作
        // writeDefault	boolean	该特征是否支持有回复写操作
        let name = this.data.name
        wx.getBLEDeviceCharacteristics({
            deviceId,
            serviceId,
            success: res => {
                console.log('获取蓝牙低功耗设备某个服务中所有特征 (characteristic)->res:', res)
                for (let i = 0; i < res.characteristics?.length; i++) {
                    const item = res.characteristics[i]
                    if (item.properties.write) {
                        this.setData({
                            canWrite: true
                        })
                        console.log('可以连接')
                        this._deviceId = deviceId
                        this._serviceId = serviceId
                        this._characteristicId = item.uuid
                        wx.setStorage({
                            key: "BlueKey",
                            data: {
                                _close: true,
                                _name: name,
                                _deviceId: deviceId,
                                _serviceId: serviceId,
                                _characteristicId: item.uuid,
                            }
                        })
                        //pring

                        this.writeBLECharacteristicValue()
                        break;
                    }
                }
                setTimeout(() => {
                    if (this.data.canWrite) {
                        this.setData({
                            connected_ly: true,
                            ly_text: '已连接'
                        })

                    } else {
                        wx.showToast({
                            icon: 'error',
                            title: '您当前选择的设备不支持打印功能,请重新选择!',
                            duration: 3000
                        })
                    }
                }, 1000)
            },
            fail: (res) => {
                console.error('获取蓝牙特征失败', res)
            }
        })
    },
    /**
     * 第十步 编写蓝牙需要打印的内容
     * @param {编写蓝牙需要打印的内容}
     * @param {打印按钮的事件}
     * @param {打印功能前准备}
     */
    writeBLECharacteristicValue() {
        let pd = {
            client: '测试',
            name: '张三',
            sex: '男',
            iPhone: '18888888888',
            idcard: '888888888888888888',
        }
        var that = this
        setTimeout(() => {
            let printerJobs = new PrinterJobs();
            let dayun1 = '打印机自检' + pd?.contactinfo?.client + '\r\n' +
                '姓名:' + pd?.name + '\r\n' +
                '性别:' + pd?.sex + '\r\n' +
                '联系方式:' + pd?.iPhone + '\r\n' +
                '身份证号码:' + pd?.idcard + '\r\n'

            printerJobs
                .setSize(2, 2)
                .setAlign('CT')
                .print('! 0 100 203 100 1\r\n法决定书\r\nPRINT\r\n')
                .setSize(1, 1).setAlign('LT')
                .print(dayun1)



            let buffer = printerJobs.buffer();
            // console.log('ArrayBuffer', 'length: ' + buffer.byteLength, ' hex: ' + this.ab2hex(
            // 	buffer));
            // 1.并行调用多次会存在写失败的可能性
            // 2.建议每次写入不超过20字节
            // 分包处理,延时调用
            const maxChunk = 20;
            const delay = 20;
            for (let i = 0, j = 0, length = buffer.byteLength; i < length; i += maxChunk, j++) {
                let subPackage = buffer.slice(i, i + maxChunk <= length ? (i + maxChunk) : length);
                setTimeout(this._writeBLECharacteristicValue, j * delay, subPackage);
            }

            // this.lanyardShow = false;
            // this.$refs.uUpload.clear();
           // this.clearFormData();
            wx.showToast({
                title: '打印成功',
                icon: 'success'
            })
        }, 5000)

    },

    /**
     * 第十一步
     * @param {最终的打印}
     * @param {由第十步骤调用}
     * @param {轮询打印}
     * @param {打印机输出}
     * @param {打印结束}
     */
    _writeBLECharacteristicValue(buffer) {
        wx.writeBLECharacteristicValue({
            deviceId: this._deviceId,
            serviceId: this._serviceId,
            characteristicId: this._characteristicId,
            value: buffer,
            success(res) {
                console.log('打印成功->res:', res)
            },
            fail(res) {
                console.log('打印失败', res)
            }
        })
    },




    /**
     * 第十二步
     * @param {蓝牙相关事件}
     * @param {和以上打印不衔接}
     * @param {关闭蓝牙}
     */
    closeBluetoothAdapter() {
        wx.closeBluetoothAdapter()
        this.data.discoveryStarted = false
    },

    /**
     * 第十三步
     * @param {判断蓝牙是否已经连接}
     * @param {只支持wx. 不支持wx.}
     * @param {只支持安卓, 不支持苹果}
     */
    isBluetoothDevicePaired() {
        var that = this
        wx.isBluetoothDevicePaired({
            deviceId: wx.getStorageSync("BlueKey")?._deviceId,
            success(res) {
                console.log(res, "判断连接成功")
                that.setData({
                    connected_ly: true,
                    ly_text: '连接成功'
                })

            },
            fail(err) {
                console.log(err, "判断连接失败");
                that.setData({
                    ly_text: '点击搜索'
                })

            }
        })

    },
    /**
     * 第十四步
     * @param {蓝牙相关资源事件}
     * @param {搜索 资源 打印}
     * @param {转换}
     */
    inArray(arr, key, val) {
        for (let i = 0; i < arr.length; i++) {
            if (arr[i][key] === val) {
                return i
            }
        }
        return -1
    },
    ab2hex(buffer) { // ArrayBuffer转16进度字符串示例
        const hexArr = Array.prototype.map.call(
            new Uint8Array(buffer),
            function (bit) {
                return ('00' + bit.toString(16)).slice(-2)
            }
        )
        return hexArr.join(',')
    },
    str2ab(str) {
        let buffer = new ArrayBuffer(str?.length)
        let dataView = new DataView(buffer)
        for (let i = 0; i < str?.length; i++) {
            dataView.setUint8(i, str?.charAt(i).charCodeAt(0))
        }
        return buffer;
    },
    /**
     * 第十五步
     * @param {进入页面就自动连接}
     * @param {该方法存在BUG}
     * @param {目前该方法先不投放使用}
     */
    createBLEConnectionWithDeviceId(e) {
        //创建蓝牙链接
        wx.openBluetoothAdapter({
            success: (res) => {
                let ly_data = {
                    name: wx.getStorageSync("BlueKey")?._deviceId,
                    deviceId: wx.getStorageSync("BlueKey")?._name
                }
                this._createBLEConnection(ly_data);
            },
            fail: (res) => {
                if (res.errCode === 10001) {
                    wx.showModal({
                        title: '错误',
                        content: '未找到蓝牙设备, 请打开蓝牙后重试。',
                        showCancel: false
                    });
                    this.connected_ly = false
                } else if (res.errCode === -1 || res.errCode === 10010) { //已连接
                    this.data.connected_ly = true;
                }
            }
        })
    },

    /**
     * 第十六步
     * @param {获取蓝牙适配状态}
     * @param {在蓝牙连接成功后调用查看}
     * @param {判断连接用}
     */
    getBluetoothAdapterState() {
        wx.getBluetoothAdapterState({
            success: (res) => {
                console.log(res)
                if (res.available) {
                    this.data.connected_ly = true
                    this.data.ly_text = "已连接"
                    console.log("蓝牙已经连接", res)
                } else {
                    this.connected_ly = false;
                    this.data.ly_text = "点击连接"
                    console.log("蓝牙已经断开")
                }
            }
        })
    },

})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1950232.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python第三方库】PyQt5安装与应用

文章目录 引言安装PYQT5基于Pyqt5的简单桌面应用常用的方法与属性QtDesigner工具使用与集成窗口类型QWidget和QMainWindow区别 UI文件加载方式直接加载UI文件的方式显示窗口转化py文件进行显示窗口 PyQt5中常用的操作信号与槽的设置绑定页面跳转 引言 PyQt5是一个流行的Python…

Java——多线程(2/9):线程创建方式三Callable,Thread的常用方法(如何创建、代码实例、API及优缺点)

目录 方式三&#xff1a;实现Callable接口 前言 如何创建 代码实例 API及优缺点 Thread的常用方法 代码演示 方式三&#xff1a;实现Callable接口 前言 前两种线程创建方式都存在的一个问题 假如线程执行完毕后有一些数据需要返回&#xff0c;他们重写的run方法均不能…

算法与算法分析

目录 一.前言 二.算法的特性和要求 三.分析算法--时间效率 四. 分析算法--空间效率 一.前言 算法就是对特定问题求解方法和步骤的一种描述&#xff0c;它是指令的有限序列。其中&#xff0c;每个指令表示一个或多个操作。总而言之&#xff0c;我们数据结构就是通过算法实现操…

如何根据员工的反馈来确定六西格玛培训需求?

在六西格玛的推广与实施过程中&#xff0c;最大的挑战往往不在于技术本身&#xff0c;而在于如何让每一位员工都能理解、接受并积极参与其中。员工是企业最直接的执行者&#xff0c;他们的声音直接反映了项目落地的难易程度及潜在障碍。因此&#xff0c;倾听并有效整合员工反馈…

Python Django功能强大的扩展库之channels使用详解

概要 随着实时 web 应用程序的兴起,传统的同步 web 框架已经无法满足高并发和实时通信的需求。Django Channels 是 Django 的一个扩展,旨在将 Django 从一个同步 HTTP 框架转变为一个支持 WebSockets、HTTP2 和其他协议的异步框架。它不仅能够处理传统的 HTTP 请求,还可以处…

STM32串口(串口基础)

串口整个东西可以说但凡你要碰单片机&#xff0c;想做点上点档次的东西的话那你就包用它的。32的串口配置并不难&#xff0c;哪怕是比起51其实也难不到哪去。 目录 一.通信基础 1.通信方式 2.通信速率 二.串口基础 1.串口的数据帧结构&#xff08;协议&#xff09; 2.ST…

【轨物方案】开关柜在线监测物联网解决方案

随着物联网技术的发展&#xff0c;电力设备状态监测技术也得到了迅速发展。传统的电力成套开关柜设备状态监测方法主要采用人工巡检和定期维护的方式&#xff0c;这种方法不仅效率低下&#xff0c;而且难以保证设备的实时性和安全性。因此&#xff0c;基于物联网技术的成套开关…

JDBC标准实现

JDBC是什么 Java Database Connectivity&#xff1a;Java访问数据库的解 决方案 JDBC定义了一套标准接口&#xff0c;即访问数据库的通用API&#xff0c; 不同的数据库厂商根据各自数据库的特点去实现这些接口。 JDBC希望用相同的方式访问不同的数据库&#xff0c;让具体 的…

Nacos 2.x 新增 grpc 端口,Nginx 需要配置TCP端口转发的注意事项

Nacos 2.x 开始&#xff0c;最大的变化就是端口。在默认主端口 8848 之外又新增了三个端口&#xff0c;新增端口是在配置的主端口 server.port 的基础上&#xff0c;进行一定偏移量自动生成。 8848&#xff08;主端口&#xff0c;默认8848&#xff09;web页面端口及相关http接口…

医院等保解决方案有哪些?用哪些软件可以加强等级保护?

在医疗领域&#xff0c;信息系统的安全直接关系到患者的隐私保护、医院的正常运营乃至社会的稳定。医院信息系统面临着越来越多的安全挑战。 为了确保患者信息的安全与隐私保护&#xff0c;医院需要采取有效的等保&#xff08;等级保护&#xff09;措施。那么&#xff0c;医院…

数据恢复教程:如何从硬盘、SD存储卡、数码相机中恢复误删除数据。

您正在摆弄 Android 设备。突然&#xff0c;您意外删除了一张或多张图片。不用担心&#xff0c;您总能找到一款价格实惠的数据恢复应用。这款先进的软件可帮助 Android 用户从硬盘、安全数字 (SD) 或存储卡以及数码相机中恢复已删除的数据。 Android 上数据被删除的主要原因 在…

以FastGPT为例提升Rag知识库应用中的检索召回命中率

提升Rag知识库应用中的检索召回命中率 在构建Rag&#xff08;Retrieval-Augmented Generation&#xff09;知识库应用时&#xff0c;检索召回知识片段的命中率是至关重要的。高效、准确的检索机制是确保AI系统能够精准响应用户查询的基础。当前&#xff0c;FastGPT主要采用三种…

四步实现网站HTTPS访问

随着网络安全的重要性日益凸显&#xff0c;HTTPS&#xff08;超文本传输安全协议&#xff09;已成为现代网站的标准配置。HTTPS协议作为HTTP协议的安全版本&#xff0c;通过SSL协议加密数据传输&#xff0c;不仅能保护用户数据的安全&#xff0c;还能提升搜索引擎排名&#xff…

一文带你搞懂C++友元和类型转换

6. C友元 在C中&#xff0c;一个类中可以有 public、protected、private 三种属性的成员&#xff0c;通过对象可以访问 public 成员&#xff0c;只有本类中的函数可以访问本类的 private 成员。现在&#xff0c;我们来介绍一种例外情况——友元&#xff08;friend&#xff09;。…

【ai】Easy-RAG 6:安装bge-reranker-large、 成功部署并通过frpc访问

作者用到了funasrwhisper还有RAG的rerank模型这里用的是bge-reranker-large , 要从 https://huggingface.co/BAAI/bge-reranker-large 下载。AttributeError: module ‘numba’ has no attribute ‘jit’ 【ai】Easy-RAG 4: 修复依赖项:numpy numba omegaconf 等作者的地址是…

英特尔宣布针对对Llama 3.1进行优化 以提升所有产品的性能

日前Meta正式发布了Llama 3.1开源大模型&#xff0c;以其庞大的参数量和卓越性能&#xff0c;首次在多项基准测试中击败了GPT-4o等业界领先的闭源模型。允许开发者自由地进行微调、蒸馏&#xff0c;甚至在任何地方部署&#xff0c;这种开放性为AI技术的普及和创新提供了无限可能…

关于promise的一些例题(运行步骤详细说明)

关于promise的一些例题(详细说明) 基本例题 // 直接运行 输出 1 2 const promise new Promise((resolve, reject) > {console.log(1);resolve();console.log(2); });// then后面放入微队列 promise.then(() > {console.log(3); });// 输出4 之后没有代码了所以运行为队…

秋招突击——7/23——百度提前批面试准备和正式面试

文章目录 引言一面准备面试预演一1、讲一下hashcode()和equals()关系2、equals()和有什么区别3、讲一下重载和重写的区别4、讲一下深拷贝、浅拷贝的区别5、讲一下Java异常的基类&#xff0c;运行时异常举几个例子&#xff0c;什么情况下会出现&#xff1f;6、讲一下Java中线程的…

【管控业财一体化】

1. 引言 大型集团在现代企业管理中扮演着举足轻重的角色&#xff0c;其管控业财一体化解决方案是实现企业高效运营的关键。随着数字化转型的加速&#xff0c;业财一体化不再局限于财务与业务流程的简单融合&#xff0c;而是向着更深层次的数据驱动、智能化决策和价值创造方向发…

光猫设置桥接 路由器pppoe拨号 设置正常访问光猫 (openwrt)

网络信息展示 光猫桥接很简单吧&#xff0c;就不说了。先来列出修改前的网络接口和网络信息。 光猫192.168.1.1&#xff0c;openwrt 10.0.0.0/8 初始配置 需要记录的信息&#xff1a;WAN的网络设备&#xff08;eth1&#xff09;&#xff0c;光猫的IP&#xff08;192.168.1.1&am…