【鴻蒙應用ArkTS開發系列】- 云開發入門實戰二 實現省市地區聯動地址選擇器組件(上)

目錄

概述

云數據庫開發

一、創建云數據庫的對象類型。

二、預置數據(為對象類型添加數據條目)。

三、部署云數據庫

云函數實現業務邏輯

一、創建云函數

二、云函數目錄講解

三、創建resources目錄

四、獲取云端憑據

五、導出之前創建的元數據庫對象信息

六、為實現操作數據庫創建一個類CloudDBZoneProvinceDao

七、在云函數入口文件中進行地區數據庫的查詢操作。

八、調試云函數

九、部署云函數

????????實現效果:

概述

????????通過本次課程,我們將學習怎么使用云端一體化開發模板來創建云開發工程,以及如何使用云工程進行云數據庫創建、云函數創建和調用。
那下面我們直接進入本次課程的學習。

使用云端一體化開發模板創建項目工程
這塊內容,在上一篇文章《【鴻蒙應用ArkTS開發系列】- 云開發入門簡介》中已經進行了講解,這塊這里就不在過多贅述,沒有看過的同學可以點擊這里: 鏈接 查閱

創建完畢,整體的工程目錄結構如下:

接下來,我們展開CloudProgram 這個項目,開始進行云數據開發


云數據庫開發

本次Demo將創建三個對象類型來維護查詢地理位置信息,這三個對象類型分別是

  • provinces? 省份表
  • cities 城市表
  • districts 區/縣表

provinces的信息和預置數據如下表:

cities?的信息和預置數據如下表:

districts 的信息和預置數據如下表:

首先我們先創建云數據庫的對象類型。

這里由于篇幅原因,我們這里以provinces 為例,來講解數據表的創建以及對應預置數據的實現,其他兩個表的操作是一樣的,這里就不多提。

一、創建云數據庫的對象類型。

1、右擊“CloudProgram -> clouddb -> objecttype”目錄,選擇“New > Cloud DB Object Type”,命名為“provinces”,生成一個provinces.json文件。

2、打開provinces.json文件,配置字段、索引、以及角色與權限。

參數

說明

fieldName

字段名稱。

字段的名稱長度必須大于等于1個字符,小于等于30個字符,只能包含以下3種類型,并且至少包含“字母”類型:

  • 字母(A-Z或a-z)
  • 數字(0-9)
  • 特殊字符:_

說明

  • 字段名稱必須以字母開頭,以字母或者數字結尾。
  • 字段名稱中不區分字母的大小寫。
  • 每個對象類型,僅支持設置一種自增類型字段:IntAutoIncrement或LongAutoIncrement。
  • 修改對象類型時,不支持新增數據類型為IntAutoIncrement或LongAutoIncrement的字段,支持新增其它數據類型的字段。
  • 修改對象類型時,支持刪除字段。
  • 字段名稱不允許使用系統保留字段名稱: naturalbase_version、naturalbase_deleted、naturalbase_operationtype、naturalbase_creator、naturalbase_accesstime、naturalbase_operationtime、naturalbase_syncstatus、naturalbase_changedfieldsbitmap、naturalbase_lastmodifier、cmin、cmax、xmin、xmax、ctid、oid、tableoid、xc_node_id、tablebucketid和rowid。

fieldType

字段的數據類型。

當前支持的數據類型:String、Boolean、Byte、Short、Integer、Long、Float、Double、ByteArray、Text、Date、IntAutoIncrement和LongAutoIncrement。

belongPrimaryKey

設置該字段是否為對象類型的主鍵

  • 至少設置一個字段為主鍵。
  • 支持設置復合主鍵,由多個字段組合成為主鍵,一個復合主鍵包含的字段小于等于5個,復合主鍵字段順序與字段的順序一致。
  • 數據類型為ByteArray、Text、Date、Double、Float和Boolean的字段不支持設置為主鍵。
  • 主鍵的值不允許更改。

notNull

設置字段值是否為非空

  • 數據類型為ByteArray和Date的字段不支持設置為非空。
  • 數據類型為IntAutoIncrement和LongAutoIncrement的字段默認為非空,且不允許更改。
  • 主鍵默認非空,且不允許更改。
  • 設置為非空的字段不支持加密。

isNeedEncrypt

設置字段是否需要加密。

開啟全程加密數據管理功能。選擇加密后,該字段對應的數據會加密存儲在存儲區中。

  • 主鍵字段不支持加密。
  • 加密的字段不支持設置為非空。
  • 一個對象類型中包含的加密字段小于等于5個。
  • 字段設置為加密后,不支持導出該字段的數據值。
  • 數據類型為ByteArray、Text、IntAutoIncrement和LongAutoIncrement的字段不支持加密。
  • 對象類型創建成功后,不支持修改加密屬性。

【fields】provinces 配置三個字段,自增主鍵“id”和 省份編碼 code 、省份名稱label。

【indexes】配置索引信息,本Demo不設置。

【permissions】本Demo 針對不同用戶配置不同的權限,配置如下:

role(用戶)描述rights(權限)

World

所有用戶,包含認證和非認證用戶。默認且最多僅可以擁有Read權限。

只開放讀取權限

  • Read

Authenticated

經過AppGallery Connect登錄認證的用戶,包含隱式登錄的匿名用戶。

開放讀取跟插入更新權限

  • Read
  • Upsert

Creator

經過認證的數據創建用戶,每條記錄都有其對應的數據創建人。

開放讀取、插入更新、刪除權限

  • Read
  • Upsert
  • Delete?

Administrator

應用開發者。

開放讀取、插入更新、刪除權限

  • Read
  • Upsert
  • Delete

注:上面的權限只是針對Demo演示,具體配置開發者可以自行配置。

下面是provinces.json文件完整數據:

{"fields": [{"belongPrimaryKey": true,"fieldName": "id","fieldType": "IntAutoIncrement","isNeedEncrypt": false,"notNull": true},{"belongPrimaryKey": false,"fieldName": "code","fieldType": "Text","isNeedEncrypt": false,"notNull": false},{"belongPrimaryKey": false,"fieldName": "label","fieldType": "Text","isNeedEncrypt": false,"notNull": false}],"indexes": [],"objectTypeName": "provinces","permissions": [{"rights": ["Read"],"role": "World"},{"rights": ["Read","Upsert"],"role": "Authenticated"},{"rights": ["Read","Upsert","Delete"],"role": "Creator"},{"rights": ["Read","Upsert","Delete"],"role": "Administrator"}]
}

二、預置數據(為對象類型添加數據條目)。

1、右擊“CloudProgram -> clouddb -> dataentry”目錄,選擇“New > Cloud DB Data Entry”。

2、“Object Type”選擇之前創建的對象類型“provinces”,填寫數據條目名稱后,點擊“OK”。

3、在dataentry文件夾下生成了以數據條目名稱為名的json文件:provinces.json

4、打開provinces.json文件,預置數據。

  • cloudDBZoneName:數據條目所在存儲區。

  • objectTypeName:數據條目所在對象類型。

  • objects:每個object即為一條數據。

{"cloudDBZoneName": "cloudDBOfArea","objectTypeName": "provinces","objects": [{"id": 1,"code": "110000","label": "北京市"},{"id": 2,"code": "120000","label": "天津市"},{"id": 3,"code": "130000","label": "河北省"},{"id": 4,"code": "140000","label": "山西省"},{"id": 5,"code": "150000","label": "內蒙古自治區"},{"id": 6,"code": "210000","label": "遼寧省"},{"id": 7,"code": "220000","label": "吉林省"},{"id": 8,"code": "230000","label": "黑龍江省"},{"id": 9,"code": "310000","label": "上海市"},{"id": 10,"code": "320000","label": "江蘇省"},{"id": 11,"code": "330000","label": "浙江省"},{"id": 12,"code": "340000","label": "安徽省"},{"id": 13,"code": "350000","label": "福建省"},{"id": 14,"code": "360000","label": "江西省"},{"id": 15,"code": "370000","label": "山東省"},{"id": 16,"code": "410000","label": "河南省"},{"id": 17,"code": "420000","label": "湖北省"},{"id": 18,"code": "430000","label": "湖南省"},{"id": 19,"code": "440000","label": "廣東省"},{"id": 20,"code": "450000","label": "廣西壯族自治區"},{"id": 21,"code": "460000","label": "海南省"},{"id": 22,"code": "500000","label": "重慶市"},{"id": 23,"code": "510000","label": "四川省"},{"id": 24,"code": "520000","label": "貴州省"},{"id": 25,"code": "530000","label": "云南省"},{"id": 26,"code": "540000","label": "西藏自治區"},{"id": 27,"code": "610000","label": "陜西省"},{"id": 28,"code": "620000","label": "甘肅省"},{"id": 29,"code": "630000","label": "青海省"},{"id": 30,"code": "640000","label": "寧夏回族自治區"},{"id": 31,"code": "650000","label": "新疆維吾爾自治區"},{"id": 32,"code": "710000","label": "臺灣省"},{"id": 33,"code": "810000","label": "香港特別行政區"},{"id": 34,"code": "820000","label": "澳門特別行政區"}]
}

注意:由于篇幅原因,這里步驟一、步驟二只演示了provinces 的對象類型創建跟數據預置,citiesdistricts 需要按上面步驟自行創建。

三、部署云數據庫

數據配置完成,右擊“CloudProgram -> clouddb”目錄,選擇“Deploy Cloud DB”,DevEco Studio將自動把配置的信息同步至AppGallery Connect云數據庫中。

同步完成,在IDE的右下角會有如下截圖:

友情提示:對象類型,字段 如果是 IntAutoIncrement 自增,初始值為1,不可從0開始,否則部署云數據的時候會報錯。

我們可以在AppGallery Connect 對應項目中的云數據庫中找到我們部署的數據存儲區跟對象類型(表),以及對應預置的數據。

1、存儲區

2、對象類型

3、數據

接下來我們繼續講下一章節的內容,講講我們如何開發云函數,利用云函數查詢云數據庫數據的功能。

云函數實現業務邏輯

一、創建云函數

1、右擊“CloudProgram -> cloudfunctions”目錄,選擇“New > Cloud Function”,例如命名為“province-query”。

點擊OK之后,在“cloudfunctions”目錄下會生成一個province-query的函數目錄,如下圖所示:

二、云函數目錄講解

? ? ? ? 1、provinceQuery.ts:函數入口文件(此處以“provinceQuery.ts”為例,請以實際名稱為準)。請參考鴻蒙官網開發函數編寫函數代碼,這里不對函數入口文件做過多闡述。

let myHandler = async function (event, context, callback, logger) {logger.info(event);// do something herecallback({code: 0,desc: "Success."});
};export { myHandler };
  • myHandler:入口方法名稱。
  • event:調用方傳遞的事件對象,JSON格式。具體內容請參見event對象。
  • context:函數運行時上下文對象,封裝了日志接口、回調接口、環境變量env對象等。
  • callback:事件處理結果。
  • logger:記錄日志。

????????函數必須通過顯示調用callback(object)將事件處理結果返回給AGC,結果可以是任意對象,但必須與JSON.stringify兼容,AGC會將結果轉換成JSON字符串后,返回給調用方。callback執行完成,函數即執行結束。

????????2、function-config.json:函數的配置文件,可配置觸發器,通過觸發器暴露的觸發條件來實現函數調用。

????????在“triggers”下配置觸發器,云函數目前支持以下5種觸發器。

???????注意如您需在函數部署完成后更新觸發器,請先刪除之前的觸發器配置,再添加新的觸發器配置,否則您的更新將不生效。

觸發器描述
HTTP觸發器

函數部署到云端后會自動生成觸發URL,在您向該URL發起HTTP請求時觸發函數。

請參見官網通過HTTP觸發器調用函數

CLOUDDB觸發器

當云數據庫發生插入或者更新數據、刪除數據、清空數據等變更操作時將觸發云函數。

請參見官網云數據庫調用函數

AUTH觸發器

為函數配置AUTH觸發器來接收用戶的注冊、登錄等關鍵事件。例如,若添加了“用戶注冊”事件類型的AUTH觸發器,當認證服務檢測到用戶注冊事件發生時將觸發函數。

請參見認證服務調用函數官網認證服務調用函數

CLOUDSTORAGE觸發器

當AGC云存儲服務中發生文件或者文件夾上傳或刪除操作時,將觸發函數并執行您想要實現的功能。

請參見官網云存儲調用函數

CRON觸發器

CRON觸發器即定時任務觸發器,用于在指定的時間點觸發云函數。

請參見官網通過定時任務觸發器調用函數

?

觸發器的具體知識這里我們不講,大家可以查閱鴻蒙官網,會比我講的詳細,本次Demo我們會使用到HTTP觸發器。

? ?3、package.json:包含了當前函數的名稱、版本等函數元數據。package.json內自動引入了云數據庫的最新版本Node.js Server SDK,您也可以在“dependencies”下添加其他需要的依賴。

????????我這邊版本的IDE實際操作創建云函數時,函數目錄下只生成了如上面截圖所示的provinceQuery.ts、function-config.json、package.json這三個文件,package.json 文件中也沒有自動引入云數據庫依賴,實際上完整的云函數目錄結構應該是下面這樣的。

那我們只需要在package.json 文件中下增加如下云數據庫依賴, 點擊Run npm install即可 。

? ?4、node_modules:自動為該函數引入依賴包。

? ?5、package-lock.json:保存了node_modules中所有包的信息,如版本、下載地址等。

????????

三、創建resources目錄

·????????在“province-query”下新建一個"resources"目錄。

????????

注意:由于篇幅原因,這里步驟一、步驟三只演示了provinces-query 云函數的創建和配置citiesdistricts 對應的云函數需要按上面步驟自行創建。

四、獲取云端憑據

????????1、進入AppGallery Connect,點擊“我的項目”。

????????2、點擊應用或者元服務所屬的項目,進入“項目設置”頁面。

? ? ? ? 3、選中“Server SDK”頁簽,點擊“下載認證憑據”。

? ? ? ? 4、將獲取的云端憑據文件放置在云函數中新建的"resources"目錄下。d

五、導出之前創建的元數據庫對象信息

????????1、進入AppGallery Connect,點擊“我的項目”。

? ? ? ? 2、點擊元服務所屬的項目,進入“項目設置”頁面。

? ? ? ? 3、左側導航選擇“Serverless > 云數據庫”,選中“provinces”、“cities”、“districts”對象類型,點擊“導出”。

? ? ? ? 4、“導出文件格式”選擇“js格式”,“js文件類型”選擇“serverSDK”,點擊“確定”,導出壓縮包文件,解壓后得到?provinces.js、cities.js、districts.js文件。

? ? ? ? 5、將導出的provinces.js、cities.js、districts.js文件放置云函數的根目錄。

????????

六、為實現操作數據庫創建一個類CloudDBZoneProvinceDao

? ? ? ? 1、右擊province-query云函數,選擇“New > File”,文件名填寫CloudDBZoneProvinceDao.ts

? ? ? ? 2、在文件中補充如下完整代碼,其中credentialPathagc-apiclient-1172400184764681664-7241544512647644597.json需替換為第四步獲取的云端憑證名稱。

import {AGConnectCloudDB,CloudDBZone,CloudDBZoneConfig,CloudDBZoneQuery,CloudDBZoneSnapshot
} from "@agconnect/database-server/dist/index.js"
import { AGCClient, CredentialParser } from "@agconnect/common-server"
import path from 'path'
import { provinces } from "./provinces"let mProvincesObject = new provinces();let loggerlet mCloudDBZone: CloudDBZoneclass CloudDBZoneProvinceDao {// AGC & 數據庫初始化constructor(log) {let agcClient;const credentialPath = "/resources/gc-apiclient-1172400184764681664-7241544512647644597.json";try {agcClient = AGCClient.getInstance();} catch (error) {AGCClient.initialize(CredentialParser.toCredential(path.join(__dirname, credentialPath)));agcClient = AGCClient.getInstance();}AGConnectCloudDB.initialize(agcClient)const cloudDBZoneConfig = new CloudDBZoneConfig("cloudDBOfArea");const agconnectCloudDB = AGConnectCloudDB.getInstance(agcClient);mCloudDBZone = agconnectCloudDB.openCloudDBZone(cloudDBZoneConfig);}// 查詢省份列表數據async executeQueryProvince(): Promise<provinces[]> {if (!mCloudDBZone) {console.log("CloudDBClient is null, try re-initialize it");return;}try {const query = CloudDBZoneQuery.where(provinces).orderByAsc('code');const resp: CloudDBZoneSnapshot<provinces> = await mCloudDBZone.executeQuery(query);console.log("CloudDB Success")return resp.getSnapshotObjects();} catch (error) {console.log("CloudDB error: " + error);}}
}export default CloudDBZoneProvinceDao;

注意:這里只提供了CloudDBZoneProvinceDao作為例子,另外兩個對象類型操作類請自行創建,也可在文章隨附的Demo中拷貝。

在數據庫對象類型操作類中,我們定義了幾個數據庫表操作方法:

  • executeQueryProvince? 查詢所有省份列表數據
  • executeQueryCitiesByPCode 根據省份編碼查詢城市列表數據
  • executeQueryDistrictByCCode 根據城市編碼查詢區/縣列表數據

在下一步云函數觸發器中,我們將使用這幾個數據庫對象類型操作類進行云數據數據查詢操作。

七、在云函數入口文件中進行地區數據庫的查詢操作。

????????這里依舊以province-query 云函數為例拷貝如下代碼到provinceQuery.ts文件中,完整示例代碼如下:

import CloudDBZoneProvinceDao from "./CloudDBZoneProvinceDao"
import {provinces} from "./provinces"let myHandler = async function (event, context, callback, logger) {logger.info(event);var res = new context.HTTPResponse(context.env, {"res-type":"context.env","faas-content-type":"json",},"application/json", "200");const cloudDBZoneProvinceDao = new CloudDBZoneProvinceDao(logger);let data: provinces[] = await cloudDBZoneProvinceDao.executeQueryProvince();var body = {result: data};res.body = body;callback(res);
};
export { myHandler };

????????這里在myHandler中接收請求,可以獲取請求參數進行處理,然后返回一個HttpResponse,使用CloudDBZoneProvinceDao 對象操作云數據庫將省份列表數據從數據庫中查詢出來并作為請求響應body使用callback返回給客戶端。

八、調試云函數

? ? ? ? 省份列表數據云函數開發完畢,我們需要對函數進行調試,確保函數功能正常可用。

????????1、右擊“CloudProgram -> cloudfunctions”目錄,選擇“Run Cloud Functions”。

????????

? ? ? ? 如下截圖,說明云函數本地運行成功。

????????2、待DevEco Studio運行完成后,菜單選擇“Tools > CloudDev > Cloud Functions Requestor”。

? ? ? ? 3、在右側“Cloud Functions Requestor”面板,對云函數進行調試。????????

  • ????????Environment:選擇“Local”。
  • ????????Cloud Function:選擇“province-query”。
  • ????????Event:輸入函數的參數,為JSON格式的請求體數據。

? ? ? ? 4、點擊“Trigger”,執行云函數,查看Result內容和日志信息。

九、部署云函數

????????云函數調試正常后,右擊“CloudProgram -> cloudfunctions”目錄,選擇“Deploy Cloud Functions”,DevEco Studio將自動把內容同步至AppGallery Connect云函數中。

????????將函數部署到AGC控制臺,支持單個部署和批量部署。這里我先演示一下單個部署。

????????1、單個部署。右擊需部署的函數目錄,選擇“Deploy Function”。??

? ? ? ?

????????2、“底部狀態欄右側將展示函數打包與部署進度。請耐心等待,直至出現“Deploy successfully”消息,表示函數已成功部署。

? ? ? ? 3、在AppGallery Connect 云函數面板可以查到我們部署上去的云函數。

? ? ? ? 4、上面我們完成了省份查詢 province-query云函數 中provinceQuery.js 云函數邏輯的編寫,并將單個函數部署完成。那就一次到位,將城市查詢云函數以及區縣查詢云函數的邏輯開發完畢,再進行批量云函數部署。

cityQuery.ts ,完整代碼如下:

import CloudDBZoneCityDao from "./CloudDBZoneCityDao"
import {cities} from "./cities"let myHandler = async function (event, context, callback, logger) {logger.info(event);var res = new context.HTTPResponse(context.env, {"res-type":"context.env","faas-content-type":"json",},"application/json", "200");let provinceCode ;if (event.body) {var _body = JSON.parse(event.body);provinceCode = _body.code;} else {provinceCode = event.code;};if (!provinceCode) {provinceCode = '';}const cloudDBZoneCityDao = new CloudDBZoneCityDao(logger);let data: cities[] = await cloudDBZoneCityDao.executeQueryCitiesByPCode(provinceCode);var body = {result: data};res.body = body;callback(res);
};
export { myHandler };

?districtsQuery.js?,完整代碼如下:

import CloudDBZoneDistrictDao from "./CloudDBZoneDistrictDao"
import {districts} from "./districts"let myHandler = async function (event, context, callback, logger) {logger.info(event);var res = new context.HTTPResponse(context.env, {"res-type":"context.env","faas-content-type":"json",},"application/json", "200");let cityCode;if (event.body) {var _body = JSON.parse(event.body);cityCode = _body.code;} else {cityCode = event.code;};if (!cityCode) {cityCode = '';}const cloudDBZoneDistrictDao = new CloudDBZoneDistrictDao(logger);let data: districts[] = await cloudDBZoneDistrictDao.executeQueryDistrictByCCode(cityCode);var body = {result: data};res.body = body;callback(res);
};
export { myHandler };

注意:

? ? ? ? 這里有一個點需要留意下:

這里為什么要做這個處理的呢,只是因為方便直接在Cloud Functions Requestor面板中貼body中的JSON,比如客戶端調用云函數時實際的報文是這樣的,我們設置的json的時候是調用

functionCallable.call(params)

這個params 是??{"code":"110000"} ,后端接收到的是

{"body": "{\"code\":\"110000\"}"
}

body節點下的json需要進行轉義。為了方便我們在Cloud Functions Requestor 中event框中直接貼

{"code":"110000"}

這里取請求報文做了下處理。

? ? ? ? 5、批量部署函數。

????????批量部署指將整個云函數目錄下創建的所有函數同時部署到AGC控制臺。

????????

????????到這里,關于云函數開發跟部署的流程我們就講解完畢了,客戶端關于地址聯動涉及的三個接口我們都開發并完成部署,接下來我們開發客戶端UI,介紹客戶端如何調用云函數,并進行數據展示。

? ? ? ? 由于篇幅原因,本篇文章數字已經到1W+,為了提高讀者可讀性,減少單次閱讀疲勞感,我將另外寫一篇《云開發入門實戰二 實現城市多級聯動Demo(下)》,對客戶端調用云函數進行服務端數據獲取展示功能進行講解。

? ? ? ? 這里對本篇文章進行一個回顧,做個總結

  1. 創建云數據庫對象類型
  2. 預置數據
  3. 部署云數據庫
  4. 創建云函數
  5. 獲取云端憑證
  6. 導出元數據庫對象信息拷貝到云函數根目錄中
  7. 創建云數據庫對象類型操作類(Dao)
  8. 云函數入口JS文件邏輯開發
  9. 調試并部署云函數

? ? ? ? 謝謝大家的閱讀。

? ? ? ? ?這里附上本文源碼(只提供相關云數據庫(對象類型、預置數據)、云函數核心類)源碼下載地址

????????

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/163694.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/163694.shtml
英文地址,請注明出處:http://en.pswp.cn/news/163694.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

企業如何通過軟文推廣提高競爭力

數字時代我們每天接收到的信息遠遠超過可接受的量&#xff0c;且技術進步帶來的“信息繭房”使用戶很難獲取真正有效的信息&#xff0c;但越是雜亂的信息環境&#xff0c;有價值信息的穿透力就越強&#xff0c;軟文推廣正是憑借價值感信息助力企業提高競爭力&#xff0c;接下來…

RabbitMQ快速學習之WorkQueues模型、三種交換機、消息轉換器(SpringBoot整合)

文章目錄 前言一、WorkQueues模型消息發送消息接收能者多勞 二、交換機類型1.Fanout交換機消息發送消息接收 2.Direct交換機消息接收消息發送 3.Topic交換機消息發送消息接收 三、編程式聲明隊列和交換機fanout示例direct示例基于注解 四、消息轉換器總結 前言 WorkQueues模型…

C plus plus

環境配置 vscodewindows vscode c 環境配置(終極版)_vscode配置c/c環境_BangBang的博客-CSDN博客VsCode安裝和配置C環境詳細全流程_vscode安裝c-CSDN博客MinGW、MinGW-w64 與TDM-GCC 應該如何選擇&#xff1f; - 知乎、VsCode安裝和配置C環境詳細全流程_vscode安裝c-CSDN博客 …

?LeetCode解法匯總5-正則表達式匹配?

目錄鏈接&#xff1a; 力扣編程題-解法匯總_分享記錄-CSDN博客 GitHub同步刷題項目&#xff1a; https://github.com/September26/java-algorithms 原題鏈接&#xff1a;力扣&#xff08;LeetCode&#xff09;官網 - 全球極客摯愛的技術成長平臺 描述&#xff1a; 「HTML 實…

Educoder中Hive綜合應用案例——用戶學歷查詢

第1關:查詢每一個用戶從出生到現在的總天數 ---------- 禁止修改 ----------drop database if exists mydb cascade; ---------- 禁止修改 -------------------- begin ---------- ---創建mydb數據庫 create database mydb;---使用mydb數據庫 use mydb;---創建表user create …

電腦找不到xinput1_3.dll怎么修復,快速處理dll問題的5個方法分享

在使用電腦的過程中&#xff0c;我們常常會遇到一些常見的問題&#xff0c;其中之一就是“電腦缺少xinput1_3.dll”。這個問題可能會影響到我們對電腦的使用體驗&#xff0c;甚至導致某些軟件無法正常運行。在我遇到這個問題并解決之后&#xff0c;我深刻地體會到了解決問題的重…

迅鐳激光板材切割自動化生產線中標高端機械裝備龍頭豪邁集團!

近年來&#xff0c;中國制造業逐步由低端制造業向高端制造業邁進、由勞動密集型向技術密集型轉變&#xff0c;智能制造帶動了制造業生產環節的自動化、信息化、數字化、智能化的迭代升級。 位于山東省的高端機械裝備龍頭——豪邁集團&#xff0c;緊跟國家發展戰略&#xff0c;加…

【Spring集成MyBatis】MyBatis的Dao層實現(基于配置,非注解開發)

文章目錄 1. MyBatis的dao層實現(傳統方式)——需要寫接口及其實現類2. MyBatis的代理開發方式——僅需寫接口 1. MyBatis的dao層實現(傳統方式)——需要寫接口及其實現類 傳統方式就是在項目下邊建立dao包&#xff0c;里面包含接口及其實現類&#xff0c;文件結構如下&#x…

交直流一體化電源系統測試步驟詳解

交直流一體化電源擁有高度適應性&#xff0c;可以用于不同的電力需求領域。但是為了確保其質量和性能&#xff0c;需要對交直流一體化電源進行各項測試以保證正常工作。本文納米軟件將介紹交直流一體化電源的測試方法&#xff0c;以及如何用交直流一體化電源測試系統進行測試。…

Java,數據結構與集合源碼,關于Map接口的實現類(HashMap、LinkedHashMap)

HashMap中的元素的特點&#xff1a; HashMap中的所有key之間是不可重復的、無序的。所有的key構成一個Set集合。 HashMap中的所有的value彼此之間是可重復的、無序的。所有的value構成一個Collection集合。 HashMap中的一對key-value&#xff0c;就構成了一個entry。Map中的ent…

python常用第三方模塊---openyxl

openyxl模塊&#xff1a;用于處理excel文件的木塊&#xff0c;可以Excel中的數據進行寫入和讀取 函數或類的名稱功能描述load_workbook(filename)打開已經存在的工作簿&#xff0c;結果為工作簿對象 workbook.sheetnames 工作簿對象的sheetnames屬性&#xff0c;用戶獲取所有工…

深入理解 pytest Fixture 方法及其應用!

當涉及到編寫自動化測試時&#xff0c;測試框架和工具的選擇對于測試用例的設計和執行非常重要。在Python 中&#xff0c;pytest是一種廣泛使用的測試框架&#xff0c;它提供了豐富的功能和靈活的擴展性。其中一個很有用的功 能是fixture方法&#xff0c;它允許我們初始化測試環…

《實現領域驅動設計》筆記——上下文映射圖

一個項目的上下文映射圖可以用方式來表示。比較容易的一種是畫一個簡單的框圖表示兩個或多個限界上下文之間的映射關系。該框圖表示了不同的限界上下文在解決方案空間中是如何通過集成相互關聯的。另一種更詳細的方式是通過限界上下文集成的源代碼實現來表示。 上下文映射圖為什…

微軟WHQL認證

windows驅動開發要擺脫在測試模式下的開發&#xff0c;需要通過WHQL認證。 1&#xff1a;申請EV代碼簽名證書。EV代碼簽名證書在后續注冊Windows硬件開發中心帳戶&#xff0c;以及提交WHQL認證前為驅動程序進行數字簽名等流程中都需要用到&#xff0c;所以申請EV代碼簽名證書是…

唯一索引和普通索引的使用上要注意什么

考慮下面一種情況&#xff1a; select name from CUser where id_card xxxxxxxyyyyyyzzzzz;你可能會將id_card作為主鍵了&#xff0c;但最好別這么做。你想想這么長一串的字符串做主鍵&#xff0c;查詢時候效率其實是比較低的&#xff0c;其實是建議選擇其他的作為主鍵。 那么…

BUUCTF [SWPU2019]我有一只馬里奧 1

BUUCTF:https://buuoj.cn/challenges 題目描述&#xff1a; 得到的 flag 請包上 flag{} 提交。 密文&#xff1a; 下載附件&#xff0c;得到一個.exe文件。 解題思路&#xff1a; 1、雙擊.exe文件運行&#xff0c;得到一個1.txt文本。打開&#xff0c;如下圖。 2、提示我們…

Mysql中正則表達式Regexp常見用法

Mysql中正則表達式Regexp常見用法_regexp不包含-CSDN博客

List轉string 逗號分隔

List轉string 逗號分隔 1、將list轉化為逗號分割的字符串 String str String.join(",", list); String str StringUtils.json(list.toArray(), ",");   2、將逗號分隔的字符串轉換為List List<String> list Arrays.asList(str.split("…

當老師應該選文科還是理科

教育不斷發展和改革&#xff0c;教師職業的選擇也越來越受到關注。許多人在選擇專業時都會考慮成為一名教師&#xff0c;但對于選擇文科還是理科卻感到困惑。本文將探討當老師應該選文科還是理科。 文科注重的是人文素養和社會科學方面的知識&#xff0c;而理科則注重自然科學和…

如何做一個簡單的深度集成學習框架

使用同一個框架&#xff0c;獨立在一個數據集上面&#xff0c;分別訓練多次&#xff0c;每個單獨模型訓練超參數可以一樣&#xff0c;也可以不一樣&#xff0c;最后若干個訓練好的獨立模型在測試集數據上面做最后集中決策。 實例代碼如下&#xff1a; class MyEnsemble(nn.Modu…