關于注冊登錄功能制作的步驟(文件IO存儲+LVGL彈窗提示)

按你的需求(文件IO存儲+LVGL彈窗提示),工程需創建以下文件,代碼按功能模塊化存放,清晰明了:

一、需要創建的文件清單
文件名 作用 存放內容?
main.c 程序入口 主函數、硬件初始化、LVGL初始化、啟動界面?
ui.h 界面函數聲明 聲明登錄/注冊界面創建、頁面跳轉等函數?
ui.c 界面實現 用LVGL創建登錄/注冊界面、按鈕回調、lv_msgbox彈窗提示?
user_file.h 文件操作函數聲明 聲明注冊寫入、登錄查找、賬號檢查等函數?
user_file.c 文件IO邏輯實現 實現用戶信息的文件讀寫(注冊時寫入、登錄時查找比對)?

二、各文件代碼及存放位置

1. main.c(工程入口)

存放位置:工程根目錄,作為程序啟動點
#include "lvgl/lvgl.h"
#include "ui.h" ? ? ? // 包含界面函數
#include "user_file.h"// 包含文件操作函數// 硬件初始化(GEC6818屏幕、觸摸驅動)
static void hardware_init(void) {// 此處添加開發板硬件初始化代碼(如LCD初始化、觸摸驅動初始化)// 例:打開LCD設備、設置分辨率為800x480等
}int main(void) {// 1. 初始化硬件hardware_init();// 2. 初始化LVGLlv_init();lv_port_disp_init(); ?// 顯示接口初始化(適配GEC6818 LCD)lv_port_indev_init(); // 輸入設備初始化(適配觸摸)// 3. 啟動登錄界面create_login_ui();// 4. LVGL主循環while (1) {lv_task_handler(); ?// 處理LVGL任務usleep(5000); ? ? ? // 5ms延遲}return 0;
}


2. ui.h(界面函數聲明)

存放位置:工程根目錄,聲明ui.c中的所有函數
#ifndef UI_H
#define UI_H#include "lvgl/lvgl.h"// 登錄界面創建
void create_login_ui(void);// 注冊界面創建
void create_reg_ui(void);// 登錄成功跳轉(定時器回調)
void login_success(lv_timer_t *t);// 注冊成功返回登錄頁(定時器回調)
void reg_success_back(lv_timer_t *t);#endif // UI_H


3. ui.c(界面實現+彈窗提示)

存放位置:工程根目錄,實現界面和交互邏輯
#include "ui.h"
#include "user_file.h" ?// 調用文件操作函數// 輸入框緩存(登錄界面)
static char login_user[32] = "";
static char login_pwd[32] = "";// 輸入框緩存(注冊界面)
static char reg_user[32] = "";
static char reg_pwd[32] = "";// 登錄界面創建
void create_login_ui(void) {lv_obj_clean(lv_scr_act()); ?// 清空當前界面// 1. 賬號輸入區lv_obj_t *user_label = lv_label_create(lv_scr_act());lv_label_set_text(user_label, "賬號:");lv_obj_align(user_label, LV_ALIGN_TOP_LEFT, 50, 100);lv_obj_t *user_ta = lv_textarea_create(lv_scr_act());lv_textarea_set_placeholder_text(user_ta, "請輸入賬號");lv_textarea_set_max_length(user_ta, 31);lv_obj_set_size(user_ta, 200, 50);lv_obj_align_to(user_ta, user_label, LV_ALIGN_OUT_RIGHT_MID, 20, 0);lv_textarea_set_text(user_ta, login_user);// 2. 密碼輸入區lv_obj_t *pwd_label = lv_label_create(lv_scr_act());lv_label_set_text(pwd_label, "密碼:");lv_obj_align(pwd_label, LV_ALIGN_TOP_LEFT, 50, 180);lv_obj_t *pwd_ta = lv_textarea_create(lv_scr_act());lv_textarea_set_placeholder_text(pwd_ta, "請輸入密碼");lv_textarea_set_password_mode(pwd_ta, true); ?// 密碼隱藏lv_textarea_set_max_length(pwd_ta, 31);lv_obj_set_size(pwd_ta, 200, 50);lv_obj_align_to(pwd_ta, pwd_label, LV_ALIGN_OUT_RIGHT_MID, 20, 0);lv_textarea_set_text(pwd_ta, login_pwd);// 3. 登錄按鈕(帶回調)lv_obj_t *login_btn = lv_btn_create(lv_scr_act());lv_obj_set_size(login_btn, 100, 40);lv_obj_align(login_btn, LV_ALIGN_TOP_MID, -60, 280);lv_obj_t *login_btn_label = lv_label_create(login_btn);lv_label_set_text(login_btn_label, "登錄");lv_obj_add_event_cb(login_btn, login_btn_cb, LV_EVENT_CLICKED, user_ta); ?// 傳賬號輸入框// 4. 跳轉到注冊按鈕lv_obj_t *to_reg_btn = lv_btn_create(lv_scr_act());lv_obj_set_size(to_reg_btn, 100, 40);lv_obj_align(to_reg_btn, LV_ALIGN_TOP_MID, 60, 280);lv_obj_t *to_reg_label = lv_label_create(to_reg_btn);lv_label_set_text(to_reg_label, "注冊");lv_obj_add_event_cb(to_reg_btn, to_reg_cb, LV_EVENT_CLICKED, NULL);
}// 注冊界面創建
void create_reg_ui(void) {lv_obj_clean(lv_scr_act()); ?// 清空當前界面// 1. 新賬號輸入區lv_obj_t *reg_user_label = lv_label_create(lv_scr_act());lv_label_set_text(reg_user_label, "新賬號:");lv_obj_align(reg_user_label, LV_ALIGN_TOP_LEFT, 50, 100);lv_obj_t *reg_user_ta = lv_textarea_create(lv_scr_act());lv_textarea_set_placeholder_text(reg_user_ta, "請設置賬號");lv_textarea_set_max_length(reg_user_ta, 31);lv_obj_set_size(reg_user_ta, 200, 50);lv_obj_align_to(reg_user_ta, reg_user_label, LV_ALIGN_OUT_RIGHT_MID, 20, 0);lv_textarea_set_text(reg_user_ta, reg_user);// 2. 新密碼輸入區lv_obj_t *reg_pwd_label = lv_label_create(lv_scr_act());lv_label_set_text(reg_pwd_label, "新密碼:");lv_obj_align(reg_pwd_label, LV_ALIGN_TOP_LEFT, 50, 180);lv_obj_t *reg_pwd_ta = lv_textarea_create(lv_scr_act());lv_textarea_set_placeholder_text(reg_pwd_ta, "請設置密碼");lv_textarea_set_password_mode(reg_pwd_ta, true);lv_textarea_set_max_length(reg_pwd_ta, 31);lv_obj_set_size(reg_pwd_ta, 200, 50);lv_obj_align_to(reg_pwd_ta, reg_pwd_label, LV_ALIGN_OUT_RIGHT_MID, 20, 0);lv_textarea_set_text(reg_pwd_ta, reg_pwd);// 3. 注冊按鈕(帶回調)lv_obj_t *reg_btn = lv_btn_create(lv_scr_act());lv_obj_set_size(reg_btn, 100, 40);lv_obj_align(reg_btn, LV_ALIGN_TOP_MID, -60, 280);lv_obj_t *reg_btn_label = lv_label_create(reg_btn);lv_label_set_text(reg_btn_label, "注冊");lv_obj_add_event_cb(reg_btn, reg_btn_cb, LV_EVENT_CLICKED, reg_user_ta); ?// 傳賬號輸入框// 4. 返回登錄按鈕lv_obj_t *back_btn = lv_btn_create(lv_scr_act());lv_obj_set_size(back_btn, 100, 40);lv_obj_align(back_btn, LV_ALIGN_TOP_MID, 60, 280);lv_obj_t *back_label = lv_label_create(back_btn);lv_label_set_text(back_label, "返回");lv_obj_add_event_cb(back_btn, to_login_cb, LV_EVENT_CLICKED, NULL);
}// 登錄按鈕回調(核心:調用文件查找函數+lv_msgbox提示)
static void login_btn_cb(lv_event_t *e) {lv_obj_t *user_ta = lv_event_get_user_data(e);lv_obj_t *pwd_ta = lv_obj_get_next_sibling(user_ta); ?// 密碼輸入框(賬號輸入框的下一個兄弟組件)const char *user = lv_textarea_get_text(user_ta);const char *pwd = lv_textarea_get_text(pwd_ta);// 調用登錄驗證(來自user_file.c)int ret = login_check(user, pwd);lv_obj_t *msg; ?// LVGL彈窗// 用lv_msgbox顯示結果(靜態調用,直接創建)if (ret == 0) {msg = lv_msgbox_create(NULL, "成功", "登錄成功!即將進入系統", NULL, false);lv_timer_create(login_success, 1500, NULL); ?// 1.5秒后跳轉主頁面} else if (ret == -1) {msg = lv_msgbox_create(NULL, "提示", "暫無注冊用戶,請先注冊", NULL, false);} else {msg = lv_msgbox_create(NULL, "錯誤", "賬號或密碼錯誤", NULL, false);}lv_obj_center(msg); ?// 彈窗居中
}// 注冊按鈕回調(核心:調用文件寫入函數+lv_msgbox提示)
static void reg_btn_cb(lv_event_t *e) {lv_obj_t *reg_user_ta = lv_event_get_user_data(e);lv_obj_t *reg_pwd_ta = lv_obj_get_next_sibling(reg_user_ta); ?// 密碼輸入框const char *user = lv_textarea_get_text(reg_user_ta);const char *pwd = lv_textarea_get_text(reg_pwd_ta);// 調用注冊函數(來自user_file.c)int ret = register_save(user, pwd);lv_obj_t *msg;if (ret == 0) {msg = lv_msgbox_create(NULL, "成功", "注冊成功!即將返回登錄", NULL, false);lv_timer_create(reg_success_back, 1500, NULL); ?// 1.5秒后返回登錄頁} else if (ret == -1) {msg = lv_msgbox_create(NULL, "錯誤", "賬號或密碼不能為空", NULL, false);} else if (ret == -2) {msg = lv_msgbox_create(NULL, "錯誤", "賬號已存在", NULL, false);} else {msg = lv_msgbox_create(NULL, "錯誤", "注冊失敗(文件寫入錯誤)", NULL, false);}lv_obj_center(msg);
}// 輔助回調:跳轉到注冊界面
static void to_reg_cb(lv_event_t *e) {create_reg_ui();
}// 輔助回調:返回登錄界面
static void to_login_cb(lv_event_t *e) {create_login_ui();
}// 登錄成功后跳轉主頁面
void login_success(lv_timer_t *t) {lv_obj_clean(lv_scr_act());lv_obj_t *main_label = lv_label_create(lv_scr_act());lv_label_set_text(main_label, "歡迎進入系統!");lv_obj_center(main_label);
}// 注冊成功后返回登錄頁
void reg_success_back(lv_timer_t *t) {create_login_ui();
}


4. user_file.h(文件操作聲明)

存放位置:工程根目錄,聲明user_file.c中的函數
#ifndef USER_FILE_H
#define USER_FILE_H#include <stdio.h>// 注冊:將賬號密碼寫入文件(返回0成功,-1空輸入,-2賬號已存在,-3文件錯誤)
int register_save(const char *username, const char *password);// 登錄:從文件查找匹配(返回0成功,-1無注冊用戶,-2賬號密碼錯誤)
int login_check(const char *username, const char *password);#endif // USER_FILE_H


5. user_file.c(文件IO實現)

存放位置:工程根目錄,實現注冊寫入和登錄查找邏輯
#include "user_file.h"
#include <string.h>

// 存儲用戶信息的文本文件(程序運行時自動創建)
#define USER_FILE "users.txt"

// 內部函數:檢查賬號是否已存在
static int user_exist(const char *username) {
FILE *fp = fopen(USER_FILE, "r");
if (!fp) return 0; ?// 文件不存在,無重復賬號? ? char line[128], tmp_user[32];
while (fgets(line, sizeof(line), fp)) {
// 按"賬號:密碼"格式解析一行
if (sscanf(line, "%31[^:]", tmp_user) == 1) { ?// %31[^:] 匹配到":"前的字符串(賬號)
if (strcmp(tmp_user, username) == 0) {
fclose(fp);
return

1; ?// 賬號已存在}}}fclose(fp);return 0; ?// 賬號不存在
}// 注冊:寫入文件(對外接口)
int register_save(const char *username, const char *password) {// 檢查輸入合法性if (strlen(username) == 0 || strlen(password) == 0) {return -1; ?// 賬號或密碼為空}if (user_exist(username)) {return -2; ?// 賬號已存在}// 追加寫入文件("a"模式:不存在則創建,存在則追加)FILE *fp = fopen(USER_FILE, "a");if (!fp) return -3; ?// 文件打開失敗// 按"賬號:密碼"格式寫入(方便后續解析)fprintf(fp, "%s:%s\n", username, password);fclose(fp);return 0; ?// 注冊成功
}// 登錄:查找匹配(對外接口)
int login_check(const char *username, const char *password) {FILE *fp = fopen(USER_FILE, "r");if (!fp) return -1; ?// 文件不存在(無注冊用戶)char line[128], tmp_user[32], tmp_pwd[32];while (fgets(line, sizeof(line), fp)) {// 解析一行中的賬號和密碼(格式:賬號:密碼)if (sscanf(line, "%31[^:]:%31s", tmp_user, tmp_pwd) == 2) {// 比對賬號和密碼if (strcmp(tmp_user, username) == 0 && strcmp(tmp_pwd, password) == 0) {fclose(fp);return 0; ?// 匹配成功}}}fclose(fp);return -2; ?// 未找到匹配(賬號或密碼錯誤)
}


三、工程文件結構
project/ ? ? ? ? ? ? ? ? ?# 工程根目錄
├── main.c ? ? ? ? ? ? ? ?# 主程序入口
├── ui.h ? ? ? ? ? ? ? ? ?# 界面函數聲明
├── ui.c ? ? ? ? ? ? ? ? ?# 登錄/注冊界面+彈窗實現
├── user_file.h ? ? ? ? ? # 文件操作函數聲明
├── user_file.c ? ? ? ? ? # 注冊寫入/登錄查找的文件IO邏輯
└── Makefile ? ? ? ? ? ? ?# 編譯配置(之前提供的適配arm-linux-gcc版本)
四、關鍵說明

1. 自動生成的文件:
程序運行時會在當前目錄自動創建 users.txt(存儲注冊信息,格式為賬號:密碼),無需手動創建。

抱歉,之前的內容確實沒寫完,補充完整關鍵說明部分:

四、關鍵說明(補充完整)

2. 代碼關聯:

? ui.c 調用 user_file.c 中的 register_save 和 login_check 實現數據存儲與驗證,兩者通過 user_file.h 聲明接口關聯。

? 所有界面跳轉和彈窗提示都在 ui.c 中通過LVGL組件實現,其中 lv_msgbox 是核心彈窗組件,通過 lv_msgbox_create 靜態創建,無需提前初始化,直接調用即可顯示提示信息(如登錄結果、注冊狀態)。

3. 輸入框數據處理:

? 登錄和注冊界面的輸入框使用 lv_textarea 組件,輸入內容通過 lv_textarea_get_text 獲取,存儲在靜態字符數組(如 login_user、reg_pwd)中,確保數據在界面切換時不丟失。

4. 界面切換邏輯:

? 每次切換界面(如從登錄頁到注冊頁)前,用 lv_obj_clean(lv_scr_act()) 清空當前屏幕,避免組件疊加。

? 按鈕回調函數(如 to_reg_cb、to_login_cb)直接調用新界面的創建函數(create_reg_ui、create_login_ui)實現跳轉。

5. 定時器使用:

? 彈窗顯示后,通過 lv_timer_create 設定延遲(1.5秒),到期后執行跳轉邏輯(如登錄成功后進入主頁面、注冊成功后返回登錄頁),提升用戶體驗。

五、可能遇到的問題及解決

? LVGL庫鏈接錯誤:確保 Makefile 中 LVGL_DIR 路徑正確,且LVGL已針對GEC6818交叉編譯(生成 liblvgl.a)。

? 界面錯位:根據開發板實際分辨率(如480x272)調整 lv_obj_align 中的坐標參數(如 50, 100 等)。

? 文件讀寫失敗:檢查開發板文件系統權限,確保程序運行目錄可讀寫(一般 /tmp 或用戶目錄權限足夠)。

按以上內容,工程可完整實現“注冊-登錄-數據存儲-彈窗提示”的全流程,直接編譯運行即可。


以下是兩種編譯方法的詳細說明,包含適配的Makefile和直接使用arm-linux-gcc命令的完整指令,可直接用于生成目標文件:

一、使用 Makefile 編譯(推薦)

創建 Makefile 后,只需執行 make 即可自動編譯,適合多次修改和構建。1. Makefile 內容(適配 arm-linux-gcc)

# 交叉編譯工具鏈
CC = arm-linux-gcc# LVGL庫路徑(替換為你的LVGL實際路徑,如/opt/lvgl)
LVGL_DIR = /path/to/your/lvgl# 源文件列表(工程所有.c文件)
SRCS = main.c ui.c user_file.c# 目標文件(自動生成)
OBJS = $(SRCS:.c=.o)# 生成的可執行文件名
TARGET = login_demo# 編譯選項(包含頭文件路徑和架構參數)
CFLAGS = -I. \-I$(LVGL_DIR) \-I$(LVGL_DIR)/src \-I$(LVGL_DIR)/src/core \-I$(LVGL_DIR)/src/hal \-I$(LVGL_DIR)/src/widgets \-O2 -Wall -Wextra \-mlittle-endian \-marm \-mcpu=arm926ej-s ?# 若GEC6818為A53架構,改為-mcpu=cortex-a53# 鏈接選項(鏈接LVGL庫和系統庫)
LDFLAGS = -L$(LVGL_DIR)/build/lib \ ?# LVGL庫的編譯輸出目錄-llvgl \ ? ? ? ? ? ? ? ? ?# 鏈接LVGL庫-lm -lpthread -ldl ? ? ? ?# 系統必要庫(數學、線程等)# 默認目標:編譯生成可執行文件
all: $(TARGET)# 鏈接目標文件生成可執行文件
$(TARGET): $(OBJS)$(CC) $(OBJS) -o $@ $(LDFLAGS)@echo "編譯完成:生成 $(TARGET)"# 編譯單個.c文件為.o目標文件
%.o: %.c$(CC) $(CFLAGS) -c $< -o $@# 清理編譯產物(.o文件和可執行文件)
clean:rm -f $(OBJS) $(TARGET)@echo "清理完成"# 偽目標(防止與同名文件沖突)
.PHONY: all clean


2. 使用方法

1. 將 Makefile 放在工程根目錄(與 main.c 等文件同級)。

2. 替換 LVGL_DIR = /path/to/your/lvgl 為實際的LVGL庫路徑(如 ~/lvgl-8.3)。

3. 終端進入工程目錄,執行:

? 編譯:make(生成 login_demo 可執行文件)。

? 重新編譯:make clean && make。

二、直接使用 arm-linux-gcc 命令編譯

無需 Makefile,直接在終端輸入完整編譯命令(適合快速測試)。

1. 完整編譯命令

arm-linux-gcc main.c ui.c user_file.c -o login_demo \
-I/path/to/your/lvgl \
-I/path/to/your/lvgl/src \
-I/path/to/your/lvgl/src/core \
-I/path/to/your/lvgl/src/hal \
-I/path/to/your/lvgl/src/widgets \
-L/path/to/your/lvgl/build/lib \
-llvgl -lm -lpthread -ldl \
-O2 -Wall -mlittle-endian -marm -mcpu=arm926ej-s


2. 命令說明

? 替換路徑:將所有 /path/to/your/lvgl 改為你的LVGL庫實際路徑。

? 參數解釋:

? -I:指定頭文件目錄(確保LVGL的 lvgl.h 等能被找到)。

? -L:指定LVGL庫的存放目錄(包含 liblvgl.a 或 liblvgl.so)。

? -llvgl:鏈接LVGL庫。

? -mcpu=arm926ej-s:適配GEC6818架構(A53架構改為 cortex-a53)。

3. 使用方法

1. 終端進入工程目錄(存放 main.c、ui.c、user_file.c)。

2. 粘貼上述命令(替換路徑后),回車執行,生成 login_demo。

三、驗證與運行

編譯成功后,將生成的 login_demo 傳輸到GEC6818開發板:

1. 賦予執行權限:chmod +x login_demo。

2. 運行程序:./login_demo。

程序會自動創建 users.txt 存儲注冊信息,界面操作通過觸摸完成,輸入錯誤時會彈出 lv_msgbox 提示框。

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

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

相關文章

自媒體端后臺設計指南:從注冊認證到內容管理的全流程搭建

自媒體端后臺設計指南&#xff1a;從注冊認證到內容管理的全流程搭建自媒體端后臺是專業創作者管理內容、粉絲和數據的核心陣地&#xff0c;其設計直接影響創作效率和平臺運營質量。一個功能清晰、操作便捷的后臺系統&#xff0c;能讓創作者專注于內容生產&#xff0c;而非被復…

uniapp掃描二維碼反色處理

在開發掃描二維碼過程中&#xff0c;發現白底黑碼可以直接用uni.scanCode掃描出來&#xff0c;但是黑底白碼就掃不出來&#xff0c;于是就試試反色后的二維碼能不能掃描出來&#xff0c;沒想到真的可以&#xff0c;下面附上完整代碼&#xff1a; <u-icon name"scan&quo…

C語言定義fixed_t什么意思

在 C 語言中&#xff0c;fixed_t 通常是一個自定義的類型別名&#xff08;typedef&#xff09;&#xff0c;用于表示固定點數&#xff08;Fixed-Point Number&#xff09;&#xff0c;而非 C 語言標準庫中的原生類型。它主要用于需要高效實數運算但無法使用浮點數的場景&#x…

音頻3A處理簡介之ANS(自動噪聲抑制)

我們常用的手機、消費類攝像頭等產品的麥克風所采集的原始聲音信號中往往包含了比較多的背景噪音&#xff0c;不僅影響用戶錄音和回放的使用體驗&#xff0c;而且這些噪聲數據還會降低音頻編碼的壓縮效率&#xff0c;因此有必要對音頻底噪進行抑制處理&#xff0c;這就是ANS&am…

Python 使用期物處理并發(使用concurrent.futures模塊啟動 進程)

使用concurrent.futures模塊啟動進程 concurrent.futures 模塊的文檔 &#xff08;https://docs.python.org/3/library/concurrent.futures.html&#xff09;副標題 是“Launching parallel tasks”&#xff08;執行并行任務&#xff09;。這個模塊實現的是真正 的并行計算&…

【系統全面】Linux內核原理——基礎知識介紹

理解內核&#xff1a;內核原理 計算機系統的軟件分層 不同于單片機中使用代碼直接與硬件交互&#xff0c;對于這種方式的缺點深有&#xff1a; &#xff08;1&#xff09;復雜度高&#xff0c;調用難度高&#xff0c;需要深入理解硬件的工作原理和細節。 &#xff08;2&#xf…

Oracle自治事務——從問題到實踐的深度解析

一、引言&#xff1a;當“關鍵操作”遇上主事務的“生死綁定”?先問大家一個問題&#xff1a;假設你在開發一個用戶管理系統&#xff0c;核心功能是“用戶注冊”&#xff0c;同時需要記錄“操作日志”。某天&#xff0c;用戶提交注冊信息時&#xff0c;數據庫突然因磁盤空間不…

廣播(Broadcast)和組播(Multicast)對比

概述 廣播&#xff08;Broadcast&#xff09;和組播&#xff08;Multicast&#xff09;是計算機網絡中兩種重要的一對多通信方式&#xff0c;用于高效地將數據同時分發給多個接收者&#xff0c;它們的核心區別在于目標接收者的范圍和控制精度&#xff0c;基于業務對效率、規模和…

在 HTTP GET 請求中傳遞參數有兩種標準方式

方法 1&#xff1a;URL 查詢參數&#xff08;Query Parameters&#xff09;格式&#xff1a;?參數名值&參數名2值2示例請求http://localhost:8080/hello?name張三&age25后端接收方式GetMapping("/hello") public String sayHello(RequestParam String name…

pycharm windows/linux/mac快捷鍵

適用于mac的快捷鍵 適用于windows和linux的快捷鍵 參考資料&#xff1a; https://www.jetbrains.com/zh-cn/help/pycharm/mastering-keyboard-shortcuts.html

前端包管理工具深度對比:npm、yarn、pnpm 全方位解析

前言&#xff1a;為什么我們需要包管理工具&#xff1f; 在現代前端開發中&#xff0c;模塊化已成為標配。一個中型項目可能依賴數百個第三方包&#xff0c;手動管理這些依賴幾乎是不可能的任務。包管理工具應運而生&#xff0c;它們不僅解決了依賴安裝問題&#xff0c;還提供了…

調試Claude code的正確姿勢

隨著kimi k2的發布&#xff0c;Claude code的使用頻率愈發的頻繁&#xff0c;在發現moonshot官方提供了調試工具之后&#xff0c;我對claude code的交互過程愈發好奇。 moonpalace的安裝 官方moonpalace倉庫地址 go語言編寫&#xff0c;可以直接下載二進制二進制文件&#x…

【常見分布及其特征(5)】連續型隨機變量-連續均勻分布

概率密度函數&#xff08;PDF&#xff09;與概率質量函數&#xff08;PMF&#xff09;說明 基本概念區分 對于連續型隨機變量&#xff0c;通常使用 概率密度函數 (Probability Density Function, PDF) 進行描述&#xff1b;這與離散型隨機變量使用的 概率質量函數 (Probabili…

FAN-UNET:用于生物醫學圖像分割增強模型

目錄 一、論文結構概述 二、創新點詳解 三、創新點結構與原理 &#xff08;1&#xff09;Vision-FAN Block&#xff1a;全局與周期特征的融合引擎 &#xff08;2&#xff09;FANLayer2D&#xff1a;周期性建模的核心 四、代碼復現思路 五、仿真結果分析 &#xff08;1&…

基于SpringBoot的籃球運動員體測數據分析及訓練管理系統論文

第1章 緒論 1.1 課題背景 互聯網發展至今&#xff0c;無論是其理論還是技術都已經成熟&#xff0c;而且它廣泛參與在社會中的方方面面。它讓信息都可以通過網絡傳播&#xff0c;搭配信息管理工具可以很好地為人們提供服務。所以各行業&#xff0c;尤其是規模較大的企業和學校等…

矩陣算法題

矩陣算法題1、矩陣置零2、螺旋矩陣3、旋轉圖像4、搜索二維矩陣1、矩陣置零 解題思路&#xff1a;這道題核心是要確定哪些行和哪些列要置零。所以定義兩個數組&#xff0c;一個記錄要置零的行&#xff0c;一個記錄要置零的列。遍歷整個矩陣&#xff0c;如果當前位置是0的話&…

Spring底層(二)Spring IOC容器加載流程原理

一、怎么理解SpringIoc IOC&#xff1a;Inversion Of Control&#xff0c;即控制反轉&#xff0c;是一種設計思想。之前對象又程序員自己new自己創建&#xff0c;現在Spring注入給我們&#xff0c;這樣的創建權力被反轉了。 所謂控制就是對象的創建、初始化、銷毀。 創建對象…

UDP中的單播,多播,廣播

文章目錄UDP 簡單回顧一、單播&#xff08;Unicast&#xff09;定義特點應用舉例二、廣播&#xff08;Broadcast&#xff09;定義特點應用三、多播&#xff08;Multicast&#xff09;定義特點應用UDP 單播、廣播、多播的對比總結額外說明代碼簡要示例&#xff08;C&#xff09;…

數據庫練習3

一、建立product表&#xff0c;操作方式operate表要求&#xff1a;1.定義觸發器實現在產品表(product)中每多一個產品,就在操作表(operate)中記錄操作方式和時間以及編號記錄。注&#xff1a;操作說明&#xff1a;標記執行delete 、insert、 update2.定義觸發器實現在產品表(pr…

pycharm和anaconda安裝,并配置python虛擬環境

1、pycharm和anaconda安裝 PyCharm與Anaconda超詳細安裝配置教程_anaconda pycharm安裝-CSDN博客https://blog.csdn.net/qq_32892383/article/details/116137730 2、pycharm漢化 PyCharm漢化&#xff1a;簡單兩步搞定&#xff01;PyCharm怎么設置中文簡體&#xff0c;為什么…