# arlog **Repository Path**: cooting/arlog ## Basic Information - **Project Name**: arlog - **Description**: 自用Ai轻量化的博客,前后端分离,vue3+golang - **Primary Language**: Unknown - **License**: AGPL-3.0 - **Default Branch**: main - **Homepage**: https://arlog.cn - **GVP Project**: No ## Statistics - **Stars**: 12 - **Forks**: 1 - **Created**: 2024-06-02 - **Last Updated**: 2026-06-22 ## Categories & Tags **Categories**: blog **Tags**: Go语言, 客制化博客, vue3, 轻量化博客 ## README # ArLog > 基于 Go + Gin 的全栈个人博客系统,提供完整的 RESTful API 与 Nuxt 前台/管理后台。 ## 📸 页面截图 ### 前台页面 | 博客列表 | 登录页 | |---------|-------| | ![博客页](md-img/博客页.webp) | ![登录页](md-img/登录页.webp) | | 首页起始页 | |----------| | ![首页起始页](md-img/首页起始页.webp) | ### 管理后台 | 仪表盘 | 文章编辑 | 分类标签 | |-------|---------|---------| | ![仪表盘](md-img/后台仪表盘.webp) | ![文章编辑](md-img/后台文章编辑页.webp) | ![分类标签](md-img/后台分类标签页.webp) | | 评论管理 | 用户管理 | 站点设置 | |---------|---------|---------| | ![评论管理](md-img/后台评论页.webp) | ![用户管理](md-img/后台用户管理页.webp) | ![站点设置](md-img/后台站点设置页.webp) | --- ## ✨ 功能特性 ### 📝 文章管理 - 文章创建、编辑、删除 - 关键词搜索、Slug 访问 - 归档统计(按月份) - 热门/最新文章查询 - 草稿/发布/排期状态 ### 🏷️ 分类与标签 - 分类 CRUD,名称去重 - 标签 CRUD,名称去重 - 分类下文章统计 ### 💬 评论系统 - 评论审核(approved / pending / spam) - 评论状态管理 - 文章评论数统计 ### 👤 用户中心 - 管理员登录 - 图形验证码 - Bcrypt 密码加密 ### 🔧 管理后台 - 📊 仪表盘数据统计(用户/文章/评论/访问数量) - 📈 分类文章统计、访问统计(按天) - 📝 文章管理 - 🏷️ 分类/标签管理 - 💬 评论管理 - 👥 用户管理(列表/状态/删除) - ⚙️ 网站设置(Key-Value 配置) ### 🔐 安全特性 - JWT Token 认证(HS256,100 天有效期) - Casbin RBAC 权限控制 - Bcrypt 密码加密 - 图形验证码(base64Captcha) - IP 黑名单中间件拦截(支持过期时间) - 评论审核机制 --- ## 🛠️ 技术栈 ### 后端 | 类别 | 技术 | |------|------| | **语言** | Go 1.26 | | **Web 框架** | Gin | | **ORM** | GORM(支持 PostgreSQL / MySQL / SQL Server) | | **权限控制** | Casbin v3 + GORM Adapter | | **认证** | golang-jwt/jwt/v5 (JWT) | | **密码加密** | golang.org/x/crypto (bcrypt) | | **验证码** | mojocn/base64Captcha | | **配置管理** | Viper (JSON + 环境变量) | | **日志** | Zerolog(结构化日志) | | **对象存储** | 腾讯云 COS | | **部署** | Docker / Alpine | ### 前端 | 类别 | 技术 | |------|------| | **框架** | Nuxt 4 + Vue 3 + TypeScript | | **UI 组件** | Naive UI 2.44 | | **CSS** | UnoCSS(原子化 CSS) | | **图标** | @nuxt/icon + Iconify(本地缓存) | | **包管理** | pnpm | --- ## 📁 项目结构 ``` arlog/ ├── main.go # 后端入口 ├── config.json # 后端配置 ├── go.mod / go.sum # Go 模块依赖 │ ├── api/ # HTTP Handler 层 │ ├── admin/ # 管理后台接口(需 JWT + 权限) │ └── public/ # 公共接口(无需认证) │ ├── service/ # 业务逻辑层(12 个模块) ├── model/ # 数据模型(9 张表) ├── router/ # 路由定义 ├── middleware/ # 中间件(JWT / CORS / 日志) │ ├── core/ # 核心模块 │ ├── config.go # 配置加载(Viper) │ ├── gorm/ # 数据库初始化 + Casbin 权限 │ ├── logs/ # 日志系统(Zerolog) │ └── cos/ # 腾讯云 COS 对象存储 │ ├── utils/ # 工具库 │ ├── res/ # 统一响应格式 │ ├── er/ # 业务状态码 │ ├── page/ # 分页参数解析 │ └── param/ # 请求参数校验 │ ├── web/ # 前端项目(Nuxt 4) │ ├── nuxt.config.ts # Nuxt 配置 │ ├── package.json # 前端依赖 │ ├── uno.config.ts # UnoCSS 配置 │ │ │ ├── app/ │ │ ├── app.vue # 根组件(隐藏滚动条) │ │ ├── api/ # API 封装层 │ │ ├── data/ # 静态数据 │ │ │ │ │ ├── pages/ # 页面路由 │ │ │ ├── index.vue # 首页 │ │ │ ├── blog.vue # 博客列表 │ │ │ ├── blog/[slug].vue # 文章详情 │ │ │ ├── art.vue # 归档页 │ │ │ ├── login.vue # 登录页 │ │ │ ├── goto/[...slug].vue # 跳转兜底 │ │ │ └── admin/ │ │ │ ├── index.vue # 仪表盘 │ │ │ ├── posts.vue # 文章管理 │ │ │ ├── categories.vue # 分类管理 │ │ │ ├── comments.vue # 评论管理 │ │ │ ├── users.vue # 用户管理 │ │ │ ├── visitors.vue # 访客统计 │ │ │ └── settings.vue # 网站设置 │ │ │ │ │ ├── components/ # 通用组件 │ │ │ └── admin/ │ │ │ ├── AdminHeader.vue # 后台顶部栏 │ │ │ └── AdminSidebar.vue # 后台侧边栏 │ │ │ │ │ └── layouts/ # 布局模板 │ │ └── admin.vue # 管理后台布局 │ │ │ ├── public/ # 静态资源 │ │ ├── iconify/ # Iconify 本地缓存 │ │ ├── tx.jpg/webp # 头像 │ │ ├── *.jpg/webp # 背景图片 │ │ └── favicon.ico │ │ │ └── .output/ # 构建产物 │ ├── deploy/ # Docker 部署 │ └── Dockerfile │ ├── tools/ # 工具脚本 │ ├── convert-img.mjs # 图片转换脚本 │ ├── seed/ # 数据填充 │ ├── arlog_api.json # API 接口文档(可导入 Postman) │ └── test_api.sh # API 测试脚本 │ └── md-img/ # 截图 ``` --- ## 🗄️ 数据库表结构 | 表名 | 说明 | 核心字段 | |------|------|---------| | `user` | 用户表 | username, password, email, power, blocked | | `article` | 文章表 | title, content, slug, sort_id, status, view_count | | `sort` | 分类表 | name | | `tag` | 标签表 | name | | `comment` | 评论表 | post_id, content, parent_id, status | | `setting` | 设置表 | key, value (Key-Value) | | `ip_blacklist` | IP 黑名单 | ip, reason, expires_at | | `site_visit` | 访问记录 | ip, path, referer, user_agent | --- ## 📖 API 文档 ### 公共接口(无需认证) #### 认证 | 方法 | 路径 | 说明 | |------|------|------| | POST | `/api/public/auth/login` | 用户登录 | | GET | `/api/public/captcha` | 获取图形验证码 | #### 文章 | 方法 | 路径 | 说明 | |------|------|------| | GET | `/api/public/posts` | 文章列表 | | GET | `/api/public/posts/slug/:slug` | 按 Slug 获取文章 | | GET | `/api/public/posts/archives` | 归档(按月) | | GET | `/api/public/posts/hot` | 热门文章 | #### 分类与标签 | 方法 | 路径 | 说明 | |------|------|------| | GET | `/api/public/categories` | 分类列表 | | GET | `/api/public/tags` | 标签列表 | #### 上传与设置 | 方法 | 路径 | 说明 | |------|------|------| | POST | `/api/public/upload/image` | 上传图片 | | GET | `/api/public/settings/public` | 获取公开设置 | ### 管理后台(需 JWT + 权限) #### 仪表盘 | 方法 | 路径 | 说明 | |------|------|------| | GET | `/api/admin/dashboard/stats` | 数据统计 | | GET | `/api/admin/dashboard/category-stats` | 分类统计 | | GET | `/api/admin/dashboard/visit-stats` | 访问统计 | #### 认证管理 | 方法 | 路径 | 说明 | |------|------|------| | POST | `/api/admin/auth/logout` | 登出 | | POST | `/api/admin/auth/refresh` | 刷新 Token | | GET | `/api/admin/auth/profile` | 获取个人信息 | | PUT | `/api/admin/auth/profile` | 更新个人信息 | | PUT | `/api/admin/auth/password` | 修改密码 | #### 文章管理 | 方法 | 路径 | 说明 | |------|------|------| | GET | `/api/admin/posts` | 文章列表 | | POST | `/api/admin/posts` | 创建文章 | | PUT | `/api/admin/posts/:id` | 更新文章 | | DELETE | `/api/admin/posts/:id` | 删除文章 | #### 分类管理 | 方法 | 路径 | 说明 | |------|------|------| | POST | `/api/admin/categories` | 创建分类 | | PUT | `/api/admin/categories/:id` | 更新分类 | | DELETE | `/api/admin/categories/:id` | 删除分类 | #### 标签管理 | 方法 | 路径 | 说明 | |------|------|------| | POST | `/api/admin/tags` | 创建标签 | | PUT | `/api/admin/tags/:id` | 更新标签 | | DELETE | `/api/admin/tags/:id` | 删除标签 | #### 评论管理 | 方法 | 路径 | 说明 | |------|------|------| | GET | `/api/admin/comments` | 评论列表 | | GET | `/api/admin/comments/stats` | 评论统计 | | PUT | `/api/admin/comments/:id/status` | 更新评论状态 | | DELETE | `/api/admin/comments/:id` | 删除评论 | #### 用户管理 | 方法 | 路径 | 说明 | |------|------|------| | GET | `/api/admin/users` | 用户列表 | | GET | `/api/admin/users/stats` | 用户统计 | | PUT | `/api/admin/users/:id/block` | 切换拉黑状态 | | DELETE | `/api/admin/users/:id` | 删除用户 | #### 设置管理 | 方法 | 路径 | 说明 | |------|------|------| | GET | `/api/admin/settings/site` | 获取网站设置 | | PUT | `/api/admin/settings/site` | 更新网站设置 | --- ## 🔗 前端页面路由 | 路由 | 页面 | 说明 | |------|------|------| | `/` | 首页 | 博客首页 | | `/blog` | 博客列表 | 文章列表页 | | `/blog/:slug` | 文章详情 | Markdown 渲染 | | `/art` | 归档页 | 按月归档 | | `/login` | 登录 | 管理员登录 | | `/admin` | 仪表盘 | 管理后台首页 | | `/admin/posts` | 文章管理 | CRUD | | `/admin/categories` | 分类管理 | CRUD | | `/admin/comments` | 评论管理 | 审核 | | `/admin/users` | 用户管理 | 列表/状态/删除 | | `/admin/visitors` | 访客统计 | 访问记录 | | `/admin/settings` | 网站设置 | Key-Value 配置 | --- ## ⚙️ 配置说明 ```json { "web": { "port": "8080" }, "pgsql": { "host": "localhost", "port": "5432", "name": "postgres", "password": "your_password", "db": "arlog" }, "object": { "url": "https://cos.ap-guangzhou.myqcloud.com", "id": "your_secret_id", "key": "your_secret_key", "path": "uploads" }, "jwt": { "CustomSecret": "arlog", "Issuer": "arlog" }, "log": { "level": "info" } } ``` 所有配置项均支持环境变量覆盖(如 `WEB_PORT`、`PGSQL_HOST` 等)。 --- ## 🚀 快速开始 ### 环境要求 - Go 1.21+ - Node.js 18+ - pnpm - PostgreSQL 12+(或 MySQL / SQL Server) ### 本地运行 ```bash # 1. 启动后端 cd arlog cp config.json config.json # 编辑配置文件 go mod download go run main.go # 后端运行在 :8080 # 2. 启动前端(新开终端) cd web pnpm install pnpm dev # 前端运行在 :3000,自动代理 /api 到后端 ``` ### Docker 部署 ```bash docker build -t arlog -f deploy/Dockerfile . docker run -d -p 8080:8080 -v /path/to/config.json:/app/config.json arlog ``` --- ## 📦 统一响应格式 ```json { "code": 200, "msg": "OK", "result": { ... } } ``` | 状态码 | 含义 | |--------|------| | 200 | 成功 | | 201 | 操作失败 | | 202 | 用户已存在 | | 203 | 密码错误 | | 204 | 用户不存在 | | 205 | Token 缺失 | | 206 | 登录态失效 | | 207 | Token 无效 | | 403 | 无权限 | | 404 | 未找到 | --- ## 🔐 安全设计 - **JWT 认证**: 请求头携带 `token`,中间件自动校验 - **Casbin RBAC**: 基于用户角色的接口级权限控制 - **Bcrypt 加密**: 用户密码不可逆加密存储 - **图形验证码**: 登录防机器人刷接口 - **IP 黑名单**: 每次请求进入业务路由前先查询 `ip_blacklist`,命中则直接拦截 - **评论审核**: approved / pending / spam 三态管理 --- ## 🎯 开发指南 ### 分层架构 ``` Router → Middleware(JWT + Casbin) → Handler(api) → Service → Model(GORM) → PostgreSQL ``` - **Router**: 定义路由,绑定中间件 - **Handler**: 参数绑定与校验,调用 Service - **Service**: 业务逻辑实现 - **Model**: 数据库表结构定义 - **Middleware**: JWT 认证 + Casbin 权限 + CORS + 日志 ### 日志设计 一个 HTTP 请求只产生一行日志,业务信息通过 `SetBizInfo` / `SetBizError` 注入到请求日志中,最终由中间件合并输出。 ### 前端架构 ``` Nuxt 4 (SSR) ├── app.vue → layouts → pages(自动路由) ├── API 封装层(web/app/api/) ├── UnoCSS 原子化样式 └── Naive UI 组件库(本地图标缓存) ``` --- ## 📄 License MIT