255 lines
7.7 KiB
Markdown
255 lines
7.7 KiB
Markdown
# lv8girl - 绿坝娘二次元论坛
|
||
|
||
一个基于 Go + Gin + SQLite 构建的二次元社区论坛系统。
|
||
|
||
## 项目概述
|
||
|
||
lv8girl 是一个功能完整的社区论坛系统,支持用户注册登录、帖子发布审核、评论点赞、私信系统和管理后台等功能。
|
||
|
||
## 技术栈
|
||
|
||
- **语言**: Go 1.21+
|
||
- **Web框架**: Gin
|
||
- **数据库**: SQLite (使用 glebarez/sqlite 纯Go实现,无需CGO)
|
||
- **ORM**: GORM
|
||
- **会话管理**: gin-sessions
|
||
|
||
## 目录结构
|
||
|
||
```
|
||
lv8girl/
|
||
├── cmd/
|
||
│ └── server/
|
||
│ └── main.go # 程序入口文件
|
||
│
|
||
├── internal/ # 私有应用代码
|
||
│ ├── config/ # 配置管理
|
||
│ │ └── config.go # 应用配置定义
|
||
│ │
|
||
│ ├── controllers/ # 控制器层 - 处理HTTP请求
|
||
│ │ ├── admin.go # 管理后台控制器
|
||
│ │ ├── auth.go # 认证控制器(登录/注册/登出)
|
||
│ │ ├── discussion.go # 帖子发布控制器
|
||
│ │ ├── home.go # 首页/帖子详情控制器
|
||
│ │ ├── message.go # 私信控制器
|
||
│ │ └── user.go # 用户资料控制器
|
||
│ │
|
||
│ ├── middleware/ # 中间件
|
||
│ │ └── auth.go # 认证中间件(登录检查/管理员检查)
|
||
│ │
|
||
│ ├── models/ # 数据模型定义
|
||
│ │ └── models.go # User, Discussion, Comment, Like, PrivateMessage
|
||
│ │
|
||
│ ├── repositories/ # 数据访问层 - 数据库操作
|
||
│ │ ├── db.go # 数据库初始化
|
||
│ │ ├── comment.go # 评论数据访问
|
||
│ │ ├── discussion.go # 帖子数据访问
|
||
│ │ ├── like.go # 点赞数据访问
|
||
│ │ ├── message.go # 私信数据访问
|
||
│ │ └── user.go # 用户数据访问
|
||
│ │
|
||
│ ├── routes/ # 路由配置
|
||
│ │ └── routes.go # 所有路由定义
|
||
│ │
|
||
│ ├── services/ # 业务逻辑层
|
||
│ │ ├── admin.go # 管理业务逻辑
|
||
│ │ ├── auth.go # 认证业务逻辑
|
||
│ │ ├── discussion.go # 帖子业务逻辑
|
||
│ │ ├── message.go # 私信业务逻辑
|
||
│ │ └── user.go # 用户业务逻辑
|
||
│ │
|
||
│ └── utils/ # 工具函数
|
||
│ └── utils.go # 通用工具函数
|
||
│
|
||
├── templates/ # HTML模板文件
|
||
│ ├── index.html # 首页
|
||
│ ├── login.html # 登录页
|
||
│ ├── register.html # 注册页
|
||
│ ├── post.html # 帖子详情页
|
||
│ ├── post_discussion.html # 发帖页
|
||
│ ├── profile.html # 用户资料页
|
||
│ ├── messages.html # 私信列表页
|
||
│ ├── send_message.html # 发送私信页
|
||
│ ├── admin_dashboard.html # 管理后台-仪表盘
|
||
│ ├── admin_pending_posts.html # 管理后台-待审核帖子
|
||
│ ├── admin_pending_users.html # 管理后台-待审核用户
|
||
│ ├── admin_posts.html # 管理后台-帖子管理
|
||
│ ├── admin_users.html # 管理后台-用户管理
|
||
│ └── admin_comments.html # 管理后台-评论管理
|
||
│
|
||
├── static/ # 静态资源(CSS/JS)
|
||
├── uploads/ # 用户上传文件
|
||
│ ├── avatars/ # 用户头像
|
||
│ └── posts/ # 帖子图片
|
||
│
|
||
├── data/ # 数据库文件目录
|
||
│ └── lv8girl.db # SQLite数据库
|
||
│
|
||
├── go.mod # Go模块定义
|
||
├── go.sum # 依赖校验文件
|
||
├── Dockerfile # Docker构建文件
|
||
├── compose.yaml # Docker Compose配置
|
||
└── README.md # 项目说明文档
|
||
```
|
||
|
||
## 架构设计
|
||
|
||
项目采用分层架构,职责分离清晰:
|
||
|
||
```
|
||
请求 → 路由(Routes) → 中间件(Middleware) → 控制器(Controllers) → 服务(Services) → 仓库(Repositories) → 数据库
|
||
```
|
||
|
||
### 各层职责
|
||
|
||
| 层级 | 职责 | 示例 |
|
||
|------|------|------|
|
||
| Routes | 定义URL路由规则,绑定控制器方法 | `r.GET("/", homeCtrl.Index)` |
|
||
| Middleware | 请求预处理(认证、权限检查等) | `AuthRequired()`, `AdminRequired()` |
|
||
| Controllers | 处理HTTP请求,参数验证,调用Service | 解析表单数据,返回HTML/JSON |
|
||
| Services | 业务逻辑处理,事务管理 | 用户注册流程,帖子审核流程 |
|
||
| Repositories | 数据库CRUD操作 | `FindByID`, `Create`, `Update` |
|
||
| Models | 数据结构定义 | `User`, `Discussion` 结构体 |
|
||
|
||
## 功能特性
|
||
|
||
### 用户功能
|
||
- 用户注册(需管理员审核)
|
||
- 用户登录/登出
|
||
- 个人资料页
|
||
- 头像上传
|
||
|
||
### 帖子功能
|
||
- 发布帖子(支持图片上传,需审核)
|
||
- 帖子列表浏览
|
||
- 帖子详情查看
|
||
- 点赞功能
|
||
- 评论功能
|
||
|
||
### 私信功能
|
||
- 发送私信
|
||
- 私信列表
|
||
- 未读消息提示
|
||
|
||
### 管理后台
|
||
- 仪表盘统计
|
||
- 用户审核管理
|
||
- 帖子审核管理
|
||
- 用户角色管理
|
||
- 评论管理
|
||
|
||
## 快速开始
|
||
|
||
### 本地运行
|
||
|
||
```bash
|
||
# 克隆项目
|
||
git clone <repository-url>
|
||
cd lv8girl
|
||
|
||
# 下载依赖
|
||
go mod tidy
|
||
|
||
# 运行
|
||
go run ./cmd/server
|
||
```
|
||
|
||
访问 http://localhost:8080
|
||
|
||
### Docker运行
|
||
|
||
```bash
|
||
# 构建并运行
|
||
docker-compose up --build
|
||
```
|
||
|
||
## 默认账号
|
||
|
||
管理员账号:
|
||
- 用户名: `admin`
|
||
- 密码: `admin123`
|
||
|
||
## 配置说明
|
||
|
||
配置文件位于 `internal/config/config.go`:
|
||
|
||
```go
|
||
type Config struct {
|
||
Server ServerConfig // 服务端口等
|
||
Database DatabaseConfig // 数据库路径
|
||
Session SessionConfig // 会话密钥
|
||
App AppConfig // 应用名称版本
|
||
}
|
||
```
|
||
|
||
## 数据库模型
|
||
|
||
### User (用户)
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| id | uint | 主键 |
|
||
| username | string | 用户名 |
|
||
| email | string | 邮箱 |
|
||
| password_hash | string | 密码哈希 |
|
||
| avatar | string | 头像路径 |
|
||
| role | string | 角色(user/admin/banned) |
|
||
| status | string | 状态(pending/approved/rejected) |
|
||
| last_active | time | 最后活动时间 |
|
||
|
||
### Discussion (帖子)
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| id | uint | 主键 |
|
||
| user_id | uint | 作者ID |
|
||
| title | string | 标题 |
|
||
| content | text | 内容 |
|
||
| image_path | string | 图片路径 |
|
||
| status | string | 状态(pending/approved/rejected) |
|
||
| views | int | 浏览量 |
|
||
|
||
### Comment (评论)
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| id | uint | 主键 |
|
||
| post_id | uint | 帖子ID |
|
||
| user_id | uint | 评论者ID |
|
||
| content | text | 内容 |
|
||
|
||
### Like (点赞)
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| id | uint | 主键 |
|
||
| post_id | uint | 帖子ID |
|
||
| user_id | uint | 用户ID |
|
||
|
||
### PrivateMessage (私信)
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| id | uint | 主键 |
|
||
| from_user_id | uint | 发送者ID |
|
||
| to_user_id | uint | 接收者ID |
|
||
| content | text | 内容 |
|
||
| is_read | bool | 是否已读 |
|
||
|
||
## 开发指南
|
||
|
||
### 添加新功能
|
||
|
||
1. 在 `models/` 添加数据模型
|
||
2. 在 `repositories/` 添加数据访问方法
|
||
3. 在 `services/` 添加业务逻辑
|
||
4. 在 `controllers/` 添加控制器
|
||
5. 在 `routes/` 注册路由
|
||
6. 在 `templates/` 添加模板
|
||
|
||
### 代码规范
|
||
|
||
- 遵循 Go 命名规范
|
||
- 每个包有明确的职责
|
||
- 错误要妥善处理
|
||
- 敏感信息不要硬编码
|
||
|
||
## 许可证
|
||
|
||
MIT License
|