feat: add docs pages

This commit is contained in:
Your Name
2025-11-18 18:29:15 +08:00
parent 953f744846
commit 1b00ed8bb9
22 changed files with 4547 additions and 0 deletions
+4
View File
@@ -0,0 +1,4 @@
node_modules
.vitepress/dist
.vitepress/cache
.DS_Store
+104
View File
@@ -0,0 +1,104 @@
import { defineConfig } from 'vitepress'
export default defineConfig({
title: "Message Nest",
description: "灵活而强大的消息推送整合平台",
lang: 'zh-CN',
// 如果部署到 GitHub Pages 的子路径,需要设置 base
// 例如:https://engigu.github.io/Message-Push-Nest/
// base: '/Message-Push-Nest/',
// 如果使用自定义域名或部署到根路径,注释掉 base 或设置为 '/'
base: '/Message-Push-Nest/',
themeConfig: {
logo: '/logo.svg',
nav: [
{ text: '首页', link: '/' },
{ text: '指南', link: '/guide/introduction' },
{ text: '部署', link: '/deployment/overview' },
{ text: 'API', link: '/api/usage' },
{ text: '演示站点', link: 'https://message-nest-demo-site.qwapi.eu.org/' }
],
sidebar: {
'/guide/': [
{
text: '开始',
items: [
{ text: '介绍', link: '/guide/introduction' },
{ text: '特色功能', link: '/guide/features' },
{ text: '更新日志', link: '/guide/changelog' }
]
},
{
text: '配置',
items: [
{ text: '配置说明', link: '/guide/configuration' },
{ text: 'EmbedHtml说明', link: '/guide/embed-html' }
]
},
// {
// text: '文档部署',
// items: [
// { text: '部署到 GitHub Pages', link: '/guide/deploy-to-github-pages' }
// ]
// }
],
'/deployment/': [
{
text: '部署方式',
items: [
{ text: '部署概览', link: '/deployment/overview' },
{ text: '直接运行', link: '/deployment/direct-run' },
{ text: '开发调试', link: '/deployment/development' },
{ text: 'Docker部署', link: '/deployment/docker' },
{ text: 'Docker Compose', link: '/deployment/docker-compose' }
]
}
],
'/api/': [
{
text: 'API文档',
items: [
{ text: '使用说明', link: '/api/usage' },
{ text: '调用示例', link: '/api/examples' }
]
}
]
},
socialLinks: [
{ icon: 'github', link: 'https://github.com/engigu/Message-Push-Nest' }
],
footer: {
message: 'Released under the MIT License.',
copyright: 'Copyright © 2024-present Message Nest'
},
search: {
provider: 'local'
},
outline: {
level: [2, 3],
label: '目录'
},
docFooter: {
prev: '上一页',
next: '下一页'
},
lastUpdated: {
text: '最后更新于',
formatOptions: {
dateStyle: 'short',
timeStyle: 'short'
}
}
}
})
+49
View File
@@ -0,0 +1,49 @@
# Message Nest 文档站点
这是 Message Nest 项目的 VitePress 文档站点。
## 本地开发
```bash
# 安装依赖
npm install
# 启动开发服务器
npm run docs:dev
# 构建文档
npm run docs:build
# 预览构建结果
npm run docs:preview
```
## 文档结构
```
docs/
├── .vitepress/ # VitePress 配置
│ └── config.mts # 站点配置文件
├── guide/ # 指南
│ ├── introduction.md # 介绍
│ ├── features.md # 特色功能
│ ├── changelog.md # 更新日志
│ ├── configuration.md # 配置说明
│ └── embed-html.md # EmbedHtml说明
├── deployment/ # 部署
│ ├── overview.md # 部署概览
│ ├── direct-run.md # 直接运行
│ ├── development.md # 开发调试
│ ├── docker.md # Docker部署
│ └── docker-compose.md # Docker Compose
├── api/ # API文档
│ ├── usage.md # 使用说明
│ └── examples.md # 调用示例
├── public/ # 静态资源
│ └── logo.svg # Logo
└── index.md # 首页
```
## 访问地址
开发服务器启动后,默认访问地址为:`http://localhost:5173`
+133
View File
@@ -0,0 +1,133 @@
# VitePress 文档站点设置完成
## 已完成的工作
✅ 创建了完整的 VitePress 文档站点结构
✅ 根据 README.md 拆分内容到多个文档页面
✅ 配置了导航和侧边栏
✅ 安装了所有必要的依赖
✅ 创建了美观的首页
## 文档结构
```
docs/
├── .vitepress/
│ └── config.mts # VitePress 配置文件
├── guide/ # 指南部分
│ ├── introduction.md # 项目介绍
│ ├── features.md # 特色功能
│ ├── changelog.md # 更新日志
│ ├── configuration.md # 完整配置说明
│ └── embed-html.md # EmbedHtml 配置详解
├── deployment/ # 部署部分
│ ├── overview.md # 部署概览
│ ├── direct-run.md # 直接运行 Release
│ ├── development.md # 开发调试模式
│ ├── docker.md # Docker 部署
│ └── docker-compose.md # Docker Compose 部署
├── api/ # API 文档
│ ├── usage.md # API 使用说明
│ └── examples.md # 多语言调用示例
├── public/
│ └── logo.svg # 站点 Logo
├── index.md # 首页
├── package.json # 项目配置
└── README.md # 文档说明
```
## 快速开始
### 启动开发服务器
```bash
cd docs
npm run docs:dev
```
访问:http://localhost:5173
### 构建生产版本
```bash
cd docs
npm run docs:build
```
构建产物在 `docs/.vitepress/dist` 目录
### 预览构建结果
```bash
cd docs
npm run docs:preview
```
## 文档内容
### 指南部分
- **介绍** - 项目背景、演示站点、效果图
- **特色功能** - 核心特性、支持的推送方式、其他功能
- **更新日志** - 完整的功能更新历史
- **配置说明** - 详细的配置文件说明和示例
- **EmbedHtml说明** - 单应用模式和前后端分离模式的详细说明
### 部署部分
- **部署概览** - 各种部署方式对比和快速选择指南
- **直接运行** - 使用 Release 可执行文件部署
- **开发调试** - 本地开发环境搭建
- **Docker部署** - 两种 Docker 部署方式(配置文件和环境变量)
- **Docker Compose** - 完整的编排部署方案
### API 文档
- **使用说明** - API 接口说明、参数、响应格式
- **调用示例** - 提供 CURL、Python、Go、Java、Node.js、PHP、C#、Ruby 等多种语言的示例
## 主要特性
1. **美观的首页** - 使用 VitePress 的 home layout,展示项目特色
2. **清晰的导航** - 顶部导航和侧边栏导航
3. **搜索功能** - 内置本地搜索
4. **响应式设计** - 支持移动端访问
5. **中文优化** - 所有界面文字都已本地化
6. **代码高亮** - 支持多种编程语言的代码高亮
7. **自动目录** - 每个页面自动生成目录
## 下一步建议
1. 可以在 `docs/public/` 目录添加更多图片和资源
2. 可以在配置文件中自定义主题颜色
3. 可以添加更多的文档页面
4. 可以配置 GitHub Pages 或其他静态站点托管服务进行部署
## 部署到生产环境
### GitHub Pages
1.`.vitepress/config.mts` 中设置 `base`:
```ts
export default defineConfig({
base: '/Message-Push-Nest/',
// ...
})
```
2. 构建并部署:
```bash
npm run docs:build
# 将 .vitepress/dist 目录部署到 GitHub Pages
```
### Vercel / Netlify
直接连接 GitHub 仓库,设置:
- Build Command: `npm run docs:build`
- Output Directory: `docs/.vitepress/dist`
## 注意事项
- 文档内容已根据 README.md 进行了合理拆分
- 保留了所有原始信息和代码示例
- 添加了更好的组织结构和导航
- 使用了 VitePress 的特性(如提示框、代码块等)
+305
View File
@@ -0,0 +1,305 @@
# 调用示例
本页面提供各种编程语言的API调用示例。
## CURL
```bash
curl -X POST --location 'http://127.0.0.1:8000/api/v1/message/send' \
--header 'Content-Type: application/json' \
--data '{
"token": "a3541c2f0d3e1b4a5c6d7e8f9a0b1c2d3e",
"title": "message title",
"text": "Hello World!"
}'
```
## Python
```python
import requests
headers = {
'Content-Type': 'application/json',
}
json_data = {
"token": "a3541c2f0d3e1b4a5c6d7e8f9a0b1c2d3e",
"title": "message title",
"text": "Hello World!"
}
response = requests.post(
'http://127.0.0.1:8000/api/v1/message/send',
headers=headers,
json=json_data
)
print("response:", response.json())
```
### 使用 requests 库
首先安装依赖:
```bash
pip install requests
```
## Go
```go
package main
import (
"fmt"
"io"
"log"
"net/http"
"strings"
)
func main() {
client := &http.Client{}
var data = strings.NewReader(`{
"token": "a3541c2f0d3e1b4a5c6d7e8f9a0b1c2d3e",
"title": "message title",
"text": "Hello World!"
}`)
req, err := http.NewRequest("POST", "http://127.0.0.1:8000/api/v1/message/send", data)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Content-Type", "application/json")
resp, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
bodyText, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s\n", bodyText)
}
```
## Java
```java
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpRequest.BodyPublishers;
import java.net.http.HttpResponse;
public class MessageNestExample {
public static void main(String[] args) throws IOException, InterruptedException {
HttpClient client = HttpClient.newBuilder()
.followRedirects(HttpClient.Redirect.NORMAL)
.build();
String jsonData = """
{
"token": "a3541c2f0d3e1b4a5c6d7e8f9a0b1c2d3e",
"title": "message title",
"text": "Hello World!"
}
""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("http://127.0.0.1:8000/api/v1/message/send"))
.POST(BodyPublishers.ofString(jsonData))
.setHeader("Content-Type", "application/json")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}
```
## Node.js
### 使用 request 库
```javascript
var request = require('request');
var headers = {
'Content-Type': 'application/json'
};
var dataString = JSON.stringify({
"token": "a3541c2f0d3e1b4a5c6d7e8f9a0b1c2d3e",
"title": "message title",
"text": "Hello World!"
});
var options = {
url: 'http://127.0.0.1:8000/api/v1/message/send',
method: 'POST',
headers: headers,
body: dataString
};
function callback(error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body);
}
}
request(options, callback);
```
### 使用 axios 库
```javascript
const axios = require('axios');
const data = {
token: "a3541c2f0d3e1b4a5c6d7e8f9a0b1c2d3e",
title: "message title",
text: "Hello World!"
};
axios.post('http://127.0.0.1:8000/api/v1/message/send', data, {
headers: {
'Content-Type': 'application/json'
}
})
.then(response => {
console.log('response:', response.data);
})
.catch(error => {
console.error('error:', error);
});
```
### 使用 fetch (Node.js 18+)
```javascript
const data = {
token: "a3541c2f0d3e1b4a5c6d7e8f9a0b1c2d3e",
title: "message title",
text: "Hello World!"
};
fetch('http://127.0.0.1:8000/api/v1/message/send', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => {
console.log('response:', data);
})
.catch(error => {
console.error('error:', error);
});
```
## PHP
```php
<?php
$ch = curl_init();
$data = array(
"token" => "a3541c2f0d3e1b4a5c6d7e8f9a0b1c2d3e",
"title" => "message title",
"text" => "Hello World!"
);
curl_setopt($ch, CURLOPT_URL, 'http://127.0.0.1:8000/api/v1/message/send');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$response = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
} else {
echo $response;
}
curl_close($ch);
?>
```
## C#
```csharp
using System;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
using var client = new HttpClient();
var data = new
{
token = "a3541c2f0d3e1b4a5c6d7e8f9a0b1c2d3e",
title = "message title",
text = "Hello World!"
};
var json = JsonSerializer.Serialize(data);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PostAsync(
"http://127.0.0.1:8000/api/v1/message/send",
content
);
var responseString = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseString);
}
}
```
## Ruby
```ruby
require 'net/http'
require 'json'
require 'uri'
uri = URI('http://127.0.0.1:8000/api/v1/message/send')
http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Post.new(uri.path, {
'Content-Type' => 'application/json'
})
request.body = {
token: 'a3541c2f0d3e1b4a5c6d7e8f9a0b1c2d3e',
title: 'message title',
text: 'Hello World!'
}.to_json
response = http.request(request)
puts response.body
```
## 注意事项
::: tip 提示
- 将示例中的 `http://127.0.0.1:8000` 替换为你的实际服务地址
-`a3541c2f0d3e1b4a5c6d7e8f9a0b1c2d3e` 替换为你在管理后台创建的实际 Token
- 建议在生产环境中使用 HTTPS
:::
+106
View File
@@ -0,0 +1,106 @@
# API 使用说明
Message Nest 提供统一的消息推送API接口。
## 接口地址
```
POST /api/v1/message/send
```
## 请求参数
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| token | string | 是 | 推送令牌,在管理后台查看 |
| title | string | 是 | 消息标题 |
| text | string | 是 | 消息内容 |
## 请求示例
```json
{
"token": "a3541c2f0d3e1b4a5c6d7e8f9a0b1c2d3e",
"title": "message title",
"text": "Hello World!"
}
```
## 响应格式
### 成功响应
```json
{
"code": 200,
"msg": "success",
"data": {
"status": "sent"
}
}
```
### 失败响应
```json
{
"code": 400,
"msg": "error message",
"data": null
}
```
## 获取 Token
1. 登录 Message Nest 管理后台
2. 进入"发送任务"页面
3. 创建新的发送任务
4. 配置推送渠道(邮件、钉钉、企业微信等)
5. 保存后获得推送令牌(Token
## 支持的推送渠道
- **邮件** - SMTP邮件发送
- **钉钉** - 钉钉机器人
- **企业微信** - 企业微信应用消息
- **微信公众号** - 微信测试公众号模板消息
- **自定义Webhook** - 自定义HTTP请求
- **自托管消息** - 站内消息
## 使用流程
1. **创建推送渠道**
- 在管理后台配置各种推送渠道
- 填写相应的配置信息(如邮箱、Webhook地址等)
2. **创建发送任务**
- 选择要使用的推送渠道
- 可以选择多个渠道同时推送
- 获得唯一的推送令牌(Token
3. **调用API发送消息**
- 使用获得的 Token
- 发送标题和内容
- 消息会自动推送到配置的所有渠道
## 注意事项
::: warning 重要
- Token 是唯一的,请妥善保管
- 消息内容支持纯文本和Markdown格式(取决于推送渠道)
- 建议使用异步方式调用API,避免阻塞主流程
:::
## 错误码说明
| 错误码 | 说明 |
|--------|------|
| 200 | 成功 |
| 400 | 请求参数错误 |
| 401 | 未授权 |
| 404 | Token不存在 |
| 500 | 服务器内部错误 |
## 下一步
查看各语言的 [调用示例](/api/examples)。
View File
+151
View File
@@ -0,0 +1,151 @@
# 开发调试
本文档介绍如何在开发环境中运行 Message Nest。
## 前置要求
- Go 1.18+
- Node.js 16+
- MySQL 5.7+ 或 SQLite
## 部署步骤
### 1. 克隆项目
```bash
git clone https://github.com/engigu/Message-Push-Nest.git
cd Message-Push-Nest
```
### 2. 配置文件
重命名 `conf/app.example.ini``conf/app.ini`,关键配置如下:
```ini
[app]
JwtSecret = message-nest
LogLevel = INFO
[server]
; RunMode务必设置成debug,会自动添加跨域
RunMode = debug
HttpPort = 8000
ReadTimeout = 60
WriteTimeout = 60
; 取消EmbedHtml的注释(启用前后端分离),然后到web目录下面,npm run dev启动前端页面
EmbedHtml = disable
[database]
; 开启SQL打印
SqlDebug = enable
; Type = sqlite
Type = mysql
User = root
Password = Aa123456
Host = vm.server
Port = 3308
Name = yourDbName
TablePrefix = message_
```
::: warning 重要配置
- `RunMode` 必须设置为 `debug`,会自动添加跨域
- `EmbedHtml` 必须取消注释,启用前后端分离
- `SqlDebug` 建议启用,方便调试
:::
### 3. 启动后端服务
```bash
go mod tidy
go run main.go
```
服务启动后会运行在8000端口。
### 4. 启动前端服务
```bash
cd web
npm i
npm run dev
```
页面启动后会提示访问URL,一般是 `http://127.0.0.1:5173`
### 5. 访问应用
访问 `http://127.0.0.1:5173`,进行调试开发。
接口会自动转发到go服务 `http://localhost:8000`
## 开发说明
### 目录结构
```
Message-Push-Nest/
├── conf/ # 配置文件
├── middleware/ # 中间件
├── migrate/ # 数据库迁移
├── models/ # 数据模型
├── pkg/ # 工具包
├── routers/ # 路由
├── service/ # 业务逻辑
├── web/ # 前端项目
│ ├── src/ # 源代码
│ ├── public/ # 静态资源
│ └── dist/ # 构建输出
└── main.go # 入口文件
```
### 前端技术栈
- Vue 3
- TypeScript
- Vite
- TailwindCSS
- shadcn-vue
### 后端技术栈
- Go
- Gin
- GORM
- Logrus
## 构建生产版本
### 构建前端
```bash
cd web
npm run build
```
构建产物会输出到 `web/dist` 目录。
### 构建后端
```bash
CGO_ENABLED=0 go build -o Message-Nest
```
## 常见问题
### 前端无法连接后端
检查 `web/vite.config.ts` 中的代理配置是否正确。
### 热更新不生效
1. 检查文件是否保存
2. 重启前端开发服务器
3. 清除浏览器缓存
### 数据库连接失败
1. 检查数据库服务是否启动
2. 检查配置文件中的连接信息
3. 检查数据库用户权限
+112
View File
@@ -0,0 +1,112 @@
# 直接运行
使用最新的Release打包的可执行文件部署,无需部署前端页面。
::: tip 推荐指数
🍀🍀🍀🍀 适合没有Docker环境的生产部署
:::
## 部署步骤
### 1. 下载Release
访问 [GitHub Releases](https://github.com/engigu/Message-Push-Nest/releases) 下载最新的系统版本对应的release,然后解压。
### 2. 创建数据库
新建一个MySQL数据库(或使用SQLite)。
### 3. 配置文件
重命名 `conf/app.example.ini``conf/app.ini`,然后修改配置:
```ini
[app]
JwtSecret = message-nest
LogLevel = INFO
[server]
RunMode = release
HttpPort = 8000
ReadTimeout = 60
WriteTimeout = 60
; 注释EmbedHtml,启用单应用模式
; EmbedHtml = disable
[database]
; 关闭SQL打印
; SqlDebug = enable
; Type = sqlite
Type = mysql
User = root
Password = Aa123456
Host = vm.server
Port = 3308
Name = yourDbName
TablePrefix = message_
```
::: warning 重要
将配置中 `EmbedHtml = disable` 进行注释,以单应用方式运行。
:::
### 4. 启动项目
直接运行可执行文件,项目会自动创建表和账号。
```bash
# Windows
./Message-Nest.exe
# Linux/Mac
./Message-Nest
```
### 5. 查看日志
INFO日志级别启动会出现如下日志:
```log
[2024-01-13 13:40:09.075] INFO [migrate.go:70 Setup] [Init Data]: Migrate table: message_auth
[2024-01-13 13:40:11.778] INFO [migrate.go:70 Setup] [Init Data]: Migrate table: message_send_tasks
[2024-01-13 13:40:16.518] INFO [migrate.go:70 Setup] [Init Data]: Migrate table: message_send_ways
[2024-01-13 13:40:23.300] INFO [migrate.go:70 Setup] [Init Data]: Migrate table: message_send_tasks_logs
[2024-01-13 13:40:28.715] INFO [migrate.go:70 Setup] [Init Data]: Migrate table: message_send_tasks_ins
[2024-01-13 13:40:39.538] INFO [migrate.go:70 Setup] [Init Data]: Migrate table: message_settings
[2024-01-13 13:40:46.299] INFO [migrate.go:74 Setup] [Init Data]: Init Account data...
[2024-01-13 13:40:46.751] INFO [migrate.go:77 Setup] [Init Data]: All table data init done.
```
### 6. 访问服务
访问 `http://localhost:8000`
- 默认账号:`admin`
- 默认密码:`123456`
## 使用SQLite
如果不想安装MySQL,可以使用SQLite
```ini
[database]
Type = sqlite
TablePrefix = message_
```
SQLite数据库文件会自动创建在 `conf/database.db`
## 常见问题
### 启动失败
1. 检查端口8000是否被占用
2. 检查数据库连接配置是否正确
3. 查看日志输出的错误信息
### 无法访问页面
1. 确认服务已正常启动
2. 检查防火墙设置
3. 确认 `EmbedHtml` 配置已注释
+240
View File
@@ -0,0 +1,240 @@
# Docker Compose 部署
使用 Docker Compose 编排部署 Message Nest。
::: tip 推荐指数
🍀🍀🍀🍀🍀 适合生产环境,便于管理
:::
## 方式一:挂载配置文件
### 1. 准备配置文件
创建 `conf/app.ini`,内容参考 [Docker部署](/deployment/docker#_1-准备配置文件)。
### 2. 创建 docker-compose.yml
```yaml
version: "3.7"
services:
message-nest:
image: engigu/message-nest:latest
# 或使用 GHCR 镜像
# image: ghcr.io/engigu/message-nest:latest
container_name: message-nest
restart: always
volumes:
- ./conf:/app/conf
ports:
- "8000:8000"
```
### 3. 文件目录结构
```
.
├── conf
│ └── app.ini
└── docker-compose.yml
```
### 4. 启动服务
```bash
# 测试运行
docker-compose up
# 正式运行(后台)
docker-compose up -d
```
## 方式二:环境变量(推荐)
### 使用 MySQL
创建 `docker-compose.yml`
```yaml
version: "3.7"
services:
message-nest:
image: engigu/message-nest:latest
# 或使用 GHCR 镜像
# image: ghcr.io/engigu/message-nest:latest
container_name: message-nest
restart: always
ports:
- "8000:8000"
environment:
- MYSQL_HOST=192.168.64.133
- MYSQL_PORT=3308
- MYSQL_USER=root
- MYSQL_PASSWORD=Aa123456
- MYSQL_DB=test_11
- MYSQL_TABLE_PREFIX=message_
```
### 使用 SQLite
创建 `docker-compose.yml`
```yaml
version: "3.7"
services:
message-nest:
image: engigu/message-nest:latest
# 或使用 GHCR 镜像
# image: ghcr.io/engigu/message-nest:latest
container_name: message-nest
restart: always
ports:
- "8000:8000"
volumes:
- ./data/database.db:/app/conf/database.db
```
### 启动服务
```bash
# 正式运行
docker-compose up -d
```
## 完整示例:MySQL + Message Nest
如果你还没有MySQL,可以使用以下配置同时部署MySQL和Message Nest
```yaml
version: "3.7"
services:
mysql:
image: mysql:8.0
container_name: message-nest-mysql
restart: always
environment:
- MYSQL_ROOT_PASSWORD=Aa123456
- MYSQL_DATABASE=message_nest
volumes:
- mysql-data:/var/lib/mysql
ports:
- "3306:3306"
message-nest:
image: engigu/message-nest:latest
container_name: message-nest
restart: always
depends_on:
- mysql
ports:
- "8000:8000"
environment:
- MYSQL_HOST=mysql
- MYSQL_PORT=3306
- MYSQL_USER=root
- MYSQL_PASSWORD=Aa123456
- MYSQL_DB=message_nest
- MYSQL_TABLE_PREFIX=message_
volumes:
mysql-data:
```
## 常用命令
### 启动服务
```bash
# 前台启动(查看日志)
docker-compose up
# 后台启动
docker-compose up -d
```
### 查看日志
```bash
# 查看所有服务日志
docker-compose logs
# 查看特定服务日志
docker-compose logs message-nest
# 实时查看日志
docker-compose logs -f message-nest
```
### 停止服务
```bash
# 停止服务
docker-compose stop
# 停止并删除容器
docker-compose down
# 停止并删除容器和数据卷
docker-compose down -v
```
### 重启服务
```bash
# 重启所有服务
docker-compose restart
# 重启特定服务
docker-compose restart message-nest
```
### 更新镜像
```bash
# 拉取最新镜像
docker-compose pull
# 重新创建容器
docker-compose up -d
```
## 访问服务
启动后访问 `http://localhost:8000`
- 默认账号:`admin`
- 默认密码:`123456`
## 常见问题
### 服务无法启动
1. 检查端口是否被占用
2. 检查配置是否正确
3. 查看日志:`docker-compose logs`
### MySQL连接失败
1. 确保MySQL服务已启动
2. 检查 `MYSQL_HOST` 是否正确(使用服务名)
3. 等待MySQL完全启动(约10-30秒)
### 数据持久化
使用volumes确保数据持久化:
```yaml
volumes:
- ./data:/app/conf # 配置文件
- mysql-data:/var/lib/mysql # MySQL数据
```
### 修改配置后重启
```bash
# 修改配置文件或环境变量后
docker-compose down
docker-compose up -d
```
+201
View File
@@ -0,0 +1,201 @@
# Docker 部署
使用 Docker 部署 Message Nest,支持多种配置方式。
::: tip 推荐指数
🍀🍀🍀🍀🍀 最推荐的部署方式
:::
## 镜像源
Message Nest 提供两个镜像源:
- **Docker Hub**: `engigu/message-nest:latest`
- **GitHub Container Registry**: `ghcr.io/engigu/message-nest:latest`
## 方式一:挂载配置文件
### 1. 准备配置文件
新建 `conf/app.ini` 文件:
```ini
[app]
JwtSecret = message-nest
LogLevel = INFO
[server]
RunMode = release
; docker模式下端口配置文件中只能为8000
HttpPort = 8000
ReadTimeout = 60
WriteTimeout = 60
; 注释EmbedHtml,启用单应用模式
; EmbedHtml = disable
[database]
; 关闭SQL打印
; SqlDebug = enable
; Type = sqlite
Type = mysql
User = root
Password = Aa123456
Host = vm.server
Port = 3308
Name = yourDbName
TablePrefix = message_
```
::: warning 端口限制
Docker模式下,配置文件中的端口只能为8000,通过 `-p` 参数映射到宿主机端口。
:::
### 2. 拉取镜像
```bash
# 从 Docker Hub 拉取
docker pull engigu/message-nest:latest
# 或从 GitHub Container Registry (GHCR) 拉取
docker pull ghcr.io/engigu/message-nest:latest
```
### 3. 启动容器
```bash
# 测试运行(Docker Hub 镜像)
docker run --rm -ti \
-p 8000:8000 \
-v /your/path/conf:/app/conf \
engigu/message-nest:latest
# 测试运行(GHCR 镜像)
docker run --rm -ti \
-p 8000:8000 \
-v /your/path/conf:/app/conf \
ghcr.io/engigu/message-nest:latest
# 正式运行(Docker Hub 镜像)
docker run -d \
-p 8000:8000 \
-v /your/path/conf:/app/conf \
engigu/message-nest:latest
# 正式运行(GHCR 镜像)
docker run -d \
-p 8000:8000 \
-v /your/path/conf:/app/conf \
ghcr.io/engigu/message-nest:latest
```
## 方式二:环境变量(推荐)
::: tip 推荐
这是最简单的部署方式,无需准备配置文件。
:::
### 环境变量说明
| 变量 | 说明 |
|------|------|
| JWT_SECRET | jwt秘钥,可选,默认为message-nest |
| LOG_LEVEL | 日志等级,可选,默认为INFODEBUG/INFO/ERROR |
| RUN_MODE | 运行模式,可选,默认release,为debug将自动添加跨域 |
| DB_TYPE | 数据库类型,sqlite/mysql。默认为sqlite,存储路径为conf/database.db |
| MYSQL_HOST | mysql-hostDB_TYPE=mysql必填 |
| MYSQL_PORT | mysql端口,DB_TYPE=mysql必填 |
| MYSQL_USER | mysql用户名,DB_TYPE=mysql必填 |
| MYSQL_PASSWORD | mysql数据库密码,DB_TYPE=mysql必填 |
| MYSQL_DB | mysql数据库名字,DB_TYPE=mysql必填 |
| MYSQL_TABLE_PREFIX | mysql数据表前缀,DB_TYPE=mysql必填 |
| SSL | 是否开启SSL |
| SQL_DEBUG | 是否打印SQL,可选,默认关,设置enable为开启 |
### 使用 MySQL
```bash
# 正式运行(mysql
docker run -d \
-p 8000:8000 \
-e MYSQL_HOST=192.168.64.133 \
-e MYSQL_PORT=3308 \
-e MYSQL_USER=root \
-e MYSQL_PASSWORD=Aa123456 \
-e MYSQL_DB=test_11 \
-e MYSQL_TABLE_PREFIX=message_ \
--name message-nest \
engigu/message-nest:latest
# 或使用 GHCR 镜像(mysql
docker run -d \
-p 8000:8000 \
-e MYSQL_HOST=192.168.64.133 \
-e MYSQL_PORT=3308 \
-e MYSQL_USER=root \
-e MYSQL_PASSWORD=Aa123456 \
-e MYSQL_DB=test_11 \
-e MYSQL_TABLE_PREFIX=message_ \
--name message-nest \
ghcr.io/engigu/message-nest:latest
```
### 使用 SQLite
```bash
# 正式运行(sqlite
docker run -d \
-p 8000:8000 \
-v /your/path/database.db:/app/conf/database.db \
--name message-nest \
engigu/message-nest:latest
# 或使用 GHCR 镜像(sqlite
docker run -d \
-p 8000:8000 \
-v /your/path/database.db:/app/conf/database.db \
--name message-nest \
ghcr.io/engigu/message-nest:latest
```
## 访问服务
启动后访问 `http://localhost:8000`
- 默认账号:`admin`
- 默认密码:`123456`
## 常见问题
### 容器无法启动
1. 检查端口是否被占用
2. 检查数据库连接配置
3. 查看容器日志:`docker logs message-nest`
### 数据持久化
使用SQLite时,记得挂载数据库文件:
```bash
-v /your/path/database.db:/app/conf/database.db
```
### 查看日志
```bash
# 查看实时日志
docker logs -f message-nest
# 查看最近100行日志
docker logs --tail 100 message-nest
```
### 停止和删除容器
```bash
# 停止容器
docker stop message-nest
# 删除容器
docker rm message-nest
```
+53
View File
@@ -0,0 +1,53 @@
# 部署概览
Message Nest 提供多种部署方式,您可以根据自己的需求选择合适的部署方案。
## 部署方式对比
| 部署方式 | 难度 | 推荐指数 | 适用场景 |
|---------|------|---------|---------|
| Docker环境变量 | ⭐ | ⭐⭐⭐⭐⭐ | 生产环境,快速部署 |
| Docker Compose | ⭐ | ⭐⭐⭐⭐⭐ | 生产环境,编排部署 |
| 直接运行Release | ⭐⭐ | ⭐⭐⭐⭐ | 生产环境,无Docker环境 |
| 开发调试 | ⭐⭐⭐ | ⭐⭐⭐ | 开发环境 |
## 快速选择
### 我想快速体验
推荐使用 **Docker环境变量部署**,一条命令即可启动。
### 我要用于生产环境
推荐使用 **Docker Compose部署**,便于管理和维护。
### 我没有Docker环境
推荐使用 **直接运行Release**,下载可执行文件即可。
### 我要进行开发
推荐使用 **开发调试模式**,支持热更新。
## 默认账号
所有部署方式启动后,默认账号信息:
- 用户名:`admin`
- 密码:`123456`
::: warning 安全提示
首次登录后请立即修改默认密码!
:::
## 数据库选择
Message Nest 支持多种数据库:
- **SQLite** - 轻量级,无需额外配置,适合小规模使用
- **MySQL 5.x / 8.x** - 成熟稳定,适合中大规模使用
- **TiDB** - 分布式数据库,适合大规模使用
## 下一步
选择适合您的部署方式:
- [直接运行](/deployment/direct-run)
- [开发调试](/deployment/development)
- [Docker部署](/deployment/docker)
- [Docker Compose](/deployment/docker-compose)
+64
View File
@@ -0,0 +1,64 @@
# 更新日志
## 2025
### 2025.10.12
- 增加cookies过期天数设置
### 2025.09.30
- 支持页面的明暗主题切换设置
- 增加登录日志
### 2025.09.14
- 支持系统信息展示更多的运行信息
### 2025.08.10
- **重大升级,重构web页面,样式更加美观友好**
- UI组件使用shadcn-vue,基于tailwindcss
- 现在支持大中小屏自适应
### 2025.04.28
- 支持tidb作为存储
- 支持数据库ssl配置
- docker运行指定环境变量SSL=true
- ini配置文件运行指定数据库连接参数Ssl=true
### 2025.01.01
- 支持自托管消息,现在可以将站点作为消息的接受,登录站点查看消息
## 2024
### 2024.04.29
- 支持 SQLite 部署
- 支持MySQL 5.x / 8.x
### 2024.04.11
- 支持自定义的定时消息发送
### 2024.03.05
- 支持微信测试公众号模板消息发送
### 2024.01.28
- 支持 Docker 部署,从环境变量启动服务
### 2024.01.24
- 支持数据统计展示
### 2024.01.20
- 添加日志查看自动刷新
### 2024.01.07
- 支持站点信息自定义
### 2024.01.03
- 支持企业微信
- 单应用打包,直接运行,无需部署前端页面
- 支持邮件发送
- 用户密码设置
- 支持用户定时任务清理,更新定时时间
- 查看定时清理日志
- 单应用的 HTML 浏览器自动缓存
- Gin 的日志使用 Logrus
- 支持异步发送
- 支持钉钉
- 支持自定义的 Webhook 消息发送
+170
View File
@@ -0,0 +1,170 @@
# 配置说明
## 完整配置文件
```ini
[app]
JwtSecret = message-nest
; 暂时无用
RuntimeRootPath = runtime/
LogLevel = INFO
[server]
; debug or release
; debug模式下会自动添加跨域headers
RunMode = release
HttpPort = 8000
ReadTimeout = 60
WriteTimeout = 60
; use embed html static file
; 是否使用embed打包的静态资源
; 如果运行release打包后的应用,请注释这个设置。
; 如果取消这个注释,只会单独运行api服务,前端页面需要到web目录手动npm run dev, 运行前端服务
; EmbedHtml = disable
[database]
; 配置使用什么数据库,支持:mysql、sqlite、tidb
Type = mysql
User = root
Password = password
Host = 123.1.1.1
Name = db_name
Port = 3306
; -- 其他配置
; 表前缀
TablePrefix = message_
; -- 是否打开sql打印
; SqlDebug = enable
; 数据库连接是否开启ssl, value: [false | true]
Ssl = true
```
## 配置项说明
### [app] 应用配置
| 配置项 | 说明 | 默认值 |
|--------|------|--------|
| JwtSecret | JWT密钥,用于token生成 | message-nest |
| RuntimeRootPath | 运行时根路径(暂时无用) | runtime/ |
| LogLevel | 日志级别:DEBUG/INFO/ERROR | INFO |
### [server] 服务器配置
| 配置项 | 说明 | 默认值 |
|--------|------|--------|
| RunMode | 运行模式:debug/releasedebug模式会自动添加跨域 | release |
| HttpPort | HTTP服务端口 | 8000 |
| ReadTimeout | 读取超时时间(秒) | 60 |
| WriteTimeout | 写入超时时间(秒) | 60 |
| EmbedHtml | 是否使用embed打包的静态资源,注释则启用单应用模式 | - |
### [database] 数据库配置
| 配置项 | 说明 | 默认值 |
|--------|------|--------|
| Type | 数据库类型:mysql/sqlite/tidb | mysql |
| User | 数据库用户名 | - |
| Password | 数据库密码 | - |
| Host | 数据库主机地址 | - |
| Port | 数据库端口 | 3306 |
| Name | 数据库名称 | - |
| TablePrefix | 数据表前缀 | message_ |
| SqlDebug | 是否打印SQL,设置enable开启 | - |
| Ssl | 数据库连接是否开启SSL | false |
## Docker 环境变量
使用Docker部署时,可以通过环境变量进行配置:
| 变量 | 说明 |
|------|------|
| JWT_SECRET | jwt秘钥,可选,默认为message-nest |
| LOG_LEVEL | 日志等级,可选,默认为INFODEBUG/INFO/ERROR |
| RUN_MODE | 运行模式,可选,默认release,为debug将自动添加跨域 |
| DB_TYPE | 数据库类型,sqlite/mysql。默认为sqlite,存储路径为conf/database.db |
| MYSQL_HOST | mysql-hostDB_TYPE=mysql必填 |
| MYSQL_PORT | mysql端口,DB_TYPE=mysql必填 |
| MYSQL_USER | mysql用户名,DB_TYPE=mysql必填 |
| MYSQL_PASSWORD | mysql数据库密码,DB_TYPE=mysql必填 |
| MYSQL_DB | mysql数据库名字,DB_TYPE=mysql必填 |
| MYSQL_TABLE_PREFIX | mysql数据表前缀,DB_TYPE=mysql必填 |
| SSL | 是否开启SSL |
| SQL_DEBUG | 是否打印SQL,可选,默认关,设置enable为开启 |
## 配置示例
### 单应用模式(推荐)
```ini
[app]
JwtSecret = message-nest
LogLevel = INFO
[server]
RunMode = release
HttpPort = 8000
ReadTimeout = 60
WriteTimeout = 60
; 注释EmbedHtml,启用单应用模式
; EmbedHtml = disable
[database]
; 关闭SQL打印
; SqlDebug = enable
Type = mysql
User = root
Password = Aa123456
Host = vm.server
Port = 3308
Name = yourDbName
TablePrefix = message_
```
### 开发调试模式
```ini
[app]
JwtSecret = message-nest
LogLevel = INFO
[server]
; RunMode务必设置成debug,会自动添加跨域
RunMode = debug
HttpPort = 8000
ReadTimeout = 60
WriteTimeout = 60
; 取消EmbedHtml的注释(启用前后端分离),然后到web目录下面,npm run dev启动前端页面
EmbedHtml = disable
[database]
; 开启SQL打印
SqlDebug = enable
Type = mysql
User = root
Password = Aa123456
Host = vm.server
Port = 3308
Name = yourDbName
TablePrefix = message_
```
### SQLite 配置
```ini
[app]
JwtSecret = message-nest
LogLevel = INFO
[server]
RunMode = release
HttpPort = 8000
ReadTimeout = 60
WriteTimeout = 60
[database]
Type = sqlite
TablePrefix = message_
```
+98
View File
@@ -0,0 +1,98 @@
# EmbedHtml 配置说明
## 什么是 EmbedHtml
这个配置可以理解为单应用模式(或者前后端分离)的开关。
## 配置方式
### 方式一:单应用模式(推荐)
**注释 EmbedHtml 配置**
```ini
[server]
RunMode = release
HttpPort = 8000
ReadTimeout = 60
WriteTimeout = 60
; 注释EmbedHtml,启用单应用模式
; EmbedHtml = disable
```
**说明:**
- 启动go服务,会把web/dist目录下文件作为前端静态资源
- 如果目录下没有静态资源文件,需要到web目录下,执行 `npm run build` 构建生成
- 只需要运行一个服务即可访问完整功能
- 适合生产环境部署
**适用场景:**
- 使用 Release 打包的可执行文件
- Docker 部署
- 生产环境
### 方式二:前后端分离模式
**启用 EmbedHtml 配置**
```ini
[server]
RunMode = debug
HttpPort = 8000
ReadTimeout = 60
WriteTimeout = 60
; 取消注释,启用前后端分离
EmbedHtml = disable
```
**说明:**
- go服务启动时只会有API服务
- 需要到web目录下,执行 `npm run dev` 启动前端项目
- 访问前端项目提示的端口服务,一般是 `http://127.0.0.1:5173`
- 或者使用 `npm run build`,用Nginx部署前端
**适用场景:**
- 开发调试
- 需要修改前端代码
- 前后端独立部署
## 两种方式对比
| 特性 | 单应用模式 | 前后端分离模式 |
|------|-----------|--------------|
| 部署复杂度 | 简单,只需一个服务 | 复杂,需要两个服务 |
| 开发调试 | 不便,需要重新构建 | 方便,支持热更新 |
| 资源占用 | 较少 | 较多 |
| 适用环境 | 生产环境 | 开发环境 |
| 推荐指数 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
## 推荐方案
综合考虑下来,推荐直接使用以下方式:
1. **Release 打包执行文件** - 已内置页面静态资源,开箱即用
2. **Docker 环境变量部署** - 配置简单,一键启动
这两种方式都是单应用模式,只需运行一个服务即可。
## 常见问题
### Q: 为什么访问页面显示404?
A: 检查以下几点:
1. 如果是单应用模式,确保 `EmbedHtml` 已注释
2. 确保 `web/dist` 目录下有静态资源文件
3. 如果没有,执行 `cd web && npm run build` 构建
### Q: 开发时如何快速调试?
A:
1. 设置 `RunMode = debug`
2. 启用 `EmbedHtml = disable`
3. 启动后端:`go run main.go`
4. 启动前端:`cd web && npm run dev`
5. 访问前端提示的URL(通常是 http://127.0.0.1:5173
### Q: Docker 部署需要配置 EmbedHtml 吗?
A: 不需要。Docker 镜像已经内置了前端静态资源,默认就是单应用模式。
+77
View File
@@ -0,0 +1,77 @@
# 特色功能
## 核心特性
### 🔄 整合性
提供了多种消息推送方式,包括邮件、钉钉、企业微信等,方便你集中管理和定制通知。
### 🎨 自定义性
可以根据需求定制消息推送策略,满足不同场景的个性化需求。
### 🛠 开放性
易于扩展和集成新的消息通知服务,以适应未来的变化。
## 支持的推送方式
- **邮件发送** - 支持标准SMTP邮件发送
- **钉钉** - 支持钉钉机器人消息推送
- **企业微信** - 支持企业微信应用消息推送
- **微信测试公众号** - 支持微信测试公众号模板消息发送
- **自定义 Webhook** - 支持自定义的Webhook消息发送
- **自托管消息** - 可以将站点作为消息的接收方,登录站点查看消息
## 其他功能
### 定时任务
支持自定义的定时消息发送,可以设置定时推送任务。
### 数据统计
支持数据统计展示,可以查看消息发送情况和历史记录。
### 异步发送
支持异步消息发送,提高系统性能和响应速度。
### 日志管理
- 支持日志查看自动刷新
- 支持查看定时清理日志
- 支持登录日志记录
### 用户管理
- 支持用户密码设置
- 支持用户定时任务清理
- 支持更新定时时间
### 系统信息
- 支持系统信息展示
- 支持站点信息自定义
- 支持明暗主题切换设置
- 支持Cookies过期天数设置
### 数据库支持
- **SQLite** - 轻量级部署,无需额外数据库服务
- **MySQL 5.x / 8.x** - 支持主流MySQL版本
- **TiDB** - 支持分布式数据库TiDB
- 支持数据库SSL配置
### 部署方式
- **单应用打包** - 直接运行,无需部署前端页面
- **Docker 部署** - 支持从环境变量启动服务
- **Docker Compose** - 支持编排部署
- **前后端分离** - 支持独立部署前后端
### 界面特性
- **现代化UI** - 使用shadcn-vue组件,基于TailwindCSS
- **响应式设计** - 支持大中小屏自适应
- **单应用的HTML浏览器自动缓存** - 提高访问速度
+39
View File
@@ -0,0 +1,39 @@
# 介绍
Message Nest(信息巢)是一个灵活而强大的消息推送整合平台,旨在简化并自定义多种消息通知方式。
## 什么是 Message Nest
Message Nest 是一个拥有各种渠道信息方式的集合站点。如果你有很多消息推送方式,每次都需要调用各种接口去发送消息到各个渠道,或者不同的项目你都需要复制同样的发消息代码,这个项目可以帮你管理各种消息方式,并提供统一的发送API接入。
你可以自由组合各种消息渠道,一个API推送到各种渠道,帮你省去接入的繁琐步骤。
## 项目来由
自己常常写一些脚本需要消息推送,经常需要接入不同的消息发送,很不方便,于是就有了这个项目。
## 演示站点
访问 [演示站点](https://message-nest-demo-site.qwapi.eu.org/)(演示站点的服务器比较烂,见谅)
## 效果图
![演示效果](https://raw.githubusercontent.com/engigu/resources/refs/heads/images/CPT2508101507-1460x745.gif)
## 进度
项目还在不断更新中,欢迎大家提出各种建议。
关于日志,考虑到目前多数服务以收集控制台输出为主,暂时不支持写出日志文件。
## 致谢
该项目汲取了 [go-gin-example](https://github.com/eddycjy/go-gin-example) 项目的灵感,展示了 Go 和 Gin 在实际应用中的强大和多才多艺。
## 贡献
欢迎通过提交问题和提出改进建议。
## 许可证
[MIT License](https://github.com/engigu/Message-Push-Nest/blob/main/LICENSE)
+86
View File
@@ -0,0 +1,86 @@
---
layout: home
hero:
name: "Message Nest"
text: "消息推送整合平台"
tagline: 灵活而强大的消息推送整合平台,简化并自定义多种消息通知方式
image:
src: /logo.svg
alt: Message Nest
actions:
- theme: brand
text: 快速开始
link: /guide/introduction
- theme: alt
text: 部署指南
link: /deployment/overview
- theme: alt
text: GitHub
link: https://github.com/engigu/Message-Push-Nest
features:
- icon: 🔄
title: 整合性
details: 提供了多种消息推送方式,包括邮件、钉钉、企业微信等,方便你集中管理和定制通知。
- icon: 🎨
title: 自定义性
details: 可以根据需求定制消息推送策略,满足不同场景的个性化需求。
- icon: 🛠
title: 开放性
details: 易于扩展和集成新的消息通知服务,以适应未来的变化。
- icon: 📧
title: 多渠道支持
details: 支持邮件、钉钉、企业微信、微信测试公众号、自定义Webhook等多种推送方式。
- icon:
title: 定时任务
details: 支持自定义的定时消息发送,满足定时推送需求。
- icon: 🎯
title: 自托管消息
details: 可以将站点作为消息的接收方,登录站点查看消息。
- icon: 🐳
title: Docker支持
details: 支持Docker和Docker Compose部署,快速启动服务。
- icon: 💾
title: 多数据库支持
details: 支持SQLite、MySQL 5.x/8.x、TiDB等多种数据库。
- icon: 📊
title: 数据统计
details: 支持数据统计展示,查看消息发送情况。
---
## 快速开始
### Docker 部署(推荐)
使用环境变量快速启动:
```bash
docker run -d \
-p 8000:8000 \
-e MYSQL_HOST=192.168.64.133 \
-e MYSQL_PORT=3308 \
-e MYSQL_USER=root \
-e MYSQL_PASSWORD=Aa123456 \
-e MYSQL_DB=test_11 \
-e MYSQL_TABLE_PREFIX=message_ \
--name message-nest \
engigu/message-nest:latest
```
### 直接运行
1. 下载最新的 [Release](https://github.com/engigu/Message-Push-Nest/releases)
2. 配置 `conf/app.ini`
3. 启动服务,访问 `http://localhost:8000`
4. 默认账号:`admin`,密码:`123456`
## 项目来由
自己常常写一些脚本需要消息推送,经常需要接入不同的消息发送,很不方便,于是就有了这个项目。
如果你有很多消息推送方式,每次都需要调用各种接口去发送消息到各个渠道,或者不同的项目你都需要复制同样的发消息代码,这个项目可以帮你管理各种消息方式,并提供统一的发送API接入。你可以自由组合各种消息渠道,一个API推送到各种渠道,帮你省去接入的繁琐步骤。
## Star History
[![Star History Chart](https://api.star-history.com/svg?repos=engigu/Message-Push-Nest&type=Date)](https://star-history.com/#engigu/Message-Push-Nest&Date)
+2468
View File
File diff suppressed because it is too large Load Diff
+13
View File
@@ -0,0 +1,13 @@
{
"name": "message-nest-docs",
"version": "1.0.0",
"description": "Message Nest Documentation",
"scripts": {
"docs:dev": "vitepress dev",
"docs:build": "vitepress build",
"docs:preview": "vitepress preview"
},
"devDependencies": {
"vitepress": "^1.0.0"
}
}
+8
View File
@@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="100" height="100">
<circle cx="50" cy="50" r="45" fill="#42b883"/>
<path d="M50 20 L35 40 L50 35 L65 40 Z" fill="white"/>
<ellipse cx="50" cy="55" rx="25" ry="20" fill="white"/>
<circle cx="43" cy="52" r="3" fill="#42b883"/>
<circle cx="57" cy="52" r="3" fill="#42b883"/>
<path d="M40 65 Q50 70 60 65" stroke="#42b883" stroke-width="2" fill="none"/>
</svg>

After

Width:  |  Height:  |  Size: 438 B