# Description

The gadmin2 CLI is a command-line interface tool that helps you to initialize, develop, and maintain your gadmin2 applications. 

[Documents](https://ptc.coding.intlgame.com/p/gadmin2/wiki/1)

## Installation
```
$ yarn global add @gadmin2n/cli@latest
```
Check CLI version
```
$ gadmin2 -v
```

## Template Sync

本项目是 gadmin2 的实例项目。日常在本项目迭代新功能，完成后需要同步回模板。

### 查看与模板的差异
```bash
# 完整 diff（含文件内容差异）
$ gadmin2 template diff

# 只看文件列表
$ gadmin2 template diff --no-content
```

### 从模板拉取更新
```bash
# 预览变更（不执行）
$ gadmin2 template update --dry-run

# 执行更新（冲突文件会生成 conflict markers）
$ gadmin2 template update

# 跳过确认
$ gadmin2 template update -y
```

## Usage

### Define data model
```
$ vi config/prisma/{name}.prisma
```

### Change ui
```
$ vi config/ui/{ModelName}.ts
```

### Generate code after edit config/schema.prisma or config/ui.config.ts
```
$ gadmin2 g prisma:dev  #Run prisma push db first. Command "gadmin2 g prisma" without run "prisma push db"
```

### Start web DevServer
```
$ cd web
$ yarn #run once if dependancies installed failed
$ yarn dev
```

### Start server(nestjs) DevServer
```
$ cd server
$ yarn #run once if dependancies installed failed
$ yarn start:dev
```
About nestjs server [read more](https://ptc.coding.intlgame.com/p/gadmin2/d/schematics/git/tree/master/src/lib/application/files/server/nest/README.md)

## 登录流程

```
┌─────────────────────────────────────────────────────────────────┐
│                        用户访问页面                              │
└──────────────────────────────┬──────────────────────────────────┘
                               │
                               ▼
                    authProvider.check()
                       checkLogin()
                               │
               ┌───────────────┼───────────────┐
               ▼               ▼               ▼
          URL 有            Cookie 有        两者都没有
       gadmin-token       gadmin-token
               │               │               │
               ▼               │               ▼
      写入 Cookie             │         返回 false
      返回 true              │               │
               │               │               ▼
               └───────────────┘     redirect to /login
                       │                      │
                       │                      ▼
                       │              login() 函数
                       │                      │
                       │                      ▼
                       │      跳转后端 /login?redirect_url=当前URL
                       │                      │
                       │          ┌───────────┴────────────┐
                       │          ▼                        ▼
                       │    WOA 认证成功             Taihu 认证成功
                       │    (x-tai-identity          (gadmin-token
                       │      等 header)                cookie)
                       │          └───────────┬────────────┘
                       │                      │
                       │                      ▼
                       │      redirect 回 redirect_url
                       │      ?gadmin-token=<JWT>
                       │                      │
                       └──────────────────────┘
                               │
                               ▼ authenticated: true
                    ┌──────────────────────┐
                    │      进入页面         │
                    └──────────┬───────────┘
                               │
                               ▼
                     发起 API 请求
                  requestHeaders() 自动携带
                  Cookie 中的 gadmin-token
                               │
                    ┌──────────┴──────────┐
                    ▼                     ▼
                 200 OK               401 响应
                    │                     │
                    ▼                     ▼
                正常使用           login() 函数
                              跳转后端 /login 重新认证
```

**关键节点说明：**

| 位置 | 文件 | 作用 |
|------|------|------|
| `checkLogin()` | `web/src/helpers/login.ts` | 检查 URL 参数 / Cookie，将 URL token 存入 Cookie |
| `authProvider.check()` | `web/src/authProvider.ts` | Refine 框架调用，决定是否已认证 |
| `login()` | `web/src/helpers/login.ts` | 跳转后端登录页，携带 `redirect_url` |
| 后端 `/login` | NestJS | 走 WOA 或 Taihu OAuth，认证后带 token 跳回前端 |
| axios 拦截器 | `web/src/helpers/http.ts` | 捕获 API 401，触发重新登录 |
| `requestHeaders()` | `web/src/helpers/login.ts` | 每次请求自动从 Cookie 读取 token 加入 header |