【博客系統】博客系統第十一彈:從零開始在 Linux 系統上搭建 Java 部署環境并部署 Web 項目

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述


搭建 Java 部署環境


JDK


1. 更新軟件包


apt 命令詳細介紹

sudo apt-get update

2. 安裝 OpenJDK


查找 JDK 包

apt list | grep "jdk"

安裝 JDK

sudo apt install openjdk-17-jdk

注意:

  • 此處安裝的是 OpenJDK,OpenJDK 是一個開源版本的 JDK,和 Oracle 官方的 JDK 略有差別。此處我們就使用 OpenJDK 即可。安裝 Oracle JDK 比較麻煩。
  • 使用 java -version 驗證是否安裝成功。
  • 如果提示 “java 命令找不到” 則說明安裝失敗。

image-20250529160653334


3. 卸載 OpenJDK


  1. 檢查安裝的是哪個 OpenJDK

    dpkg --list | grep -i jdk
    
  2. 移除 OpenJDK 包

    apt-get purge openjdk*
    
  3. 卸載 OpenJDK 相關包

    apt-get purge icedtea-* openjdk-*
    
  4. 檢查所有 OpenJDK 包是否都已卸載完畢

    dpkg --list | grep -i jdk
    

MySQL


使用 apt 安裝 MySQL


  1. 查找安裝包

    apt list | grep "mysql-server"
    
  2. 安裝 MySQL

    sudo apt install mysql-server
    

查看 MySQL 狀態


sudo systemctl status mysql

image-20250529161153518


MySQL 安裝安全設置


默認的 MySQL 設置是不安全的,MySQL 安裝提供了一個安全腳本,用于解決不太安全的默認選項。


運行以下命令:

sudo mysql_secure_installation #安裝安全設置

執行過程:

  1. 是否設置驗證密碼組件:

    Press y|Y for Yes, any other key for No: Y #是否設置驗證密碼組件
    
  2. 密碼強度設置:

    Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2 #設置密碼強度
    
  3. 刪除匿名用戶:

    Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y #默認情況下,MySQL安裝有一個匿名用戶, 允許任何人登錄MySQL. 是否刪除匿名用戶?
    
  4. 禁止 root 用戶遠程登錄:

    Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y #僅應允許root從'localhost'連接
    
  5. 刪除 test 數據庫:

    Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y #默認情況下, MySQL帶有?個test數據庫, 是否刪除?
    
  6. 重新加載權限表:

    Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y #是否現在加載配置, 使剛才的修改生效?
    
  7. 完成:

    All done!
    

通過以上步驟,MySQL 的安全設置已經完成,確保了數據庫的安全性。設置密碼


連接 MySQL 服務器


sudo mysql

使用 ALTER USER 命令修改密碼


ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'BITE@yyds.666';

退出 MySQL


exit

image-20250529164241001


再次登錄輸入:

mysql -uroot -p   #  密碼: BITE@yyds.666

卸載 MySQL


  1. 停止 MySQL
sudo systemctl stop mysql

  1. 卸載 MySQL
sudo apt-get remove --purge mysql-server mysql-client mysql-common

  1. 刪除 MySQL 配置文件和數據
sudo rm -rf /etc/mysql /var/lib/mysql

  1. 清理殘留文件和目錄
sudo apt-get autoremove
sudo apt-get autoclean

  1. 驗證卸載結果
mysql --version

部署 Web 項目到 Linux


環境配置


確保程序正常運行需完成以下配置:

  1. 數據庫準備

    • 執行提供的建表腳本,確保表結構與服務器一致
  2. 多環境配置

    • 按環境創建配置文件(如開發/測試/生產環境)
    • 命名格式:application-XXX.ymlapplication-XXX.properties
    • 差異化配置項示例:MySQL賬號密碼、服務端口等

關鍵點:通過文件命名區分環境,避免硬編碼敏感信息。


以下以application-XXX.yml為例:

application-dev.yml: 開發環境配置

image-20250529175414319

server:port: 8080spring:datasource:url: jdbc:mysql://127.0.0.1:3306/java_blog_spring?characterEncoding=utf8&useSSL=falseusername: rootpassword: 123456  # windows 數據庫密碼driver-class-name: com.mysql.cj.jdbc.Drivermybatis-plus:configuration:map-underscore-to-camel-case: true
#      log-impl: org.apache.ibatis.logging.stdout.StdOutImpl   # linux 服務器沒必要打日志, 打日志也會影響性能
logging:file:name: spring-blog.log

application-prod.yml: 生產環境配置

image-20250529175444889

server:port: 8080spring:datasource:url: jdbc:mysql://127.0.0.1:3306/java_blog_spring?characterEncoding=utf8&useSSL=falseusername: rootpassword: BITE@yyds.666driver-class-name: com.mysql.cj.jdbc.Drivermybatis-plus:configuration:map-underscore-to-camel-case: true
#      log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
logging:file:name: spring-blog.log

如果同時有三個yml文件,通常只有主配置文件application.yml會自動生效。為了使其他配置文件(如application-prod.ymlapplication-dev.yml)生效,需要在主配置文件application.yml中進行相應的配置。具體步驟如下:

  1. 刪除主配置文件中的數據庫相關配置: 在application.yml中刪除與數據庫相關的配置項,以避免沖突。
  2. 指定生效的配置文件: 在application.yml中添加配置,指定使用application-prod.ymlapplication-dev.yml作為生效的配置文件。

image-20250529175812878

在Spring框架中,spring.profiles.active屬性用于指定激活的配置文件,application.yml 二選一即可:

spring:profiles:active: prod    
spring:profiles:active: dev

這里的active屬性值填的是配置文件名的一部分(如devprod等),而不是完整的文件名(如application-prod.ymlapplication-dev.yml)。


啟動程序:

image-20250530103902446


測試接口:

image-20250529182232839


當前配置文件中的數據庫密碼是按照 Linux 系統的設置來配置的,與 Windows 系統的數據庫密碼不一致,從而導致接口訪問失敗:

image-20250529182539655


在不同環境之間來回切換時,需要頻繁修改配置文件中的active值。在多人協作的場景下,很容易出現忘記修改active值的情況,從而導致配置錯誤。

為了避免這種情況,我們可以通過從 Maven 中讀取環境配置變量來為active賦值:

image-20250529184152481

<profiles><profile><id>dev</id><properties><profile.name>dev</profile.name></properties></profile><profile><id>prod</id><activation><activeByDefault>true</activeByDefault></activation><properties><profile.name>prod</profile.name></properties></profile>
</profiles>

注意,每次勾選新的 profile 都需要刷新 maven


修改 application.yml

spring:profiles:active: @profile.name@

image-20250529185215864


勾選好 profile 后,刷新 maven,重新運行程序:

image-20250529185507098


測試接口,此時接口訪問成功:

image-20250529184623409


構建項目并打包


在本地使用 Maven 進行打包:

  1. 如果 Test 代碼中有與環境配置相關的操作(比如數據庫相關的操作),打包會失敗,可以跳過測試。
  2. 點擊 clean -> package

dev 切換成 prod,刷新 maven 并打包:

image-20250529190134939


因為這個項目使用的是 mybatis-plus ,所以不需要寫 mybatis 的測試用例,所以打包成功

image-20250529192016934

  • 如果使用的是 MyBatis 而非 MyBatis-Plus,就需要在單元測試中編寫 MyBatis 的接口測試代碼

  • Maven 的配置文件中,如果選擇了prod環境配置并刷新了 Maven,然后按照生命周期package命令進行打包,那么 Maven 會依次執行clean、validate、compile、test、package階段:image-20250529191432762

  • 在 Maven 的 test 階段運行單元測試時,由于配置的數據庫密碼與 Windows 系統的數據庫密碼不一致,導致 MyBatis 無法連接到數據庫,從而使得單元測試失敗

  • 單元測試失敗會中斷 Maven 的打包過程,導致打包失敗

  • 解決方案:在打包前,設置去掉 test 階段,避免打包過程因為 test 的問題導致打包過程被打斷:image-20250529191733447

接下來,根據日志路徑,在本地找到打好的 Jar 包:

image-20250529192828340


上傳 Jar 包到服務器并運行


1. 上傳 Jar


在 linux 系統中,創建和 windows 對應數據庫及數據表

-- 建表 SQL
create database if not exists java_blog_spring charset utf8mb4;use java_blog_spring;-- 用戶表
DROP TABLE IF EXISTS java_blog_spring.user_info;
CREATE TABLE java_blog_spring.user_info(
`id` INT NOT NULL AUTO_INCREMENT,
`user_name` VARCHAR (128) NOT NULL,
`password` VARCHAR (128) NOT NULL,
`github_url` VARCHAR (128) NULL,
`delete_flag` TINYINT (4) NULL DEFAULT 0,
`create_time` DATETIME DEFAULT now(),
`update_time` DATETIME DEFAULT now() ON UPDATE now(),
PRIMARY KEY (id),
UNIQUE INDEX user_name_UNIQUE (user_name ASC)) ENGINE = INNODB DEFAULT CHARACTER SET = utf8mb4 COMMENT = '用戶表';-- 博客表
drop table if exists java_blog_spring.blog_info;
CREATE TABLE java_blog_spring.blog_info (
`id` INT NOT NULL AUTO_INCREMENT,
`title` VARCHAR(200) NULL,
`content` TEXT NULL,
`user_id` INT(11) NULL,
`delete_flag` TINYINT(4) NULL DEFAULT 0,
`create_time` DATETIME DEFAULT now(),
`update_time` DATETIME DEFAULT now() ON UPDATE now(),
PRIMARY KEY (id))
ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '博客表';-- 新增用戶信息
insert into java_blog_spring.user_info (user_name, password, github_url) values("zhangsan", "123456", "https://gitee.com/bubblefish666/class-java45");
insert into java_blog_spring.user_info (user_name, password, github_url) values("lisi", "123456", "https://gitee.com/bubblefish666/class-java45");insert into java_blog_spring.blog_info (title, content, user_id) values("第一篇博客", "111我是博客正文我是博客正文我是博客正文", 1);
insert into java_blog_spring.blog_info (title, content, user_id) values("第二篇博客", "222我是博客正文我是博客正文我是博客正文", 2);

為了能通過加密、加鹽功能的密碼校驗,更新 linux 數據庫表中,用戶的密碼:

update user_info set password= 'e5bf3de57e3243ab9d94b59b379a0a640f967f2e3ae738c2f5474ab0fe46389b' where id in(1,2);

image-20250529193626767


直接拖動打好的 Jar 包到 Xshell 窗口即可完成文件的上傳。

image-20250529194002503

Xshell 可以直接拖動文件到窗口,達到上傳文件的目的。如果使用其他客戶端,不支持文件的上傳,需要借助 lrzsz 命令;


借助 mv 改一下 jar 包名:

image-20250529194152710


2. 運行程序


接下來,在 linux 上運行該 jar 包:

java -jar blog.jar

image-20250529194511729

部署程序后,日志輸出可能會非常頻繁。如果使用以下命令啟動程序:

java -jar blog.jar

那么在按下Ctrl+C停止日志輸出時,程序也會隨之停止運行,導致服務無法繼續提供。為了避免這種情況,應使用以下命令啟動程序:

nohup java -jar blog.jar &

nohup 命令詳細介紹

這樣,即使關閉終端或退出當前會話,程序仍能在后臺 持續運行,不會因Ctrl+C操作而中斷,從而確保服務的穩定性。


開放端口號


如果外網需要訪問該服務,需要先服務器防火墻開放對應的端口號。

本著服務器安全的原則,云服務器上的端口非必要不開啟。比如常見端口號:數據庫 3306、Redis 6379,盡可能避免開放,而是采用其他方式來連接,比如配置隧道的方式。

image-20250529204038344


image-20250529204120904


確保列表中有添加的規則:

image-20250529204159836


驗證程序


  1. 訪問項目:http://IP:Port/blog_login.html

    • IP 改為云服務器的 IP,Port 改為項目的端口號。
  2. 按照項目功能進行驗證:

    • 驗證賬號注冊登錄。image-20250529204225810

    • 驗證展示博客列表。image-20250529204310510

    • 驗證博客編輯功能image-20250529204430024

    • 驗證新增博客。image-20250529204506265

    • 驗證展示博客內容。image-20250529204453371

      image-20250530104741094


跟蹤日志


實時追蹤日志


tail -f [日志文件名]

image-20250530112349734


此時再訪問接口,就會出現相關的日志:

image-20250530112514553


過濾日志


我們關注的重點是 ERROR 級別的日志,而非 INFO 級別的日志。因此,可以使用以下命令來跟蹤日志,直接過濾出 ERROR 級別的日志內容:

tail -f nohup.out | grep "ERROR"

如果需要停止當前的日志跟蹤,可以按 Ctrl+C,然后重新輸入上述命令以繼續跟蹤。


過濾日志后,INFO級別的日志不在顯示,只顯示 ERROR級別的日志:

image-20250530113205342


使用重定向將日志輸出到自定義文件


如果想將輸出的日志存儲到自定義文件中,可以使用重定向操作

nohup java -jar blog.jar >指定文件路徑 2>&1 &
  • >:將標準輸出(日志信息)重定向到指定文件
  • 2>&1:將標準錯誤也重定向到指定文件,確保所有輸出都寫入同一文件
  • &將命令在后臺運行,避免阻塞終端

例如:

nohup java -jar blog.jar >aa.log &more aa.log | grep "ERROR"

在 Linux 中,>操作符可以將命令的輸出內容寫入指定文件,這種操作稱為“重定向”


配置日志存儲文件


我們沒有看見 jar 包同目錄下,生成對應存儲日志的 spring-blog.log 文件,但是我們配置文件中配置了:

image-20250530115314750


后續發現,日志的格式配置錯誤了,糾正配置文件的 log 配置格式后,clean一下,重新上傳并運行新的 Jar 包。:

image-20250530114205753


此時,在對應 Jar 包目錄下,除了nohup.out,還會生成一個名為spring-blog.log的文件,專門用于存儲服務生成的日志:

image-20250530115540628

在程序啟動前,日志默認存儲在nohup.out文件中。一旦程序啟動,根據配置文件的指定,日志將存儲到spring-blog.log文件中。


因此,若要追蹤日志,應使用以下命令:

tail -f spring-blog.log | grep "ERROR"

而不是:

tail -f nohup.out | grep "ERROR"

常見問題


一個程序的正常運行,需要程序的正確和環境的正確。同樣的代碼在 Windows 上可以運行成功,不一定在 Linux 上運行成功。不同的系統對代碼的理解和支持是不同的。比如 Windows 系統對 MySQL 不區分大小寫,Linux 區分大小寫。

服務不能正常訪問的原因有很多,主要分以下幾個方面:

  1. 服務未啟動

    • 使用 ps -ef | grep java 查看程序是否在運行。
    • 使用 curl http://127.0.0.1:8080/blog_login.html 看下是否有返回 HTML 頁面。如果有返回,說明程序啟動成功了,考慮端口未開放。
    • 如果未啟動成功,需要查看對應的日志,根據原因來分析:
      • 數據庫不存在。
      • 表不存在(區分大小寫)。
      • 數據庫密碼不正確。
      • JDK 安裝版本不對,或者未安裝。
      • MySQL 未設置密碼。
  2. HTTP 端口未開放

    • 檢查云服務器防火墻/安全組是否開放相應端口(如 8080)

殺掉進程


如果我們需要重啟服務,或者重新部署等,都需要先停止之前的服務。

(1) 查看當前服務的進程

ps -ef | grep java

image-20250530130621426

上圖中的 35104 就是該服務的進程。


(2) 殺掉進程

kill -9 PID

image-20250530130854027


殺掉服務對應正在運行的進程,服務此時就不能再訪問了:

image-20250530131532681


再次運行 Jar 包:

image-20250530131508349


總結


  1. 連接 Linux 服務器的方式有很多,Xshell 只是其中一種。Xshell 是一個客戶端,而非服務器
  2. Ubuntu 軟件管理工具是 apt,其他的 Linux 發行版本軟件包管理工具不同,比如 CentOS 是使用 yum 來管理軟件的。
  3. Spring Boot 可以使用多個配置文件來完成不同平臺的配置。
  4. 在 Windows 上可以運行成功的代碼,在 Linux 上不一定能運行成功。
  5. 啟動程序需要使用 nohup 后臺運行,需要停止服務時,使用 kill 命令。

在這里插入圖片描述

在這里插入圖片描述

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

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

相關文章

智能外呼系統中 NLP 意圖理解的工作原理與技術實現

智能外呼系統通過整合語音識別&#xff08;ASR&#xff09;、自然語言處理&#xff08;NLP&#xff09;和語音合成&#xff08;TTS&#xff09;等技術&#xff0c;實現了自動化的電話交互。其中&#xff0c;NLP 意圖理解是核心模塊&#xff0c;負責解析用戶話語中的語義和意圖&…

Sigma-Aldrich胰蛋白酶細胞解離方案速覽

Sigma-Aldrich_胰蛋白酶用于細胞培養 細胞解離是細胞傳代過程中的一個步驟&#xff0c;即細胞從預處理表面分離&#xff0c;形成懸浮液。這些懸浮液對于傳代培養重新接種、細胞計數分析和細胞增殖非常重要。有多種蛋白水解酶可用來從粘附基質上脫離細胞&#xff0c;胰蛋白酶就…

寶塔安裝WordPress程序

寶塔安裝WordPress程序 一、提前準備1&#xff0c;下載WordPress2&#xff0c;在寶塔創建站點 二、部署項目1&#xff0c;上傳下載的wordpress壓縮包至創建的項目根目錄下并解壓 三、wordpress安裝1&#xff0c;在瀏覽器打開創建的網站2&#xff0c;開始按照流程安裝配置數據庫…

【LangChain】框架解析

目錄 &#x1f31f; 前言&#x1f3d7;? 技術背景與價值&#x1fa79; 當前技術痛點&#x1f6e0;? 解決方案概述&#x1f465; 目標讀者說明 &#x1f9e0; 一、技術原理剖析&#x1f4ca; 核心架構圖解&#x1f4a1; 核心作用講解&#x1f527; 關鍵技術模塊說明?? 技術選…

百度之星2024 初賽第一場 補給

百度之星2024 初賽第一場 補給 題干描述問題分析&#xff1a;C代碼Java代碼&#xff1a;Python代碼補充說明&#xff1a; 題干描述 參考自馬蹄集OJ&#xff0c;原文鏈接1 可怕的戰爭發生了&#xff0c;小度作為后勤保障工作人員&#xff0c;也要為了保衛國家而努力。 現在有 …

JavaScripts console.log和console.dir區別

console.log 和 console.dir 都是 JavaScript 中用于在瀏覽器控制臺打印信息的方法 &#xff0c;二者主要有以下區別&#xff1a; 輸出內容和格式 console.log&#xff1a;主要用于輸出簡單的日志信息&#xff0c;直接打印數據的字符串表示 。對于對象、數組等引用類型&#…

uniapp 開發企業微信小程序時,如何在當前頁面真正銷毀前或者關閉小程序前調用一個api接口

在 UniApp 開發企業微信小程序時&#xff0c;若需在頁面銷毀或小程序關閉前調用 API 接口&#xff0c;需結合頁面生命周期和應用生命周期實現。以下是具體實現方案及注意事項&#xff1a; 一、在頁面銷毀前調用 API&#xff08;頁面級&#xff09; 通過頁面生命周期鉤子 onUnl…

聊聊 Metasploit 免殺

各位小伙伴們&#xff0c;晚上好&#xff01; 咱們今天打開宵夜“安全食材箱”&#xff0c;聊聊滲透測試繞過殺毒&#xff08;免殺&#xff09;的那些門道。你可以把免殺理解為——深夜做宵夜時&#xff0c;家里有人睡覺&#xff0c;但你非得去廚房整點美食&#xff0c;還不能…

Android高級開發第二篇 - JNI 參數傳遞與 Java → C → Java 雙向調用

文章目錄 Android高級開發第二篇 - JNI 參數傳遞與 Java → C → Java 雙向調用引言JNI基礎回顧JNI中的參數傳遞基本數據類型傳遞字符串傳遞數組傳遞對象傳遞 Java → C → Java 雙向調用從C/C調用Java方法實現一個完整的回調機制 內存管理與注意事項性能優化提示結論參考資源 …

2025-05-28 Python深度學習8——優化器

文章目錄 1 工作原理2 常見優化器2.1 SGD2.2 Adam 3 優化器參數4 學習率5 使用最佳實踐 本文環境&#xff1a; Pycharm 2025.1Python 3.12.9Pytorch 2.6.0cu124 ? 優化器 (Optimizer) 是深度學習中的核心組件&#xff0c;負責根據損失函數的梯度來更新模型的參數&#xff0c;使…

Web攻防-SQL注入增刪改查HTTP頭UAXFFRefererCookie無回顯報錯

知識點&#xff1a; 1、Web攻防-SQL注入-操作方法&增刪改查 2、Web攻防-SQL注入-HTTP頭&UA&Cookie 3、Web攻防-SQL注入-HTTP頭&XFF&Referer 案例說明&#xff1a; 在應用中&#xff0c;存在增刪改查數據的操作&#xff0c;其中SQL語句結構不一導致注入語句…

Windows MongoDB C++驅動安裝

MongoDB驅動下載 MongoDB 官網MongoDB C驅動程序入門MongoDB C驅動程序入門 安裝環境 安裝CMAKE安裝Visual Studio 編譯MongoDB C驅動 C驅動依賴C驅動&#xff0c;需要先編譯C驅動 下載MongoDB C驅動源碼 打開CMAKE(cmake-gui) 選擇源碼及輸出路徑,然后點擊configure …

使用 C/C++ 和 OpenCV 調用攝像頭

使用 C/C 和 OpenCV 調用攝像頭 &#x1f4f8; OpenCV 是一個強大的計算機視覺庫&#xff0c;它使得從攝像頭捕獲和處理視頻流變得非常簡單。本文將指導你如何使用 C/C 和 OpenCV 來調用攝像頭、讀取視頻幀并進行顯示。 準備工作 在開始之前&#xff0c;請確保你已經正確安裝…

使用微軟最近開源的WSL在Windows上優雅的運行Linux

install wsl https://github.com/microsoft/WSL/releases/download/2.4.13/wsl.2.4.13.0.x64.msi install any distribution from microsoft store, such as kali-linux from Kali office website list of distribution PS C:\Users\50240> wsl -l -o 以下是可安裝的有…

Win11安裝Dify

1、打開Virtual Machine Platform功能 電腦系統為&#xff1a;Windows 11 家庭中文版24H2版本。 打開控制面板&#xff0c;點擊“程序”&#xff0c;點擊“啟用或關閉Windows功能”。 下圖標記的“Virtual Machine Platform”、“適用于 Linux 的 Windows 子系統”、“Windows…

C++模板類深度解析與氣象領域應用指南

支持開源&#xff0c;為了更好的后來者 ————————————————————————————————————————————————————By 我說的 C模板類深度解析與氣象領域應用指南 一、模板類核心概念 1.1 模板類定義 模板類是C泛型編程的核心機制&#x…

MongoDB(七) - MongoDB副本集安裝與配置

文章目錄 前言一、下載MongoDB1. 下載MongoDB2. 上傳安裝包3. 創建相關目錄 二、安裝配置MongoDB1. 解壓MongoDB安裝包2. 重命名MongoDB文件夾名稱3. 修改配置文件4. 分發MongoDB文件夾5. 配置環境變量6. 啟動副本集7. 進入MongoDB客戶端8. 初始化副本集8.1 初始化副本集8.2 添…

mac筆記本如何快捷鍵截圖后自動復制到粘貼板

前提&#xff1a;之前只會進行部分區域截圖操作&#xff08;commandshift4&#xff09;操作&#xff0c;截圖后發現未自動保存在剪貼板&#xff0c;還要進行一步手動復制到剪貼板的操作。 mac筆記本如何快捷鍵截圖后自動復制到粘貼板 截取 Mac 屏幕的一部分并將其自動復制到剪…

WPF 按鈕點擊音效實現

WPF 按鈕點擊音效實現 下面我將為您提供一個完整的 WPF 按鈕點擊音效實現方案&#xff0c;包含多種實現方式和高級功能&#xff1a; 完整實現方案 MainWindow.xaml <Window x:Class"ButtonClickSound.MainWindow"xmlns"http://schemas.microsoft.com/win…

C++ list基礎概念、list初始化、list賦值操作、list大小操作、list數據插入

list基礎概念&#xff1a;list中的每一部分是一個Node&#xff0c;由三部分組成&#xff1a;val、next、prev&#xff08;指向上一個節點的指針&#xff09; list初始化的代碼&#xff0c;見下 #include<iostream> #include<list>using namespace std;void printL…