# 编写 mm App 脚本

## 规则（Rules）

- index.js 是 App 的唯一入口文件，位于 `app/{模块名}/index.js`
- 所有方法统一写在 `module.exports = { ... }` 对象内
- 不能在 App 目录下另外创建 `app.js`

## 方法（Methods）

### 步骤1：确定需要实现的生命周期方法

| 必要性 | 方法 | 用途 |
|:------|:-----|:------|
| 通常需要 | `_init` | 注册API、初始化模板/挂件/WebSocket/定时任务 |
| 需要注册钩子 | `_start` + `_stop` | 注册和清理全局钩子 |
| 需要建表 | `_install` | 首次安装时初始化数据表 |
| 基础骨架 | `main` + `cmd` + `help` | 主程序入口 |

### 步骤2：编写基础骨架

```javascript
module.exports = {
    async _init(option) {
        var msg = null;
        var api = $.admin.api('client', '客户端');
        await api.call('update', 'app/');
        return msg;
    },

    async _install(option) {
        var msg = null;
        return msg;
    },

    async _start(option) {
        var msg = null;
        return msg;
    },

    async _stop(option) {
        var msg = null;
        return msg;
    },

    async _destroy(option) {
        var msg = null;
        return msg;
    },

    main(param1, param2) {
        var ret = null;
        return ret;
    },

    cmd(content) {
        var ret = "";
        return ret;
    }
};
```

### 步骤3：添加初始化逻辑（_init 中）

| 操作 | 代码 |
|:----|:-----|
| 注册API | `$.admin.api('名称', '标题').call('update', 'app/')` |
| 初始化模板 | `$.admin.template('app名', '标题').call('update', 'static/template/')` |
| 初始化挂件 | `$.admin.pendant('app名', '标题').call('update', 'app/')` |
| 启动WebSocket | `if(config.web.socket) { $.admin.socket(...) }` |
| 启动定时任务 | `if(config.sys.task) { $.admin.task(...) }` |

### 步骤4：添加启动/停止逻辑（_start/_stop 中）

```javascript
async _start(option) {
    var msg = null;
    $.hook.addFunc("common", async function(viewBag, req, type) {
        viewBag.myData = "值";
        return viewBag;
    });
    return msg;
},

async _stop(option) {
    var msg = null;
    $.hook.delFunc("common");
    return msg;
},
```

## 技巧（Tips）

- **API 注册**：`$.admin.api('client', '客户端')` 的第一个参数是 API 分组名，第二个是标题。`.call('update', 'app/')` 扫描 `app/` 下所有 `api.json` 注册路由
- **日志调试**：生命周期内用 `this.log('info', '消息')` 或 `$.log.info('消息')`
- **完整参考**：`app/sys/index.js`
- **简洁参考**：`app/gateway/index.js`
