# 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 檔案。

## 5. 指令安裝 Ubuntu
```
wsl --import Ubuntu-22.04 [target_loc] [loc/install.tar]
```
> 
# 建立 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
設定環境變數

測試版本
```
mvn --version
```
# 安裝 Docker/MongoDB
## 安裝 Rancher Desktop
Prefence/WSL 勾選 Ubuntu-22.04, Apply

https://rancherdesktop.io/
# 安裝 MongoDB
* Docker image 下載路徑

* 下載對應 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
* 安裝完成後, 輸入對應的連線字串

* 連線字串尋找的位置
```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

:::
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