C# Windows Forms應用程序-003

目錄

項目結構

命名空間和類定義

主要控件

GroupBox 控件

Label 控件

TextBox 控件

Button 控件

OpenFileDialog 控件

方法說明

構造函數?Form1()

Dispose(bool disposing)

Main()

InitializeComponent()

button1_Click(object sender, System.EventArgs e)

button2_Click(object sender, System.EventArgs e)

button4_Click(object sender, System.EventArgs e)

button3_Click(object sender, System.EventArgs e)

加密和解密方法

異常處理

項目截圖:

項目源碼:


項目結構

  • 命名空間和類定義

    • using指令導入所需的命名空間。
    • AesFile命名空間包含整個應用程序。
    • Form1類繼承自System.Windows.Forms.Form,是主窗體類。

主要控件

  • GroupBox 控件

    • groupBox1: 包含加密文件相關的控件。
    • groupBox2: 包含解密文件相關的控件。
  • Label 控件

    • 提示用戶輸入相關信息,例如“被加密文件名”、“設定密碼”。
  • TextBox 控件

    • textBox1: 顯示被加密文件路徑,只讀。
    • textBox2: 輸入加密后輸出文件路徑。
    • textBox3?&?textBox4: 輸入和確認加密密碼。
    • textBox6: 輸入解密密碼。
    • textBox7: 輸入解密后輸出文件路徑。
    • textBox8: 顯示已加密文件路徑,只讀。
  • Button 控件

    • button1: 瀏覽并選擇被加密文件。
    • button2: 執行加密操作。
    • button3: 執行解密操作。
    • button4: 瀏覽并選擇已加密文件。
  • OpenFileDialog 控件

    • openFileDialog1: 允許用戶選擇文件。

方法說明

構造函數?Form1()

  • public Form1()構造函數調用InitializeComponent()方法初始化控件。

Dispose(bool disposing)

  • 清理所有正在使用的資源。
  • 如果?disposing?為?true,則釋放托管資源。
  • protected override void Dispose(bool disposing)方法負責釋放非托管資源

Main()

  • 應用程序的入口點。
  • 啟動?Form1?窗口。

InitializeComponent()

  • 自動生成的方法,包含界面元素的設計信息。
  • 不應手動修改此方法的內容。

button1_Click(object sender, System.EventArgs e)

  • 處理“瀏覽文件”按鈕點擊事件。
  • 彈出文件對話框讓用戶選擇要加密的文件,并將文件路徑顯示在?textBox1?中。

button2_Click(object sender, System.EventArgs e)

  • 處理“加密文件”按鈕點擊事件。
  • 檢查用戶是否選擇了要加密的文件、提供了輸出文件名及有效的密碼。
  • 根據提供的密碼生成 AES密鑰。
  • 創建文件流進行加密操作。
  • 使用?EncryptFile進行實際的加密過程。
  • 加密完成后關閉所有流并彈出成功提示。

button4_Click(object sender, System.EventArgs e)

  • 處理“瀏覽文件”按鈕點擊事件。
  • 彈出文件對話框讓用戶選擇要解密的文件,并將文件路徑顯示在?textBox8?中。

button3_Click(object sender, System.EventArgs e)

  • 處理“解密文件”按鈕點擊事件。
  • 檢查用戶是否選擇了要解密的文件、提供了輸出文件名及有效的密碼。
  • 根據提供的密碼生成 AES密鑰。
  • 創建文件流進行解密操作。
  • 使用?DecryptFile進行實際的解密過程。
  • 解密完成后關閉所有流并彈出成功提示。
  • 如果發生異常,則捕獲錯誤并顯示錯誤消息。

加密和解密方法

  • EncryptFile方法使用Rijndael算法對文件進行加密,生成一個鹽值并與加密數據一起寫入輸出文件。
  • DecryptFile方法使用相同的密碼和鹽值對文件進行解密,將解密后的數據寫入輸出文件。
  • GenerateSalt方法生成一個隨機鹽值,增強安全性。

異常處理

  • 在加密和解密過程中捕獲異常并提示用戶。

項目截圖:

項目源碼:

using System;
using System.Drawing;
using System.ComponentModel;
using System.Windows.Forms;
using System.IO;
using System.Security.Cryptography;namespace AesFile
{/// <summary>/// Form1 的摘要說明。/// </summary>public class Form1 : System.Windows.Forms.Form{// 定義各種控件變量private GroupBox groupBox1; // 用于加密文件設置的組框private Label label1; // 顯示“被加密文件名”的標簽private TextBox textBox1; // 顯示被加密文件名的文本框private TextBox textBox2; // 輸入加密輸出文件名的文本框private Label label2; // 顯示“加密輸出文件名”的標簽private TextBox textBox3; // 輸入設定密碼的文本框private Label label3; // 顯示“設定密碼(大于6位)”的標簽private TextBox textBox4; // 重復輸入設定密碼的文本框private Label label4; // 顯示“重復設定的密碼”的標簽private Button button1; // 瀏覽文件按鈕private Button button2; // 加密文件按鈕private GroupBox groupBox2; // 用于解密文件設置的組框private Button button3; // 解密文件按鈕private Button button4; // 瀏覽文件按鈕private TextBox textBox6; // 輸入解密密碼的文本框private Label label6; // 顯示“輸入密碼”的標簽private TextBox textBox7; // 輸入解密輸出文件名的文本框private Label label7; // 顯示“解密輸出文件名”的標簽private TextBox textBox8; // 顯示被解密文件名的文本框private Label label8; // 顯示“被解密文件名”的標簽private OpenFileDialog openFileDialog1; // 打開文件對話框private Container components = null; // 管理窗體組件的對象public Form1(){InitializeComponent(); // 初始化窗體組件}protected override void Dispose(bool disposing){if (disposing && (components != null)) // 如果正在釋放資源并且組件不為空{components.Dispose(); // 釋放所有托管資源}base.Dispose(disposing); // 調用基類的Dispose方法}#region Windows 窗體設計器生成的代碼private void InitializeComponent(){this.groupBox1 = new GroupBox(); // 實例化groupBox1this.button2 = new Button(); // 實例化button2this.button1 = new Button(); // 實例化button1this.textBox4 = new TextBox(); // 實例化textBox4this.label4 = new Label(); // 實例化label4this.textBox3 = new TextBox(); // 實例化textBox3this.label3 = new Label(); // 實例化label3this.textBox2 = new TextBox(); // 實例化textBox2this.label2 = new Label(); // 實例化label2this.textBox1 = new TextBox(); // 實例化textBox1this.label1 = new Label(); // 實例化label1this.groupBox2 = new GroupBox(); // 實例化groupBox2this.button3 = new Button(); // 實例化button3this.button4 = new Button(); // 實例化button4this.textBox6 = new TextBox(); // 實例化textBox6this.label6 = new Label(); // 實例化label6this.textBox7 = new TextBox(); // 實例化textBox7this.label7 = new Label(); // 實例化label7this.textBox8 = new TextBox(); // 實例化textBox8this.label8 = new Label(); // 實例化label8this.openFileDialog1 = new OpenFileDialog(); // 實例化openFileDialog1this.groupBox1.SuspendLayout(); // 暫停groupBox1布局邏輯this.groupBox2.SuspendLayout(); // 暫停groupBox2布局邏輯this.SuspendLayout(); // 暫停Form1布局邏輯// // groupBox1// this.groupBox1.Controls.Add(this.button2); // 將button2添加到groupBox1中this.groupBox1.Controls.Add(this.button1); // 將button1添加到groupBox1中this.groupBox1.Controls.Add(this.textBox4); // 將textBox4添加到groupBox1中this.groupBox1.Controls.Add(this.label4); // 將label4添加到groupBox1中this.groupBox1.Controls.Add(this.textBox3); // 將textBox3添加到groupBox1中this.groupBox1.Controls.Add(this.label3); // 將label3添加到groupBox1中this.groupBox1.Controls.Add(this.textBox2); // 將textBox2添加到groupBox1中this.groupBox1.Controls.Add(this.label2); // 將label2添加到groupBox1中this.groupBox1.Controls.Add(this.textBox1); // 將textBox1添加到groupBox1中this.groupBox1.Controls.Add(this.label1); // 將label1添加到groupBox1中this.groupBox1.Location = new Point(38, 24); // 設置groupBox1的位置this.groupBox1.Name = "groupBox1"; // 設置groupBox1的名稱this.groupBox1.Size = new Size(509, 209); // 設置groupBox1的大小this.groupBox1.TabIndex = 0; // 設置groupBox1的Tab索引this.groupBox1.TabStop = false; // 設置groupBox1是否顯示邊框this.groupBox1.Text = "加密文件設置"; // 設置groupBox1的標題文本// // button2// this.button2.Location = new Point(349, 160); // 設置button2的位置this.button2.Name = "button2"; // 設置button2的名稱this.button2.Size = new Size(80, 23); // 設置button2的大小this.button2.TabIndex = 9; // 設置button2的Tab索引this.button2.Text = "加密文件"; // 設置button2的文本this.button2.Click += new EventHandler(this.button2_Click); // 綁定button2的點擊事件處理程序// // button1// this.button1.Location = new Point(349, 121); // 設置button1的位置this.button1.Name = "button1"; // 設置button1的名稱this.button1.Size = new Size(80, 23); // 設置button1的大小this.button1.TabIndex = 8; // 設置button1的Tab索引this.button1.Text = "瀏覽文件"; // 設置button1的文本this.button1.Click += new EventHandler(this.button1_Click); // 綁定button1的點擊事件處理程序// // textBox4// this.textBox4.Location = new Point(120, 162); // 設置textBox4的位置this.textBox4.Name = "textBox4"; // 設置textBox4的名稱this.textBox4.PasswordChar = '*'; // 設置textBox4的密碼字符this.textBox4.Size = new Size(223, 21); // 設置textBox4的大小this.textBox4.TabIndex = 7; // 設置textBox4的Tab索引// // label4// this.label4.Location = new Point(8, 170); // 設置label4的位置this.label4.Name = "label4"; // 設置label4的名稱this.label4.Size = new Size(104, 16); // 設置label4的大小this.label4.TabIndex = 6; // 設置label4的Tab索引this.label4.Text = "重復設定的密碼:"; // 設置label4的文本// // textBox3// this.textBox3.Location = new Point(120, 123); // 設置textBox3的位置this.textBox3.Name = "textBox3"; // 設置textBox3的名稱this.textBox3.PasswordChar = '*'; // 設置textBox3的密碼字符this.textBox3.Size = new Size(223, 21); // 設置textBox3的大小this.textBox3.TabIndex = 5; // 設置textBox3的Tab索引// // label3// this.label3.Location = new Point(8, 131); // 設置label3的位置this.label3.Name = "label3"; // 設置label3的名稱this.label3.Size = new Size(128, 16); // 設置label3的大小this.label3.TabIndex = 4; // 設置label3的Tab索引this.label3.Text = "設定密碼(大于6位):"; // 設置label3的文本// // textBox2// this.textBox2.Location = new Point(120, 80); // 設置textBox2的位置this.textBox2.Name = "textBox2"; // 設置textBox2的名稱this.textBox2.Size = new Size(223, 21); // 設置textBox2的大小this.textBox2.TabIndex = 3; // 設置textBox2的Tab索引// // label2// this.label2.Location = new Point(8, 85); // 設置label2的位置this.label2.Name = "label2"; // 設置label2的名稱this.label2.Size = new Size(104, 16); // 設置label2的大小this.label2.TabIndex = 2; // 設置label2的Tab索引this.label2.Text = "加密輸出文件名:"; // 設置label2的文本// // textBox1// this.textBox1.BackColor = SystemColors.Control; // 設置textBox1的背景顏色this.textBox1.Location = new Point(120, 34); // 設置textBox1的位置this.textBox1.Name = "textBox1"; // 設置textBox1的名稱this.textBox1.ReadOnly = true; // 設置textBox1為只讀模式this.textBox1.Size = new Size(223, 21); // 設置textBox1的大小this.textBox1.TabIndex = 1; // 設置textBox1的Tab索引// // label1// this.label1.Location = new Point(8, 37); // 設置label1的位置this.label1.Name = "label1"; // 設置label1的名稱this.label1.Size = new Size(96, 16); // 設置label1的大小this.label1.TabIndex = 0; // 設置label1的Tab索引this.label1.Text = "被加密文件名:"; // 設置label1的文本// // groupBox2// this.groupBox2.Controls.Add(this.button3); // 將button3添加到groupBox2中this.groupBox2.Controls.Add(this.button4); // 將button4添加到groupBox2中this.groupBox2.Controls.Add(this.textBox6); // 將textBox6添加到groupBox2中this.groupBox2.Controls.Add(this.label6); // 將label6添加到groupBox2中this.groupBox2.Controls.Add(this.textBox7); // 將textBox7添加到groupBox2中this.groupBox2.Controls.Add(this.label7); // 將label7添加到groupBox2中this.groupBox2.Controls.Add(this.textBox8); // 將textBox8添加到groupBox2中this.groupBox2.Controls.Add(this.label8); // 將label8添加到groupBox2中this.groupBox2.Location = new Point(38, 272); // 設置groupBox2的位置this.groupBox2.Name = "groupBox2"; // 設置groupBox2的名稱this.groupBox2.Size = new Size(509, 198); // 設置groupBox2的大小this.groupBox2.TabIndex = 1; // 設置groupBox2的Tab索引this.groupBox2.TabStop = false; // 設置groupBox2是否顯示邊框this.groupBox2.Text = "解密文件設置"; // 設置groupBox2的標題文本// // button3// this.button3.Location = new Point(322, 136); // 設置button3的位置this.button3.Name = "button3"; // 設置button3的名稱this.button3.Size = new Size(80, 23); // 設置button3的大小this.button3.TabIndex = 9; // 設置button3的Tab索引this.button3.Text = "解密文件"; // 設置button3的文本this.button3.Click += new EventHandler(this.button3_Click); // 綁定button3的點擊事件處理程序// // button4// this.button4.Location = new Point(223, 136); // 設置button4的位置this.button4.Name = "button4"; // 設置button4的名稱this.button4.Size = new Size(80, 23); // 設置button4的大小this.button4.TabIndex = 8; // 設置button4的Tab索引this.button4.Text = "瀏覽文件"; // 設置button4的文本this.button4.Click += new EventHandler(this.button4_Click); // 綁定button4的點擊事件處理程序// // textBox6// this.textBox6.Location = new Point(97, 136); // 設置textBox6的位置this.textBox6.Name = "textBox6"; // 設置textBox6的名稱this.textBox6.PasswordChar = '*'; // 設置textBox6的密碼字符this.textBox6.Size = new Size(120, 21); // 設置textBox6的大小this.textBox6.TabIndex = 5; // 設置textBox6的Tab索引// // label6// this.label6.Location = new Point(19, 139); // 設置label6的位置this.label6.Name = "label6"; // 設置label6的名稱this.label6.Size = new Size(72, 16); // 設置label6的大小this.label6.TabIndex = 4; // 設置label6的Tab索引this.label6.Text = "輸入密碼:"; // 設置label6的文本// // textBox7// this.textBox7.Location = new Point(120, 93); // 設置textBox7的位置this.textBox7.Name = "textBox7"; // 設置textBox7的名稱this.textBox7.Size = new Size(282, 21); // 設置textBox7的大小this.textBox7.TabIndex = 3; // 設置textBox7的Tab索引// // label7// this.label7.Location = new Point(19, 96); // 設置label7的位置this.label7.Name = "label7"; // 設置label7的名稱this.label7.Size = new Size(104, 16); // 設置label7的大小this.label7.TabIndex = 2; // 設置label7的Tab索引this.label7.Text = "解密輸出文件名:"; // 設置label7的文本// // textBox8// this.textBox8.BackColor = SystemColors.Control; // 設置textBox8的背景顏色this.textBox8.Location = new Point(120, 50); // 設置textBox8的位置this.textBox8.Name = "textBox8"; // 設置textBox8的名稱this.textBox8.ReadOnly = true; // 設置textBox8為只讀模式this.textBox8.Size = new Size(282, 21); // 設置textBox8的大小this.textBox8.TabIndex = 1; // 設置textBox8的Tab索引// // label8// this.label8.Location = new Point(19, 53); // 設置label8的位置this.label8.Name = "label8"; // 設置label8的名稱this.label8.Size = new Size(96, 16); // 設置label8的大小this.label8.TabIndex = 0; // 設置label8的Tab索引this.label8.Text = "被解密文件名:"; // 設置label8的文本// // openFileDialog1// this.openFileDialog1.FileName = "openFileDialog1"; // 設置openFileDialog1的默認文件名// // Form1// this.AutoScaleBaseSize = new Size(6, 14); // 設置窗體自動縮放的基本大小this.ClientSize = new Size(587, 500); // 設置窗體的客戶區大小this.Controls.Add(this.groupBox2); // 將groupBox2添加到窗體中this.Controls.Add(this.groupBox1); // 將groupBox1添加到窗體中this.Name = "Form1"; // 設置窗體的名稱this.StartPosition = FormStartPosition.CenterScreen; // 設置窗體啟動位置為中心屏幕this.Text = "文件加密解密工具"; // 設置窗體的標題文本this.groupBox1.ResumeLayout(false); // 恢復groupBox1布局邏輯this.groupBox1.PerformLayout(); // 執行groupBox1的布局邏輯this.groupBox2.ResumeLayout(false); // 恢復groupBox2布局邏輯this.groupBox2.PerformLayout(); // 執行groupBox2的布局邏輯this.ResumeLayout(false); // 恢復Form1布局邏輯}#endregion// 處理“瀏覽文件”按鈕點擊事件(加密)private void button1_Click(object sender, EventArgs e){if (openFileDialog1.ShowDialog() == DialogResult.OK) // 顯示打開文件對話框并檢查結果{textBox1.Text = openFileDialog1.FileName; // 設置textBox1的文本為選定的文件路徑}}// 處理“加密文件”按鈕點擊事件private void button2_Click(object sender, EventArgs e){string inputFile = textBox1.Text; // 獲取被加密文件的路徑string outputFile = textBox2.Text; // 獲取加密后文件的路徑string password = textBox3.Text; // 獲取設定的密碼string confirmPassword = textBox4.Text; // 獲取確認的密碼if (string.IsNullOrEmpty(inputFile) || string.IsNullOrEmpty(outputFile) || string.IsNullOrEmpty(password)){MessageBox.Show("請輸入所有必要的信息。"); // 提示用戶輸入所有必要信息return;}if (password.Length < 6){MessageBox.Show("密碼必須至少6位。"); // 提示密碼長度不足return;}if (password != confirmPassword){MessageBox.Show("兩次輸入的密碼不一致。"); // 提示密碼不一致return;}try{EncryptFile(inputFile, outputFile, password); // 調用加密文件的方法MessageBox.Show("文件已成功加密。"); // 提示文件加密成功}catch (Exception ex){MessageBox.Show( $ "加密失敗: {ex.Message}"); // 提示加密失敗并顯示錯誤信息            }        }        // 處理“瀏覽文件”按鈕點擊事件(解密)        private void button4_Click(object sender, EventArgs e)        {            if (openFileDialog1.ShowDialog() == DialogResult.OK) // 顯示打開文件對話框并檢查結果            {                textBox8.Text = openFileDialog1.FileName; // 設置textBox8的文本為選定的文件路徑            }        }        // 處理“解密文件”按鈕點擊事件        private void button3_Click(object sender, EventArgs e)        {            string inputFile = textBox8.Text; // 獲取被解密文件的路徑            string outputFile = textBox7.Text; // 獲取解密后文件的路徑            string password = textBox6.Text; // 獲取輸入的密碼            if (string.IsNullOrEmpty(inputFile) || string.IsNullOrEmpty(outputFile) || string.IsNullOrEmpty(password))            {                MessageBox.Show("請輸入所有必要的信息。"); // 提示用戶輸入所有必要信息                return;            }            try            {                DecryptFile(inputFile, outputFile, password); // 調用解密文件的方法                MessageBox.Show("文件已成功解密。"); // 提示文件解密成功            }            catch (Exception ex)            {                MessageBox.Show( $ "解密失敗: {ex.Message}"); // 提示解密失敗并顯示錯誤信息}}// 文件加密方法private void EncryptFile(string inputFile, string outputFile, string password){using (FileStream inputStream = File.OpenRead(inputFile), outputStream = File.Create(outputFile)){byte[] salt = GenerateSalt(); // 生成鹽值RijndaelManaged rijndael = new RijndaelManaged();rijndael.KeySize = 256;rijndael.BlockSize = 128;PasswordDeriveBytes pdb = new PasswordDeriveBytes(password, salt);rijndael.Key = pdb.GetBytes(rijndael.KeySize / 8);rijndael.IV = pdb.GetBytes(rijndael.BlockSize / 8);outputStream.Write(salt, 0, salt.Length); // 寫入鹽值到輸出流CryptoStream cryptoStream = new CryptoStream(outputStream, rijndael.CreateEncryptor(), CryptoStreamMode.Write);inputStream.CopyTo(cryptoStream); // 將輸入流復制到加密流cryptoStream.FlushFinalBlock(); // 刷新加密流}}// 文件解密方法private void DecryptFile(string inputFile, string outputFile, string password){using (FileStream inputStream = File.OpenRead(inputFile), outputStream = File.Create(outputFile)){byte[] salt = new byte[16]; // 創建一個數組來存儲鹽值inputStream.Read(salt, 0, salt.Length); // 從輸入流中讀取鹽值RijndaelManaged rijndael = new RijndaelManaged();rijndael.KeySize = 256;rijndael.BlockSize = 128;PasswordDeriveBytes pdb = new PasswordDeriveBytes(password, salt);rijndael.Key = pdb.GetBytes(rijndael.KeySize / 8);rijndael.IV = pdb.GetBytes(rijndael.BlockSize / 8);CryptoStream cryptoStream = new CryptoStream(inputStream, rijndael.CreateDecryptor(), CryptoStreamMode.Read);cryptoStream.CopyTo(outputStream); // 將解密流復制到輸出流}}// 生成鹽值的方法private byte[] GenerateSalt(){RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider();byte[] salt = new byte[16];rngCsp.GetBytes(salt); // 使用隨機數生成器填充鹽值return salt;}}
}

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

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

相關文章

【C/C++】死鎖的四大條件與預防策略詳解

文章目錄 死鎖的四大條件與預防策略詳解一、死鎖的產生條件&#xff08;四個必要條件&#xff09;二、代碼示例三、死鎖的預防手段&#xff08;以 C/C 為例&#xff09;1. 破壞“循環等待” —— 統一加鎖順序&#xff08;推薦&#xff09;2. 使用 std::lock 一次性加多個鎖3. …

Rust編程環境安裝

文章目錄 Rust編程環境安裝一、安裝準備二、安裝步驟對于Linux/macOS用戶對于Windows用戶 三、驗證安裝四、環境配置檢查五、工具鏈管理六、附加功能七、常見問題處理八、編輯器支持九、其他 Rust編程環境安裝 一、安裝準備 1. 支持系統&#xff1a;Windows/Linux/macOS 2. 所…

OpenHarmony平臺驅動使用(五),HDMI

OpenHarmony平臺驅動使用&#xff08;五&#xff09; HDMI 概述 功能簡介 HDMI&#xff08;High Definition Multimedia Interface&#xff09;&#xff0c;即高清多媒體接口&#xff0c;主要用于DVD、機頂盒等音視頻Source到TV、顯示器等Sink設備的傳輸。 HDMI以主從方式工…

【Git】Commit Hash vs Change-Id

文章目錄 1、Commit 號2、Change-Id 號3、區別與聯系4、實際場景示例5、為什么需要兩者&#xff1f;6、總結附錄——Gerrit 在 Git 和代碼審查工具&#xff08;如 Gerrit&#xff09;中&#xff0c;Commit 號&#xff08;Commit Hash&#xff09; 和 Change-Id 號 是兩個不同的…

leetcode hot100刷題日記——21.不同路徑

和20題一樣的思路link 題解&#xff1a; class Solution { public:int dfs(int i,int j,vector<vector<int>>&memo){//超過了邊界&#xff0c;return 0if(i<0||j<0){return 0;}//從&#xff08;0&#xff0c;0&#xff09;到&#xff08;0&#xff0c;0…

day2 MySQL表數據操作

一&#xff1a;數據操作 注&#xff1a;在編寫MySQL代碼時可以不用區分大小寫 1.查看表結構 desc 表名; -- 查看表中的字段類型&#xff0c;長度&#xff0c;約束。 2.字段的增加 AFTER table 表名 add 字段名 數據類型; -- 默認末尾添加 after table 表名 add 字段名 …

GitAny - 無需登入的 GitHub 最新倉庫檢索工具

地址&#xff1a;https://github.com/MartinxMax/gitany GitAny - 無需登入的 GitHub 專案搜尋工具 GitAny 是一款基於 Python 的工具&#xff0c;允許你在無需登入的情況下搜尋當天最新的 GitHub 專案。它支援模糊搜尋、條件篩選以及倉庫資料的視覺化分析。 安裝依賴 $ pip…

格恩朗金屬管浮子流量計 高精度測量的不二之選?

在流量測量的復雜領域&#xff0c;精度就是生命線&#xff0c;直接關乎生產的穩定性、產品的質量以及資源的合理利用。大連格恩朗品牌的金屬管浮子流量計&#xff0c;憑借其卓越的精度表現&#xff0c;成為各行業在流量測量時的最佳之選。? 格恩朗金屬管浮子流量計運用經典的可…

【R語言編程繪圖-箱線圖】

基本箱線圖繪制 使用ggplot2繪制箱線圖的核心函數是geom_boxplot()。以下是一個基礎示例&#xff0c;展示如何用iris數據集繪制不同物種&#xff08;Species&#xff09;的萼片長度&#xff08;Sepal.Length&#xff09;分布&#xff1a; library(ggplot2) ggplot(iris, aes(…

深度學習能取代機器學習嗎?

在人工智能領域&#xff0c;“機器學習”和“深度學習”這兩個詞經常被混為一談。很多新手甚至以為只要跟 AI 有關的任務&#xff0c;都該用深度學習。但其實&#xff0c;它們并不是誰強誰弱的關系&#xff0c;而是適合不同場景的工具。 這篇文章就來幫你理清楚&#xff1a; 機…

UPS的工作原理和UPS系統中旁路的作用

UPS&#xff08;不間斷電源&#xff09;根據工作原理和適用場景的不同&#xff0c;主要分為以下三種類型&#xff0c;每種類型的特點和適用場景如下&#xff1a; 1. 后備式UPS&#xff08;Offline/Standby UPS&#xff09; 工作原理&#xff1a; 正常供電時&#xff0c;負載直接…

一級菜單401問題

正常代碼生成的前后臺文件&#xff0c;菜單類型是一級標題&#xff0c; 菜單路徑和前端組件的地址都正常寫的:/projects/xxx/xxx/xxx/XxxList 其他生成的新列表都能點進去&#xff0c;只有這個點進去就是顯示空白的像首頁那個頁面一樣&#xff0c; 問題就出現在我第一次建這…

ROS2 robot控制學習(一)

controller_position.yaml使用說明 ROS 2 的 controller_manager 用途典型工作流程示例關鍵服務與話題擴展功能JointTrajectoryController 參數詳解基本參數軌跡參數插值參數前饋控制代碼示例動態參數調試參數ForwardCommandController 概述參數解釋`joints``interface``allow_…

LightGBM的python實現及參數優化

文章目錄 1. LightGBM模型參數介紹2. 核心優勢3. python實現LightGBM3.1 基礎實現3.1.1 Scikit-learn接口示例3.1.2 Python API示例 3.2 模型調優3.2.1 GridSearchCV簡介3.2.2 LightGBM超參調優3.2.3 GridSearchCV尋優結果 在之前的文章 Boosting算法【AdaBoost、GBDT 、XGBoo…

Map集合(雙列集合)

Map結合也稱為“鍵值對集合”&#xff0c;格式&#xff1a;{key1value1&#xff0c;key2value2....} Map集合的特點&#xff1a; 鍵唯一&#xff1a;在Map集合中&#xff0c;鍵&#xff08;key&#xff09;是唯一的&#xff0c;不能有重復的鍵。如果嘗試插入一個已經存在的鍵…

springBoot項目測試時瀏覽器返回406問題解決方案

1. 如果基于最新版本的SpringBoot官方骨架創建的SpringBoot項目&#xff0c;在勾選了lombok的依賴之后&#xff0c;會在pom.xml中引入如下兩個插件&#xff1a; 2. 由于第一個插件 maven-compiler-plugin 的引入導致了這個問題&#xff0c;解決這個問題的方案呢&#xff0c;就是…

21.享元模式:思考與解讀

原文地址:享元模式&#xff1a;思考與解讀 更多內容請關注&#xff1a;深入思考與解讀設計模式 引言 在軟件開發中&#xff0c;特別是當你處理大量相似對象時&#xff0c;是否會遇到一個問題&#xff1a;大量的對象會占用大量的內存&#xff0c;而這些對象有許多相同的狀態&…

java方法重寫學習筆記

方法重寫介紹 子類和父類有兩個返回值&#xff0c;參數&#xff0c;名稱都一樣的方法&#xff0c; 子類的方法會覆蓋父類的方法。 調用 public class Overide01 {public static void main(String[] args) {Dog dog new Dog();dog.cry();} }Animal類 public class Animal {…

什么是ESLint?它有什么作用?

ESLint 是一個用于 靜態代碼分析 的工具,專門檢測 JavaScript/TypeScript 代碼中的潛在問題和風格違規。它通過預定義的規則集幫助開發者保持代碼的一致性和質量,是前端工程化的核心工具之一。 一、ESLint 的核心作用 1. 錯誤檢查(Error Detection) 識別語法錯誤、未定義變…

Docker的網絡介紹

網絡簡單介紹 在介紹 Docker 的網絡模式之前&#xff0c;先簡單說下我們在使用 Vmware 虛擬機中的網絡模式&#xff0c;形成對比&#xff0c;更好理解。 1、Vmware 中的網絡模式 1.1、VMnet0&#xff08;橋接模式&#xff09; 虛擬機通過宿主機的物理網卡直接連接到外部網絡…