# 编写 mm API 脚本

## 规则（Rules）

- index.js 是 API 的业务逻辑文件，导出 `main` 函数
- 函数签名：`async function main(ctx, db)`
- `ctx` 是 HTTP 上下文（Koa 风格），`db` 是数据管理器
- 客户端 API 返回 JSON 对象，Web API 返回模板渲染结果

## 方法（Methods）

### 步骤1：编写客户端 API 处理器

```javascript
async function main(ctx, db) {
    var { query, body } = ctx.request;
    var list = await db.new('表名', '主键').get(query);
    return $.ret.obj({
        success: true,
        data: list
    });
}
exports.main = main;
```

### 步骤2：编写 Web 页面控制器

```javascript
async function main(ctx, db) {
    var model = {
        title: '页面标题',
        list: []
    };
    return db.tpl.view("./index.html".fullname(__dirname), model);
}
exports.main = main;
```

### 步骤3：编写带数据库操作的 API

```javascript
async function main(ctx, db) {
    var { query, body } = ctx.request;
    var db_data = db.new('cms_article', 'article_id');
    db_data.size = 20;
    var list = await db_data.get(
        { state: 1, title_like: query.keyword },
        "sort desc"
    );
    return $.ret.obj({ data: list });
}
exports.main = main;
```

## 技巧（Tips）

- **ctx.request** 中 `query` 是 GET 参数，`body` 是 POST 参数
- **$.ret.obj()** 返回标准 JSON 对象
- **$.ret.error(code, msg)** 返回错误
- **db.tpl.view()** 渲染 HTML 模板，第一个参数是模板文件路径
- 路径获取用 `"./file.html".fullname(__dirname)` 获取绝对路径
