mirror of
https://github.com/KwiTsukasa/kt-template-online-api.git
synced 2026-05-27 15:44:54 +08:00
6.8 KiB
6.8 KiB
KT Template Online API
kt-template-online-api 是 KT Template Online 的后端服务,负责组件模板、数据库字典、MinIO 文件和 WordPress 内容管理能力。前台列表和 Playground 保存都通过本服务完成数据读写。
技术栈
- Node.js + TypeScript
- NestJS 9
- TypeORM + MySQL
- MinIO
- Swagger / Knife4j
- pnpm
功能模块
| 模块 | 说明 |
|---|---|
component |
Admin 下受保护的组件/图表模板列表、详情、新增、编辑、逻辑删除,数据表为 admin_component |
dict |
基于新 admin_dict 表的字典查询,维护组件一级类型和二级类型关系 |
admin |
Vben Admin 真实接口,包含登录、用户、菜单、角色、部门、时区、上传和示例表格 |
minio |
Bucket 检查/创建、文件上传、列表、临时访问地址、下载和删除 |
wordpress |
WordPress 文章、标签、分类管理接口,复用客户端 WordPress 登录态访问 REST API |
common |
响应注解、字典翻译、POST */save 请求体规范化等通用能力 |
目录结构
src
common/ # 通用装饰器、拦截器、服务、Swagger 封装
admin/ # Vben Admin 后台认证、组件、字典、菜单、角色、部门等接口
minio/ # MinIO 文件模块
wordpress/ # WordPress REST API 文章、标签、分类代理模块
types/ # 全局类型声明
app.module.ts # 全局模块、数据库、MinIO、拦截器注册
main.ts # Swagger、Knife4j、端口启动入口
环境变量
项目按 NODE_ENV 读取 .env.${NODE_ENV},未指定时默认读取 .env.development。仓库只提交 .env.example,真实 .env.development 和 .env.production 保留在本地。
DB_HOST=localhost
DB_PORT=3306
DB_USERNAME=root
DB_PASSWORD=
DB_DATABASE=shy_template
DB_SYNC=true
MINIO_ENDPOINT=localhost
MINIO_PORT=9000
MINIO_ACCESS_KEY=minioadmin
MINIO_SECRET_KEY=minioadmin
MINIO_BUCKET=kt-template-online
WORDPRESS_BASE_URL=http://localhost
WORDPRESS_ADMIN_USERNAME=admin
WORDPRESS_ADMIN_PASSWORD=
WORDPRESS_TIMEOUT_MS=15000
WORDPRESS_LOGIN_TIMEOUT_MS=3000
WORDPRESS_AVAILABILITY_TTL_MS=60000
ADMIN_TOKEN_SECRET=change-me
ADMIN_COOKIE_SECURE=false
SNOWFLAKE_WORKER_ID=1
SNOWFLAKE_DATACENTER_ID=1
DB_SYNC=true 会让 TypeORM 根据实体同步表结构。生产环境建议关闭同步,改用迁移脚本维护表结构。
内网 HTTP 访问时保持 ADMIN_COOKIE_SECURE=false;如果未来切到 HTTPS 域名,再改为 true。
启动
pnpm install
pnpm start:dev
服务默认监听 48085。
常用命令:
pnpm start # 普通启动
pnpm start:prod # 按 production 环境运行已构建的 dist/main
pnpm run build # Nest 构建
pnpm run lint # ESLint 检查
pnpm test # 单元测试
pnpm test:e2e # e2e 测试
接口文档
- Swagger UI:
http://localhost:48085/api - OpenAPI JSON:
http://localhost:48085/api-json - 根路径
/会重定向到 Swagger 文档 - 接口细节见 API.md
除文件下载接口外,业务接口统一返回:
{
"code": 200,
"msg": "操作成功",
"data": {}
}
核心规则
admin_component表保存组件/图表模板,admin_dict表是统一字典翻译数据源,Component.typeMsg和Component.componentTypeMsg查询后自动映射;旧/dict/*接口路径保持兼容。- 业务主键统一由 Snowflake 生成数字 ID,数据库使用
BIGINT,接口按字符串返回以避免前端长整型精度问题。 - 如果基础后台菜单的
meta被旧数据覆盖为空,执行sql/fix-admin-menu-meta.sql可以恢复初始化菜单的title/icon/order等元数据。 - 旧
component表迁移到admin_component时,执行sql/migrate-component-to-admin-component.sql,脚本会把旧表重命名为备份表。 - 如果旧版本曾写入
admin_user.id=0,先执行sql/fix-admin-user-zero-id.sql修复脏数据,再重启服务。 - Admin、Component、Dict 与 MinIO 业务接口统一走
JwtAuthGuard;登录、刷新 token、退出登录和部分示例状态测试接口通过@Public()放行。 - WordPress 管理接口同样先走本系统
JwtAuthGuard,再透传客户端 WordPress 登录态访问 WordPress REST API;当前 WordPress 只有单管理员账号且不开放注册,账号配置放在 env 中,但不作为 BasicAuth 发送。 - Admin 前端只调用现有
/auth/login;后端会在登录流程里自动尝试登录 WordPress,把 WordPress cookie 写入本系统 httpOnly cookie,前端只持久化 REST nonce 和用户信息。WordPress 远程不可用时不会阻塞 Admin 主登录,后端会返回wordpressAuth=null并在菜单和按钮权限接口中过滤博客管理相关入口。 - WordPress 客户端登录态优先通过
X-WordPress-Authorization透传,也支持X-WP-Nonce加 WordPress 登录 cookie 的 REST cookie 认证。 - 如果 WordPress 服务器未开启 rewrite 导致
/wp-json/*返回 404,后端会自动回退到?rest_route=/...形式继续访问 REST API。 kt-template-admin登录会写入 access token 与刷新 token cookie,kt-template-online-web和kt-template-online-playground可在回跳后通过刷新 token 重新持久化登录态。kt-template-admin开发环境通过/api代理到本服务48085,已关闭 Vben Nitro Mock。POST /component/save新增组件,POST /component/update编辑组件。- 全局
SaveBodyInterceptor会删除POST */save请求体里的id,避免新增接口误用前端主键。 - 如个别
save接口必须保留id,在 Controller 方法上使用@SkipSaveBodyNormalize()。 - MinIO 上传接口返回的
url会被 Playground 写入组件image字段。
联调关系
kt-template-online-web读取/component/list、/component/detail、/dict/*展示组件列表,并生成 Playground 跳转链接;业务接口返回401时跳转到kt-template-admin登录。kt-template-online-playground读取/dict/*初始化分类,保存时上传截图到/minio/upload,再调用/component/save或/component/update;业务接口返回401时跳转到kt-template-admin登录并在回跳后刷新 token。- 前端项目通过 Vite 代理把
/api转发到http://localhost:48085/。
轻量验证
文档或小范围后端改动优先跑轻量命令:
pnpm run lint
pnpm test
完整构建只在发布前或改动影响构建链路时执行:
pnpm run build