# Backend Development Setup * Platform: Windows * Language: zh-tw ## 1. 無 Windows Store 安裝 WSL 2 * 確保使用的是 Windows 10 (版本 1903 或更高) 或 Windows 11。 * 開啟 PowerShell 以系統管理員身分執行,啟用 WSL 和虛擬機器平臺: ``` dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart ``` * 重新啟動電腦 ## 2. 安裝 WSL 更新元件 手動下載 WSL 2 Linux Kernel 更新包 並安裝。 https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi ## 3. 設定 WSL 2 為預設版本 在 PowerShell 中執行: ``` wsl --set-default-version 2 ``` ## 4. 下載/解壓 Ubuntu 22.04 從官方網站下載 Ubuntu 發行版本, 下載 Ubuntu 22.04 LTS WSL 映像。 https://cloud-images.ubuntu.com/wsl/jammy/20250108/ 解壓縮下載的 .tar 檔案。 ![image](https://hackmd.io/_uploads/r1jgTE0IJl.png) ## 5. 指令安裝 Ubuntu ``` wsl --import Ubuntu-22.04 [target_loc] [loc/install.tar] ``` > ![image](https://hackmd.io/_uploads/HJHjmBC8ye.png) # 建立 WSL 預設帳號 ## 1. 以 root 登入 WSL 確保目前是以 root 使用者進行操作。 ## 2. 新增使用者並設定密碼 使用以下指令: ``` adduser newuser ``` 在指令執行過程中,系統會提示輸入密碼並重複確認,這樣會自動完成密碼設定。 ## 3. 為已存在使用者設定/更新密碼 如果需要手動為使用者設定密碼(如 newuser),使用以下指令: ``` passwd newuser ``` 系統會提示輸入新密碼,並要求再次確認。 ## 4. 將使用者添加到 sudo 群組 使用以下指令: ``` usermod -aG sudo newuser ``` ## 5. 切換到新使用者並測試 sudo 權限 切換到新使用者: ``` su - newuser ``` 測試 ```sudo``` 權限: ``` sudo apt update ``` ## 6. 建立預設使用者 修改 /etc/wsl.conf 文件(如果不存在,則建立它): ``` sudo nano /etc/wsl.conf ``` 添加以下內容: ``` [user] default=<username> ``` 替換 ```<username>``` 為目標使用者名稱。 ## 7. 重新啟動 WSL 退出並執行: ``` wsl --shutdown wsl ``` 現在應該會直接以新預設使用者啟動。 # 開發環境設置 ## 安裝 Java 若要開發, 每個版本都需要安裝 (8/11/17) **OLMP** Java 17 **Before...OLMP (OEP)** Java 8/11 https://learn.microsoft.com/en-us/java/openjdk/download 測試版本 ``` java --version ``` ## 安裝 Apache Maven Maven 安裝最新版本 https://maven.apache.org/download.cgi 設定環境變數 ![image](https://hackmd.io/_uploads/Hk0voxfP1g.png) 測試版本 ``` mvn --version ``` # 安裝 Docker/MongoDB ## 安裝 Rancher Desktop Prefence/WSL 勾選 Ubuntu-22.04, Apply ![image](https://hackmd.io/_uploads/B1fB0gzDJx.png) https://rancherdesktop.io/ # 安裝 MongoDB * Docker image 下載路徑 ![image](https://hackmd.io/_uploads/r1F_1SmvJl.png) * 下載對應 image 指令 ```docker pull mongo:4.4.7-focal``` Ref. * hub.docker https://hub.docker.com/_/mongo/tags --- * 運行MongoDB 的映像檔 ``` docker run --name mongo4 -v C:\temp\MonoDbData:/data/db -d -p 27017:27017 --rm mongo ``` * –name:容器名稱 * -v:實體位置對應容器內部位置 * -d:背景執行 * -p:實體port對應容器內部port * -rm:結束後立即移除 Ref. * 用 Docker 玩 Mongo https://hackmd.io/@SuFrank/BJOe3Fi3c#1-%E6%8B%89%E5%8F%96MongoDb%E9%95%9C%E5%83%8F ## Docker 常用指令 ```docker ps``` 查看Container使用狀態 ```docker exec -it c66 /bin/sh``` exec 用於在運行中的 Docker 容器內執行命令。 -it 是兩個參數的組合: -i: 保持標準輸入 (stdin) 開啟,允許交互式操作。 -t: 分配一個偽終端 (TTY),使得輸入和輸出更直觀,適合交互式使用。 c66 是目標容器的名稱或 ID,表示要在這個容器內執行命令。 /bin/sh 是要執行的命令,啟動容器內的 /bin/sh Shell,用於提供命令行環境。 Ref. * Container指令基礎 https://joshhu.gitbooks.io/dockercommands/content/Containers/ContainersBasic.html ## MongoDB 常用指令 (CRUD) ```mongosh``` 啟動 MongoDB Shell,連接到本地執行的 MongoDB ```show dbs``` 顯示所有資料庫 ```use [DataBase]``` 使用某個資料庫 ```db.getCollectionNames()``` 查詢 db 內的 connection ```db.[collection].find()``` 查詢 connection 的資料 ```db[collection].insertOne({....})``` 插入資料 ```db.getCollection(<colletion_name>).drop()``` 刪除colletion ```db.dropDatabase()``` 刪除database Ref. * [MongoDB] 學習筆記(一) - 安裝、基礎CRUD、外部輸入資料、Data Type https://medium.com/@benhsu501/mongodb-%E5%AD%B8%E7%BF%92%E7%AD%86%E8%A8%98-%E4%B8%80-%E5%AE%89%E8%A3%9D-%E5%9F%BA%E7%A4%8Ecrud-%E5%A4%96%E9%83%A8%E8%BC%B8%E5%85%A5%E8%B3%87%E6%96%99-data-type-1169000cf02c ## MongoDB GUI * 安裝 MongoDB Compass (GUI) https://www.mongodb.com/try/download/compass * 安裝完成後, 輸入對應的連線字串 ![image](https://hackmd.io/_uploads/ryq--t7D1l.png) * 連線字串尋找的位置 ```project/src/.../resources/application.yaml(application.properties) ``` # Backend Project Setup ## Spring Boot Spring Boot 前置作業: https://ithelp.ithome.com.tw/articles/10267203 Spring Boot 零基礎入門系列 https://ithelp.ithome.com.tw/articles/10321897 實作練習 - 30天全端挑戰!React+Spring Boot+Mongo DB 串接永豐API 打造金融網站: https://ithelp.ithome.com.tw/users/20128973/ironman/4838 ## RESTful API :::spoiler RESTful API 請求資源的方法 > ### RESTful API 請求資源的方法 > 需要包含的元件為: > > * 唯一資源識別符: 伺服器通常使用統一的 URL 來執行資源識別。 > * 方法:通常用 HTTP 來實作,因此需要告訴 Server 用什麼樣的方法操作 > * GET:獲得資源 > * POST:新增資源 > * PUT:修改資源(若原本無資料則新增) > * PATCH:修改資源(只修改部分資源) > * DELETE:刪除資源 > * HTTP 標頭:Client 與 Server 之間的中繼資料,當中包含所需參數(路徑參數、Cookie 參數等) > > ### 回應狀態碼 > > 狀態碼為 Server 對於 Client 請求的回應,用一個三位數的整數來表示伺服器回應的狀態。 > > * 1xx:代表 Request 已被接受,但需要繼續處理,由於 HTTP / 1.0 的協議中並沒有任何 1xx 得狀態碼,因此除了試驗以外,都禁止回傳 1xx 的回應。 > * 2xx:表示 Request 已成功被接受。 > * 3xx:代表 Client 需要再進一步的操作才能完成 Request,通常用來重新導向。 > * 4xx:Client 端錯誤,包含未授權、無資源、參數錯誤等。 > * 5xx:Server 端錯誤,無法完成對 Request 的處理。 Postman Send RESTful api ![image](https://hackmd.io/_uploads/HkbMv7UPyx.png) ::: Ref. * 什麼是 RESTful API? https://www.explainthis.io/zh-hant/swe/restful-api ## JWT Java implementation of JSON Web Token (JWT) > JWT(JSON Web Token)包含了3大部位:header、payload、signature > * header →以base64編碼,不加密 > 包含: > 1. alg:algorithm(聲明使用的加密演算法) > 2. typ:type(類型,一般統一設為JWT) > ...其餘不常見的先略過 > > * payload →以base64編碼,不加密 > 包含: > 1. iss:Issuer(簽發者,通常放你的URI) > 2. sub:subject(主旨,拿來放可用來識別身分的唯一值,ex:帳號) > 3. exp:expiration time(過期時間) > ...常見的就這3個,也可以自定義新的key:value加入 > > * signature → 將 header 跟 payload 兩個部位加在一起,以特定的key+演算法產生的字串 Ref. * java-jwt https://github.com/auth0/java-jwt ## Swagger-UI pom.xml 加入 ``` <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> <version>2.2.0</version> <!-- 確保使用最新版本 --> </dependency> ``` http://localhost:8000/swagger-ui/index.html#/ ## Dev. CLI Build Project CLI ``` mvn clean package -B -DskipTests ``` Run Jar CLI ``` java -jar .\target\[xxx].jar ``` # Development Tools ## jwt-io JWT Token 解析 https://jwt.io/ # Reference 1. 無 Windows Store 下安裝 WSL 2,及Windows 環境中啟用 Docker(但不能使用 Docker Hub) https://codimd-10-136-218-208.traefik.me/s/732ysJz5t 2. WSL 環境以 root 建立一個具有 sudo 權限的使用者 https://codimd-10-136-218-208.traefik.me/rDvsbEajR_qaOKQCd7HQFA 3. windows 手动安装 wsl 步骤/常用命令/安装到指定目录/修改安装位置 https://blog.rosygray.com/article/20 4. WSL|在 WSL2 中安装 Docker https://hackmd.io/@CynthiaChuang/Install-Docker-in-WSL2#%E5%9C%A8-WSL-%E4%B8%AD%E5%AE%89%E8%A3%85-Docker 5. Remote - Containers - 在容器中開發 https://ithelp.ithome.com.tw/articles/10277952 6. 30天全端挑戰!React+Spring Boot+Mongo DB 串接永豐API 打造金融網站系列 第 1 篇 https://ithelp.ithome.com.tw/articles/10264103