# Sample

基于 [BSM-SDK Core](https://git.apinb.com/bsm-sdk/core) 的 OPS 微服务样板项目，演示 Gin HTTP 服务、配置管理、数据库（GORM）、Redis 缓存、JWT 鉴权与标准分层架构，可作为新服务的起始模板。

## 功能概览

| 模块 | 说明 |
|------|------|
| 健康检查 | `HEAD /` 与 `GET /Sample/v1/ping/hello` |
| 示例 CRUD | `Sample/v1/sample/demo` 完整增删改查（JWT 鉴权） |
| 数据模型 | `sample_demo` 表，启动时自动迁移 |
| CLI | `migrate` 数据库迁移、`version` 版本查看 |

## 项目结构

```
sample/
├── cmd/
│   ├── main/          # HTTP 服务入口
│   └── cli/           # 命令行工具
├── internal/
│   ├── config/        # 配置加载与校验
│   ├── impl/          # 基础设施实例（DB、Redis、缓存、日志）
│   ├── logic/         # 业务逻辑层
│   │   ├── ping/      # 健康检查
│   │   └── demo/      # 示例 CRUD
│   ├── models/        # 数据模型与数据库操作
│   └── routers/       # 路由注册
├── etc/               # 配置文件（按环境区分）
├── scripts/           # 构建与工具脚本
├── test/              # HTTP 接口测试文件
└── Makefile
```

## 环境要求

- Go 1.26+
- PostgreSQL（或修改配置使用 MySQL）
- Redis
- 可访问 `git.apinb.com` 私有仓库

## 快速开始

### 1. 配置 Go 私有仓库

```bash
go env -w GOPRIVATE=git.apinb.com/*
go env -w GONOPROXY=git.apinb.com/*
go env -w GOINSECURE=git.apinb.com/*
go env -w GONOSUMDB=git.apinb.com/*
```

### 2. 准备配置文件

配置文件命名规则：`{服务键}_{运行模式}.yaml`，本项目服务键为 `Sample`，开发模式对应 `etc/sample_dev.yaml`。

```bash
cp etc/sample_dev.yaml.example etc/sample_dev.yaml
# 编辑 etc/sample_dev.yaml，填入数据库与 Redis 连接信息
```

### 3. 设置环境变量

```bash
# Linux / macOS
export BSM_RuntimeMode=dev
export BSM_Prefix=$(pwd)/etc
export BSM_JwtSecretKey=your-secret-key

# Windows PowerShell
$env:BSM_RuntimeMode="dev"
$env:BSM_Prefix="$(pwd)/etc"
$env:BSM_JwtSecretKey="your-secret-key"
```

| 变量 | 说明 | 默认值 |
|------|------|--------|
| `BSM_RuntimeMode` | 运行模式：`dev` / `test` / `prod` | `dev` |
| `BSM_Prefix` | 配置文件目录 | 开发模式为当前路径 |
| `BSM_JwtSecretKey` | JWT 签名密钥 | SDK 内置默认值 |
| `BSM_Workspace` | 工作空间标识 | `default` |

### 4. 安装依赖并启动

```bash
go mod tidy
make build          # 或 go run ./cmd/main/main.go
make run
```

服务默认监听 `12426` 端口，启动成功后访问：

```bash
curl http://127.0.0.1:12426/Sample/v1/ping/hello
```

## API 接口

### 统一响应格式

```json
{
  "code": 0,
  "message": "",
  "details": {},
  "timeseq": 1710000000000
}
```

### 匿名接口

| 方法 | 路径 | 说明 |
|------|------|------|
| `HEAD` | `/` | 健康检查 |
| `GET` | `/Sample/v1/ping/hello` | Ping 测试 |

### 鉴权接口（JWT）

路由组：`/Sample/v1/sample`，请求头需携带 `Authorization: Bearer <token>`。

| 方法 | 路径 | 说明 |
|------|------|------|
| `POST` | `/Sample/v1/demo` | 创建示例数据 |
| `GET` | `/Sample/v1/demo` | 分页列表（`page`、`size`） |
| `GET` | `/Sample/v1/demo/:identity` | 按 identity 查询 |
| `PUT` | `/Sample/v1/demo/:identity` | 更新 |
| `DELETE` | `/Sample/v1/demo/:identity` | 删除 |

**创建请求示例：**

```json
{
  "name": "Alice",
  "age": 25
}
```

## CLI 工具

```bash
# 查看版本
go run ./cmd/cli/main.go version

# 执行数据库自动迁移（模型定义见 internal/models）
go run ./cmd/cli/main.go migrate
```

也可使用 Makefile：

```bash
make migrate
make cli ARGS="version"
```

## 开发与测试

```bash
make lint           # go vet + go fmt
make tidy           # go mod tidy
```

接口测试文件位于 `test/` 目录，可使用 VS Code REST Client 或 IntelliJ HTTP Client 直接运行。

## 生产部署

### 构建

```bash
./scripts/build.sh
# 产物：build/sample、build/sample-cli
```

### systemd

```bash
cp etc/sample.service /etc/systemd/system/
cp etc/sample.env.example /data/app/etc/sample.env
# 编辑环境变量后
systemctl enable sample
systemctl start sample
```


