moon run cmd/repo-gen -- db_gen/user.json5
moon run .mooncakes/oboard/morm/mormgen -- internal/model/user.mbt -o internal/model/user.g.mbt
moon info && moon fmt
moon test
注意:生成器会覆盖目标 model 和 mapper 接口文件。手写逻辑应放在 helper、
service、handler、repository 聚合层,不要写进生成文件。
开发检查
提交前建议执行:
moon info
moon fmt
moon test
moon test cmd/server --build-only
moon test cmd/init-data --build-only
moon test cmd/repo-gen --build-only
MoonBit IoT API Server
这是一个使用 MoonBit 从零设计并实现的工程化 IoT 后端服务。项目采用清晰的 package 分层组织 HTTP、认证、业务逻辑、数据访问、代码生成和 AI 对话能力, 使用 Halo 提供 HTTP 服务,使用 morm 管理 SQLite 表结构和实体映射。
本项目不是对其他语言项目的移植。代码、package 边界、运行时、数据访问和测试均按 MoonBit 的类型系统、异步模型和工具链重新设计并实现。
当前实现重点是后台管理、认证、系统资源、文件上传凭证、AI 对话运行时和 IoT 基础数据模型。MQTT、gRPC、设备数据写入链路还没有接入。
功能范围
已实现:
.env配置加载,统一管理 HTTP、SQLite、S3、Redis 和模型服务配置。calculator、get_current_time内置工具和 reasoning /<think>拆分。暂未实现:
API.md。文档导航
API.md:当前全部 HTTP API 路由和功能清单。PACKAGES.md:MoonBit package、工程分层和 MoonBitAI 接入说明。pkg/moonbitai/README.md:MoonBitAI 详细使用方法和组装示例。db_gen/README.md:model / mapper 代码生成器配置与命令。apply.md:项目申报书一页版,可按参赛信息直接修改。快速启动
安装依赖后应用项目维护的 Halo 流式响应补丁和 morm SQLite 资源清理补丁:
注意:
moon update会刷新.mooncakes依赖目录,因此每次执行moon update后都需要 紧接着重新应用上面的两个补丁。如果编译提示set_stream_response不存在,说明 Halo 补丁没有成功应用;如果 SQLite 语句失败后关闭数据库时发生abort(),说明 morm 补丁 没有成功应用。如果
patch提示补丁已经应用并跳过,说明当前依赖目录已经是正确状态,可以直接 执行启动命令。首次使用时复制配置文件:
按需修改
.env。常用配置:本地
.env由 Git 忽略并保留,不应提交或输出其中的密钥。OpenAI 或 Redis 不可用时,普通 IoT/管理 API 仍正常启动,聊天 API 返回503。启动服务:
初始化内置数据也可以单独执行:
服务默认监听:
健康检查:
默认登录账号由初始化逻辑创建:
登录示例:
主要 API
认证:
POST /api/auth/loginPOST /api/auth/logoutGET /api/auth/mePUT /api/auth/me/profilePUT /api/auth/me/preferencesGET /api/auth/me/permissionsGET /api/auth/me/menusPOST /api/auth/files/upload-credential用户:
GET /api/usersPOST /api/users/searchPOST /api/users/selectPOST /api/users/exportPOST /api/usersPUT /api/users/:idPUT /api/users/batchDELETE /api/users/:idDELETE /api/users/batch后台管理:
/api/manager/tenants/api/manager/roles/api/manager/permissions/api/manager/menus/api/manager/user-permissions最新管理接口补充:
POST /api/manager/permissions/select-treePUT /api/manager/roles/:id/restorePUT /api/manager/permissions/:id/restorePUT /api/manager/menus/:id/restoreDELETE /api/manager/{roles|permissions|menus}/:id/permanentDELETE /api/manager/{roles|permissions|menus}/batch/permanent系统资源:
/api/system/attachments/api/system/login-logs/api/system/operation-logs/api/system/configs附件支持:
PUT /api/system/attachments/:id/restoreDELETE /api/system/attachments/:id/permanentDELETE /api/system/attachments/batch/permanentAI SDK / assistant-ui(使用项目
{code,message,data}JSON 包装,SSE 不包装):POST /api/chat/completionsPOST /api/chat/sessions/:sessionIdGET /api/chat/sessions/:sessionIdDELETE /api/chat/sessions/:sessionIdPOST /api/chat/sessions/:sessionId/runs/:run_idPOST /api/chat/sessions/:sessionId/runs/:run_id/cancelOpenAI-compatible(返回原生 completion、chunk 和 error body):
POST /api/v1/chat/completionsPOST /api/v1/sessions/:sessionIdGET /api/v1/sessions/:sessionIdDELETE /api/v1/sessions/:sessionIdPOST /api/v1/sessions/:sessionId/runs/:run_idPOST /api/v1/sessions/:sessionId/runs/:run_id/cancel两套路由都使用现有 JWT。外部 session 会映射为
tenant_id:user_id:session_id,响应仍返回原 session ID。事件订阅优先读取Last-Event-IDheader,并从该事件之后继续回放。AI SDK 创建 run 示例:
使用响应中的
run_id订阅 AI SDK SSE:断线后从已收到事件的下一条恢复:
OpenAI-compatible 非流式请求使用
"stream":false,流式请求使用"stream":true:取消会同时写入 Redis 持久标记并通知当前进程;服务重启后会扫描 recoverable run, 从 checkpoint 恢复,未完成的 partial assistant text 不会提交到正式会话历史。
临时设备状态示例接口:
GET /devices/statusesPOST /devices/statusesGET /devices/statuses/:device_idPUT /devices/statuses/:device_idDELETE /devices/statuses/:device_id项目结构
数据库和模型
当前使用 SQLite。数据库路径由
DB_PATH或SQLITE_DSN控制,默认是moonbit_iot.db。服务启动时会通过 morm 自动创建和升级表结构。当前主要表包括:
tenants、users、roles、permissions、menususer_roles、role_permissions、user_permissionsattachments、login_logs、operation_logs、tenant_configsiot_products、iot_devices、iot_metrics、iot_modbusesiot_device_shadows、iot_device_events、iot_device_commandstype是 MoonBit 关键字相关字段,模型里使用tenant_type、permission_type、menu_type,数据库兼容列仍同步type,用于保持稳定的 数据库列与 API 字段约定。API 响应统一使用 snake_case。为兼容现有前端,部分请求仍同时接受 camelCase, 例如
parentId、permissionIds、contentType;响应不会返回这些 camelCase 别名。当前统一使用以下基础审计字段:
已经移除旧的
deleted、deleted_by。附件统一使用created_by;IoT 产品不再 包含device_count;设备命令使用device_id、command_code、params、cron、status。角色、权限、菜单、附件等软删除资源遵循:
DELETE写入deleted_at,正常查询不再返回。PUT /:id/restore清空deleted_at。DELETE /:id/permanent只永久删除已经软删除的数据。内置角色、权限和菜单禁止普通删除及永久删除。权限和菜单删除会作用于整棵子树; 软删除期间保留授权关系,恢复后原授权仍然生效。
代码生成器
代码生成器配置在
db_gen。详细用法见:常用命令:
注意:生成器会覆盖目标 model 和 mapper 接口文件。手写逻辑应放在 helper、 service、handler、repository 聚合层,不要写进生成文件。
开发检查
提交前建议执行:
目前
operation_logs.method会触发 MoonBit 保留字预警。该字段属于现有数据库 和 JSON 公共契约,不建议在没有完整字段升级方案时改名。