---
# System prepended metadata

title: 孫宇衡 開發紀錄

---

### 從gitlab git clone程式碼
由於是private repo，因此需要[access token](https://docs.gitlab.com/topics/git/clone/)，這裡使用personal access token

點開左上方的個人圖像-> Edit profile-> Access tokens，創建一個token


使用以下的方式 clone
```
git clone https://<username>:<token>@gitlab.example.com/tanuki/awesome_project.git
```
### 切換git branch
以下指令會clone所有branch，並將你現在的branch設定成你指定的
```
git clone -b <branchname> <remote-repo-url>
```
切換到該branch
* -c 可以創造branch並直接切換
```
git switch <branchname>
```

查看本地branch
```
git branch
```

刪除本地 branch
```
git branch -d 分支名稱
```
-d 是 "delete"，會在刪除前檢查該分支是否已合併到目前分支或其他分支。

若你確定要強制刪除（即使未合併）：
```
git branch -D 分支名稱
```

### 使用branch
抓取遠端最新分支列表
```
git fetch
```
查看所有遠端分支
```
git branch -r
```
建立一個本地分支追蹤遠端分支
```
git checkout -b 本地分支名稱 origin/遠端分支名稱
```

刪除遠端 branch
```
git push origin --delete 分支名稱
```
這會通知 Git server（如 GitHub、GitLab）刪除該遠端分支。

如果刪除後仍看到遠端分支殘留在本地 cache，可執行：
```
git fetch -p
```

### 在容器壞境內開發
在容器環境內開發，本地就不用再安裝環境，需要的做法如下:
1. 安裝nodemon，當檔案有變動會自動重啟nodejs
2. 將檔案直接映射到容器內(透過 volumes)
3. 可以設定nodemon.json，當某種檔案有變動就會自動重啟

api-gateway的Dockerfile內容
```dockerfile=
FROM node:22-slim

WORKDIR /app
COPY ./api-gateway/package*.json /app
RUN  npm install
# 在容器環境內開發，本地不用安裝環境 (開發用)
# ==========
RUN npm install -g nodemon 
# ==========

RUN  mkdir -p /member/protos
COPY ./api-gateway   /app
COPY ./member/protos /member/protos

EXPOSE 9000
# 在容器環境內開發，本地不用安裝環境 (開發用)
# 用 nodemon 啟動你的 app（根據你的進入點名稱），加上 --legacy-watch 是因為部分系統對檔案變更監控有問題
# ==========
CMD ["nodemon", "--legacy-watch", "index.js"] 
# ==========
#CMD ["npm", "run", "start"]
```
dokcer-compose file
1. 透過volumes將本地資料夾映射到容器內
2. 由於我們是先將檔案複製到/app中並npm install，如果再../api-gateway:/app會把/app的內容覆蓋掉，因此我們要加上/app/node_modules避免被覆蓋掉
```yaml=
services:
  member:
    image: ntcupj/member:dev
    ports:
      - "7700:7700"
    environment:
      DB_TYPE: LITE

  api-gateway:
    build:
      context: ../
      dockerfile: ./api-gateway/Dockerfile
    ports:
      - "9000:9000"
    depends_on:
      - member
    environment:
      JWT_SECRET: th1siSjwTseCReT4Test1n9
      MEMBER_HOST: member
    # 開發用，將目錄掛載到容器中
    # ==========
    volumes: #volumes
      - ../api-gateway:/app # 掛載本地程式碼（主程式）
      - /app/node_modules #避免node_modules被覆蓋
    # ==========
```
nodemon.json的設定
* watch 指的是要監控的目錄
* ext 當那些檔案被修改時要執行指令
* ignore 略過那些檔案
* exec 執行的指令
```json=
{
  "watch": ["."], 
  "ext": "js,json",
  "ignore": ["node_modules"],
  "exec": "node index.js"
}
```


### docker build 指令 (目前用不到)

目錄結構如下
```
#指令: tree .
├───api-gateway
│   ├───src
│   │   ├───grpc
│   │   ├───middleware
│   │   └───routes
│   └───tests
└───member
    ├───database
    ├───generated
    ├───member
    ├───protos
    └───tests
        ├───integration
        └───unit
```
Dockerfile 內容(位置: src/api-gateway/Dockerfile)
```dockerfile=
FROM node:22-slim

WORKDIR /app
COPY ./api-gateway/package*.json /app
RUN  npm install --omit=dev

RUN  mkdir -p /member/protos
COPY ./api-gateway   /app
COPY ./member/protos /member/protos

EXPOSE 9000
CMD ["npm", "run", "start"]

```
我們使用以下指令:
* --no-cache 不使用cache，如果build有出問題可以用個把之前錯誤的cache清掉比較保險
* -f 要build的Docker file
* -t image的名字
* . 建構目錄（build context），要讀到src/member/protos因此不能在src/api-gateway跑
```
#在 src/ 執行
docker build --no-cache -f .\api-gateway\Dockerfile -t api-gateway .
```

## 活動資料收集模組


![image](https://hackmd.io/_uploads/SyCe2KeDxg.png)


`activity` 資料夾主要負責會員（Member）相關的資料庫操作與 gRPC 服務，功能如下：

- **models.py**  
  定義了會員資料表的 ORM 模型 `Member`，包含欄位：uid（UUID主鍵）、account（帳號）、password（密碼）、name（姓名）、email（電子郵件）。

- **service.py**  
  實作會員的業務邏輯，包括：
  - 密碼加密與驗證（`hash_password`, `verify_password`）
  - 註冊（`sign_up`）：新增會員資料，若帳號或 email 重複則丟出錯誤
  - 登入（`login`）：驗證帳號與密碼
  - 依 UUID 查詢會員（`get_user`）

- **servicers.py**  
  實作 gRPC 服務端，將 service.py 的功能包裝成 gRPC API，包括：
  - `SignUp`：註冊會員
  - `Login`：會員登入
  - `GetMemberByID`：依 UUID 取得會員資料
  - 例外處理（如帳號重複、認證失敗、找不到會員等）

- **logger.py**  
  提供自訂的 logger 工具，可根據環境（DEV/TEST/PROD）輸出不同格式的 log（純文字或 JSON）。

- **__init__.py**  
  讓此資料夾可作為 Python 套件匯入。

總結：這個資料夾負責會員資料的資料庫操作、密碼安全、gRPC API 服務，以及 log 管理。