鸿蒙NEXT开发定位工具类 (WGS-84坐标系)(ArkTs)

news2025/4/23 13:21:00
import geoLocationManager from '@ohos.geoLocationManager';
import { BusinessError, Callback } from '@ohos.base';
import { LogUtil } from './LogUtil';
import { PermissionUtil } from './PermissionUtil';
import { map, mapCommon } from '@kit.MapKit';
/**
 * 定位工具类 (WGS-84坐标系)
 * author: CSDN-鸿蒙布道师
 * since: 2025/04/22
 */
export class LocationUtil {
  /**
   * 判断位置服务是否已经使能(定位是否开启)。
   * @returns true 表示定位已开启,false 表示未开启。
   */
  static isLocationEnabled(): boolean {
    return geoLocationManager.isLocationEnabled();
  }
  /**
   * 申请定位权限。
   * @returns true 表示授权成功,false 表示用户拒绝授权。
   */
  static async requestLocationPermissions(): Promise<boolean> {
    const permissions: Array<string> = ['ohos.permission.LOCATION', 'ohos.permission.APPROXIMATELY_LOCATION'];
    let grant: boolean = await PermissionUtil.requestPermissions(permissions);
    if (!grant) {
      grant = await PermissionUtil.requestPermissionOnSetting(permissions);
    }
    return grant;
  }
  /**
   * 获取当前位置(简化版)。
   * @returns 当前位置信息。如果发生错误,则返回 null。
   */
  static async getCurrentLocationEasy(): Promise<geoLocationManager.Location | null> {
    return LocationUtil.getCurrentLocation();
  }
  /**
   * 获取当前位置。
   * @param request 可选的定位请求参数。
   * @returns 当前位置信息。如果发生错误,则返回 null。
   */
  static async getCurrentLocation(
    request?: geoLocationManager.CurrentLocationRequest | geoLocationManager.SingleLocationRequest
  ): Promise<geoLocationManager.Location | null> {
    try {
      return await geoLocationManager.getCurrentLocation(request);
    } catch (err) {
      LocationUtil.handleError(err, '获取当前位置失败');
      return null; // 返回 null 表示发生错误
    }
  }
  /**
   * 开启位置变化订阅,并发起定位请求(简化版)。
   * @param callBack 回调函数。
   * @returns 成功返回 0,失败返回错误码。
   */
  static onLocationChangeEasy(callBack: Callback<geoLocationManager.Location>): number {
    const defaultRequest: geoLocationManager.LocationRequest = {
      priority: geoLocationManager.LocationRequestPriority.FIRST_FIX,
      scenario: geoLocationManager.LocationRequestScenario.UNSET,
      timeInterval: 10,
      distanceInterval: 0,
      maxAccuracy: 0,
    };
    return LocationUtil.onLocationChange(defaultRequest, callBack);
  }
  /**
   * 开启位置变化订阅,并发起定位请求。
   * @param request 定位请求参数。
   * @param callBack 回调函数。
   * @returns 成功返回 0,失败返回错误码。
   */
  static onLocationChange(
    request: geoLocationManager.LocationRequest | geoLocationManager.ContinuousLocationRequest,
    callBack: Callback<geoLocationManager.Location>
  ): number {
    try {
      geoLocationManager.on('locationChange', request, callBack);
      return 0;
    } catch (err) {
      return LocationUtil.handleError(err, '开启位置变化订阅失败');
    }
  }
  /**
   * 关闭位置变化订阅,并删除对应的定位请求。
   * @param callback 不传则取消当前类型的所有订阅。
   * @returns 成功返回 0,失败返回错误码。
   */
  static offLocationChange(callback?: Callback<geoLocationManager.Location>): number {
    try {
      if (callback) {
        geoLocationManager.off('locationChange', callback);
      } else {
        geoLocationManager.off('locationChange');
      }
      return 0;
    } catch (err) {
      return LocationUtil.handleError(err, '关闭位置变化订阅失败');
    }
  }
  /**
   * 判断地理编码与逆地理编码服务是否可用。
   * @returns true 表示服务可用,false 表示不可用。
   */
  static isGeocoderAvailable(): boolean {
    return geoLocationManager.isGeocoderAvailable();
  }
  /**
   * 地理编码:将地理描述转换为具体坐标集合。
   * @param locationName 地理位置描述。
   * @param maxItems 返回结果的最大数量。
   * @returns 编码后的坐标集合。
   */
  static async getGeoAddressFromLocationName(
    locationName: string,
    maxItems: number = 1
  ): Promise<Array<geoLocationManager.GeoAddress>> {
    const geocodeRequest: geoLocationManager.GeoCodeRequest = {
      description: locationName,
      maxItems,
      locale: 'zh',
    };
    try {
      const result = await geoLocationManager.getAddressesFromLocationName(geocodeRequest);
      return result || [];
    } catch (err) {
      LocationUtil.handleError(err, '地理编码失败');
      return [];
    }
  }
  /**
   * 地理编码:将地理描述转换为具体坐标。
   * @param locationName 地理位置描述。
   * @returns 编码后的坐标对象。
   */
  static async getAddressFromLocationName(locationName: string): Promise<geoLocationManager.GeoAddress> {
    const geoAddressList = await LocationUtil.getGeoAddressFromLocationName(locationName, 1);
    return geoAddressList.length > 0 ? geoAddressList[0] : {};
  }
  /**
   * 逆地理编码:将坐标转换为地理描述集合。
   * @param latitude 纬度。
   * @param longitude 经度。
   * @param maxItems 返回结果的最大数量。
   * @returns 逆编码后的地理描述集合。
   */
  static async getGeoAddressFromLocation(
    latitude: number,
    longitude: number,
    maxItems: number = 1
  ): Promise<Array<geoLocationManager.GeoAddress>> {
    const reverseGeocodeRequest: geoLocationManager.ReverseGeoCodeRequest = {
      latitude,
      longitude,
      maxItems,
      locale: 'zh',
    };
    try {
      const result = await geoLocationManager.getAddressesFromLocation(reverseGeocodeRequest);
      return result || [];
    } catch (err) {
      LocationUtil.handleError(err, '逆地理编码失败');
      return [];
    }
  }
  /**
   * 逆地理编码:将坐标转换为地理描述。
   * @param latitude 纬度。
   * @param longitude 经度。
   * @returns 逆编码后的地理描述对象。
   */
  static async getAddressFromLocation(latitude: number, longitude: number): Promise<geoLocationManager.GeoAddress> {
    const geoAddressList = await LocationUtil.getGeoAddressFromLocation(latitude, longitude, 1);
    return geoAddressList.length > 0 ? geoAddressList[0] : {};
  }
  /**
   * 获取当前的国家码。
   * @returns 当前国家码。
   */
  static async getCountryCode(): Promise<string> {
    try {
      const result = await geoLocationManager.getCountryCode();
      return result?.country || '';
    } catch (err) {
      LocationUtil.handleError(err, '获取国家码失败');
      return '';
    }
  }
  /**
   * 根据指定的两个经纬度坐标点,计算两点间的直线距离(单位:米)。
   * @param from 起始坐标。
   * @param to 目标坐标。
   * @returns 两点间的直线距离。
   */
  static calculateDistance(from: mapCommon.LatLng, to: mapCommon.LatLng): number {
    return map.calculateDistance(from, to);
  }
  /**
   * 根据指定的两个经纬度坐标点,计算两点间的直线距离(单位:米)。
   * @param fromLat 起始纬度。
   * @param fromLng 起始经度。
   * @param toLat 目标纬度。
   * @param toLng 目标经度。
   * @returns 两点间的直线距离。
   */
  static calculateDistanceEasy(fromLat: number, fromLng: number, toLat: number, toLng: number): number {
    const fromLatLng: mapCommon.LatLng = { latitude: fromLat, longitude: fromLng };
    const toLatLng: mapCommon.LatLng = { latitude: toLat, longitude: toLng };
    return map.calculateDistance(fromLatLng, toLatLng);
  }

  /**
   * 错误处理方法。
   * @param error 错误对象,必须是 BusinessError 类型。
   * @param message 提示信息。
   * @returns 返回错误码。如果无法获取错误码,则返回默认值 -1。
   */
  private static handleError(error: BusinessError, message: string): number {
    let errorCode = -1; // 默认错误码
    let errorMessage = '未知错误';

    if (error && typeof error.code === 'number') {
      errorCode = error.code;
      errorMessage = error.message || errorMessage;
    }
    // 记录错误日志
    LogUtil.error(`${message}: code=${errorCode}, message=${errorMessage}`);
    return errorCode;
  }
  /**
   * 获取错误消息。
   * @param code 错误码。
   * @param defaultMsg 默认错误消息。
   * @returns 错误消息。
   */
  static getErrorMsg(code: number, defaultMsg: string): string {
    const errorMessages: Map<number, string> = new Map([
      [201, '权限校验失败!'],
      [202, '系统API权限校验失败!'],
      [401, '参数检查失败!'],
      [801, '该设备不支持此API!'],
      [3301000, '位置服务不可用!'],
      [3301100, '请开启位置功能开关!'],
      [3301200, '定位失败,未获取到定位结果!'],
      [3301300, '逆地理编码查询失败!'],
      [3301400, '地理编码查询失败!'],
      [3301500, '区域信息(包含国家码)查询失败!'],
      [3301600, '地理围栏操作失败!'],
    ]);

    return errorMessages.get(code) || defaultMsg;
  }
}
代码如下:

import geoLocationManager from '@ohos.geoLocationManager';
import { BusinessError, Callback } from '@ohos.base';
import { LogUtil } from './LogUtil';
import { PermissionUtil } from './PermissionUtil';
import { map, mapCommon } from '@kit.MapKit';
/**
 * 定位工具类 (WGS-84坐标系)
 * author: CSDN-鸿蒙布道师
 * since: 2025/04/22
 */
export class LocationUtil {
  /**
   * 判断位置服务是否已经使能(定位是否开启)。
   * @returns true 表示定位已开启,false 表示未开启。
   */
  static isLocationEnabled(): boolean {
    return geoLocationManager.isLocationEnabled();
  }
  /**
   * 申请定位权限。
   * @returns true 表示授权成功,false 表示用户拒绝授权。
   */
  static async requestLocationPermissions(): Promise<boolean> {
    const permissions: Array<string> = ['ohos.permission.LOCATION', 'ohos.permission.APPROXIMATELY_LOCATION'];
    let grant: boolean = await PermissionUtil.requestPermissions(permissions);
    if (!grant) {
      grant = await PermissionUtil.requestPermissionOnSetting(permissions);
    }
    return grant;
  }
  /**
   * 获取当前位置(简化版)。
   * @returns 当前位置信息。如果发生错误,则返回 null。
   */
  static async getCurrentLocationEasy(): Promise<geoLocationManager.Location | null> {
    return LocationUtil.getCurrentLocation();
  }
  /**
   * 获取当前位置。
   * @param request 可选的定位请求参数。
   * @returns 当前位置信息。如果发生错误,则返回 null。
   */
  static async getCurrentLocation(
    request?: geoLocationManager.CurrentLocationRequest | geoLocationManager.SingleLocationRequest
  ): Promise<geoLocationManager.Location | null> {
    try {
      return await geoLocationManager.getCurrentLocation(request);
    } catch (err) {
      LocationUtil.handleError(err, '获取当前位置失败');
      return null; // 返回 null 表示发生错误
    }
  }
  /**
   * 开启位置变化订阅,并发起定位请求(简化版)。
   * @param callBack 回调函数。
   * @returns 成功返回 0,失败返回错误码。
   */
  static onLocationChangeEasy(callBack: Callback<geoLocationManager.Location>): number {
    const defaultRequest: geoLocationManager.LocationRequest = {
      priority: geoLocationManager.LocationRequestPriority.FIRST_FIX,
      scenario: geoLocationManager.LocationRequestScenario.UNSET,
      timeInterval: 10,
      distanceInterval: 0,
      maxAccuracy: 0,
    };
    return LocationUtil.onLocationChange(defaultRequest, callBack);
  }
  /**
   * 开启位置变化订阅,并发起定位请求。
   * @param request 定位请求参数。
   * @param callBack 回调函数。
   * @returns 成功返回 0,失败返回错误码。
   */
  static onLocationChange(
    request: geoLocationManager.LocationRequest | geoLocationManager.ContinuousLocationRequest,
    callBack: Callback<geoLocationManager.Location>
  ): number {
    try {
      geoLocationManager.on('locationChange', request, callBack);
      return 0;
    } catch (err) {
      return LocationUtil.handleError(err, '开启位置变化订阅失败');
    }
  }
  /**
   * 关闭位置变化订阅,并删除对应的定位请求。
   * @param callback 不传则取消当前类型的所有订阅。
   * @returns 成功返回 0,失败返回错误码。
   */
  static offLocationChange(callback?: Callback<geoLocationManager.Location>): number {
    try {
      if (callback) {
        geoLocationManager.off('locationChange', callback);
      } else {
        geoLocationManager.off('locationChange');
      }
      return 0;
    } catch (err) {
      return LocationUtil.handleError(err, '关闭位置变化订阅失败');
    }
  }
  /**
   * 判断地理编码与逆地理编码服务是否可用。
   * @returns true 表示服务可用,false 表示不可用。
   */
  static isGeocoderAvailable(): boolean {
    return geoLocationManager.isGeocoderAvailable();
  }
  /**
   * 地理编码:将地理描述转换为具体坐标集合。
   * @param locationName 地理位置描述。
   * @param maxItems 返回结果的最大数量。
   * @returns 编码后的坐标集合。
   */
  static async getGeoAddressFromLocationName(
    locationName: string,
    maxItems: number = 1
  ): Promise<Array<geoLocationManager.GeoAddress>> {
    const geocodeRequest: geoLocationManager.GeoCodeRequest = {
      description: locationName,
      maxItems,
      locale: 'zh',
    };
    try {
      const result = await geoLocationManager.getAddressesFromLocationName(geocodeRequest);
      return result || [];
    } catch (err) {
      LocationUtil.handleError(err, '地理编码失败');
      return [];
    }
  }
  /**
   * 地理编码:将地理描述转换为具体坐标。
   * @param locationName 地理位置描述。
   * @returns 编码后的坐标对象。
   */
  static async getAddressFromLocationName(locationName: string): Promise<geoLocationManager.GeoAddress> {
    const geoAddressList = await LocationUtil.getGeoAddressFromLocationName(locationName, 1);
    return geoAddressList.length > 0 ? geoAddressList[0] : {};
  }
  /**
   * 逆地理编码:将坐标转换为地理描述集合。
   * @param latitude 纬度。
   * @param longitude 经度。
   * @param maxItems 返回结果的最大数量。
   * @returns 逆编码后的地理描述集合。
   */
  static async getGeoAddressFromLocation(
    latitude: number,
    longitude: number,
    maxItems: number = 1
  ): Promise<Array<geoLocationManager.GeoAddress>> {
    const reverseGeocodeRequest: geoLocationManager.ReverseGeoCodeRequest = {
      latitude,
      longitude,
      maxItems,
      locale: 'zh',
    };
    try {
      const result = await geoLocationManager.getAddressesFromLocation(reverseGeocodeRequest);
      return result || [];
    } catch (err) {
      LocationUtil.handleError(err, '逆地理编码失败');
      return [];
    }
  }
  /**
   * 逆地理编码:将坐标转换为地理描述。
   * @param latitude 纬度。
   * @param longitude 经度。
   * @returns 逆编码后的地理描述对象。
   */
  static async getAddressFromLocation(latitude: number, longitude: number): Promise<geoLocationManager.GeoAddress> {
    const geoAddressList = await LocationUtil.getGeoAddressFromLocation(latitude, longitude, 1);
    return geoAddressList.length > 0 ? geoAddressList[0] : {};
  }
  /**
   * 获取当前的国家码。
   * @returns 当前国家码。
   */
  static async getCountryCode(): Promise<string> {
    try {
      const result = await geoLocationManager.getCountryCode();
      return result?.country || '';
    } catch (err) {
      LocationUtil.handleError(err, '获取国家码失败');
      return '';
    }
  }
  /**
   * 根据指定的两个经纬度坐标点,计算两点间的直线距离(单位:米)。
   * @param from 起始坐标。
   * @param to 目标坐标。
   * @returns 两点间的直线距离。
   */
  static calculateDistance(from: mapCommon.LatLng, to: mapCommon.LatLng): number {
    return map.calculateDistance(from, to);
  }
  /**
   * 根据指定的两个经纬度坐标点,计算两点间的直线距离(单位:米)。
   * @param fromLat 起始纬度。
   * @param fromLng 起始经度。
   * @param toLat 目标纬度。
   * @param toLng 目标经度。
   * @returns 两点间的直线距离。
   */
  static calculateDistanceEasy(fromLat: number, fromLng: number, toLat: number, toLng: number): number {
    const fromLatLng: mapCommon.LatLng = { latitude: fromLat, longitude: fromLng };
    const toLatLng: mapCommon.LatLng = { latitude: toLat, longitude: toLng };
    return map.calculateDistance(fromLatLng, toLatLng);
  }

  /**
   * 错误处理方法。
   * @param error 错误对象,必须是 BusinessError 类型。
   * @param message 提示信息。
   * @returns 返回错误码。如果无法获取错误码,则返回默认值 -1。
   */
  private static handleError(error: BusinessError, message: string): number {
    let errorCode = -1; // 默认错误码
    let errorMessage = '未知错误';

    if (error && typeof error.code === 'number') {
      errorCode = error.code;
      errorMessage = error.message || errorMessage;
    }
    // 记录错误日志
    LogUtil.error(`${message}: code=${errorCode}, message=${errorMessage}`);
    return errorCode;
  }
  /**
   * 获取错误消息。
   * @param code 错误码。
   * @param defaultMsg 默认错误消息。
   * @returns 错误消息。
   */
  static getErrorMsg(code: number, defaultMsg: string): string {
    const errorMessages: Map<number, string> = new Map([
      [201, '权限校验失败!'],
      [202, '系统API权限校验失败!'],
      [401, '参数检查失败!'],
      [801, '该设备不支持此API!'],
      [3301000, '位置服务不可用!'],
      [3301100, '请开启位置功能开关!'],
      [3301200, '定位失败,未获取到定位结果!'],
      [3301300, '逆地理编码查询失败!'],
      [3301400, '地理编码查询失败!'],
      [3301500, '区域信息(包含国家码)查询失败!'],
      [3301600, '地理围栏操作失败!'],
    ]);

    return errorMessages.get(code) || defaultMsg;
  }
}

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

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

相关文章

模型 替罪羊效应

系列文章分享模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。转嫁罪责于无辜&#xff0c;维系群体控制与稳定 1 替罪羊效应的应用 1.1 多品牌危机中的行业“背锅侠” 行业背景&#xff1a;食品行业爆发大规模安全危机&#xff0c;多家企业卷入某类食品重金属超标…

TapData × 梦加速计划 | 与 AI 共舞,TapData 携 AI Ready 实时数据平台亮相加速营,企业数据基础设施现代化

在实时跃动的数据节拍中&#xff0c;TapData 与 AI 共舞&#xff0c;踏出智能未来的新一步。 4月10日&#xff0c;由前海产业发展集团、深圳市前海梦工场、斑马星球科创加速平台等联合发起的「梦加速计划下一位独角兽营」正式启航。 本次加速营以“打造下一位独角兽企业”为目…

15.电感特性在EMC设计中的运用

电感特性在EMC设计中的运用 1. 共模电感与差模电感的差异2. 电感的高频等效特性![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b4dc000672af4dd69a528450eb42cf10.png)3. 电感在EMC设计中的使用注意事项3.1 LC滤波计算3.2 并联型多级浪涌防护的电感退耦 1. 共模电感…

uniapp Vue2升级到Vue3,并发布到微信小程序的快捷方法

目录 前言&#xff1a;升级项目的两种方式步骤一、新建项目 【选择-默认模版】二、修改-pages.json三、补充-缺少的文件四、修改-Main.js按照 [官方文档-vue2升级vue3迁移指南](https://uniapp.dcloud.net.cn/tutorial/migration-to-vue3.html) 修改 五、升级-uni-ui扩展组件的…

数据重构如何兼顾效率与性能稳定?zStorage 全闪存分布式存储的技术实践与实测数据

点击蓝字 关注我们 zStorage 作为数据库场景下的全闪存分布式存储&#xff0c;除了性能要好&#xff0c;更重要的是要在各种情况下都能保持“稳定”的好。一个高并发的交易型业务数据库&#xff0c;如果出现轻微的IO抖动&#xff0c;就可能造成数据库并发事务提交的排队&#x…

A2A + MCP:构建实用人工智能系统的超强组合

构建真正有效的连接型人工智能系统的挑战 如果你正在构建人工智能应用&#xff0c;这种情况可能听起来很熟悉&#xff1a; 你需要特定的人工智能能力来解决业务问题。你找到了完成每个单独任务的出色工具。但把所有东西连接在一起却占据了大部分开发时间&#xff0c;还创建了…

力扣每日打卡17 49. 字母异位词分组 (中等)

力扣 49. 字母异位词分组 中等 前言一、题目内容二、解题方法1. 哈希函数2.官方题解2.1 前言2.2 方法一&#xff1a;排序2.2 方法二&#xff1a;计数 前言 这是刷算法题的第十七天&#xff0c;用到的语言是JS 题目&#xff1a;力扣 49. 字母异位词分组 (中等) 一、题目内容 给…

Word处理控件Spire.Doc系列教程:C# 为 Word 文档设置背景颜色或背景图片

在 Word 文档中&#xff0c;白色是默认的背景设置。一般情况下&#xff0c;简洁的白色背景足以满足绝大多数场景的使用需求。但是&#xff0c;如果您需要创建简历、宣传册或其他创意文档&#xff0c;设置独特的背景颜色或图片能够极大地增强文档的视觉冲击力。本文将演示如何使…

掌握 Altium Designer:轻松定制“交换器件”工具栏

在PCB设计过程中&#xff0c;快速交换器件&#xff08;如电阻、电容、IC等&#xff09;是提高效率的关键。Altium Designer提供了灵活的工具栏定制功能&#xff0c;让用户可以创建专属的"交换器件"工具栏&#xff0c;将常用操作集中管理&#xff0c;减少菜单切换时间…

【C++ Qt】信号和槽(内配思维导图 图文并茂 通俗易懂)

每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a; 本章是Qt中的第三章&#xff0c;也是我们理解Qt中必备的点 信号槽&#xff0c;它本质由信号和槽两个来实现&#xff0c;其中将细致的讲述如何自定义信号…

从零开始构建微博爬虫:实现自动获取并保存微博内容

从零开始构建微博爬虫&#xff1a;实现自动获取并保存微博内容 前言 在信息爆炸的时代&#xff0c;社交媒体平台已经成为信息传播的重要渠道&#xff0c;其中微博作为中国最大的社交媒体平台之一&#xff0c;包含了大量有价值的信息和数据。对于研究人员、数据分析师或者只是…

三餐四季、灯火阑珊

2025年4月22日&#xff0c;15~28℃&#xff0c;挺好的 待办&#xff1a; 教学技能大赛教案&#xff08;2025年4月24日&#xff0c;校赛&#xff0c;小组合作&#xff0c;其他成员给力&#xff0c;暂不影响校赛进度&#xff0c;搁置&#xff09; 教学技能大赛PPT&#xff08;202…

基于javaweb的SSM+Maven教材管理系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…

NineData 与飞书深度集成,企业级数据管理审批流程全面自动化

NineData 正式推出与飞书审批系统的深度集成功能&#xff0c;企业用户在 NineData 平台发起的审批工单&#xff0c;将自动推送至审批人的飞书中&#xff0c;审批人可以直接在飞书进行审批并通过/拒绝。该功能实现跨系统协作&#xff0c;带来巨大的审批效率提升&#xff0c;为各…

mockMvc构建web单元测试学习笔记

web应用本来需要依靠tomcat这个环境运行 现在用mockMvc是为了模拟这个web环境&#xff0c;简化测试 什么是mock(模拟) 模拟对象---mock object是以可控方式模拟真实对象行为的假对象&#xff0c;通过模拟输入数据&#xff0c;验证程序达到预期结果 为什么使用mock对象 因为…

Windows7升级Windows10,无法在此驱动器上安装Windows

一、现象描述 台式机工作站&#xff0c;从Windows7升级Windows10&#xff0c;采用MediaCreationTool_22H2制作U盘启动盘&#xff0c;安装系统遇到问题如下&#xff1a; 二、原因分析 是由于硬盘格式不是GPT硬盘&#xff0c;而Windows系统只能安装到GPT硬盘上&#xff0c;所以…

Idea创建项目的搭建

1、普通java项目 如果没有project SDK去new&#xff0c;默认在C:\Program Files\Java\jdk1.8.0_261 输入项目名称和项目路径 点击完成&#xff0c;即创建好一个普通的Java项目。 2、普通JavaWEB项目 目录中没有WEB-INF文件可以直接从tomcat中粘贴过来 D:\apache-tomcat-8.5.…

GpuGeek:以弹性算力与全栈服务赋能产业智能升级

在人工智能技术快速融入各领域的趋势下&#xff0c;企业对高效、低成本的AI基础设施需求日益迫切。GpuGeek作为一站式AI基础设施平台&#xff0c;凭借其弹性算力调度、全流程开发支持、全球化资源覆盖以及国产化技术适配四大核心优势&#xff0c;为产业智能化升级提供了坚实的技…

网络原理 - 4(TCP - 1)

目录 TCP 协议 TCP 协议段格式 可靠传输 几个 TCP 协议中的机制 1. 确认应答 2. 超时重传 完&#xff01; TCP 协议 TCP 全称为 “传输控制协议”&#xff08;Transmission Control Protocol&#xff09;&#xff0c;要对数据的传输进行一个详细的控制。 TCP 协议段格…

强化学习框架:OpenRLHF源码解读,模型处理

本文主要介绍 强化学习框架&#xff1a;OpenRLHF源码解读&#xff0c;模型处理 models框架设计 了解一下 OpenRLHF的模型框架设计范式&#xff1a; From:https://arxiv.org/pdf/2405.11143 可以知道一个大概的流程&#xff1a;输入Pormpt通过Actor model输出回复 Response&am…