golang自托管问答社区应用插件Guora的使用
Golang自托管问答社区应用插件Guora的使用
Guora是一个基于Golang开发的类似知乎的自托管问答应用,包含问答、评论、点赞、管理后台等功能。
快速开始(Docker部署)
$ docker-compose up --build
开发环境部署(非Docker)
1. 克隆源代码
$ git clone https://github.com/meloalright/guora
$ cd guora
2. 下载依赖
$ go mod download
3. 创建配置文件
$ touch /etc/guora/configuration.yaml
配置文件示例(configuration.yaml
):
# configuration for dev
db:
driver: sqlite3
addr: ./guora.db
# driver: mysql
# addr: user:password@/dbname?charset=utf8&parseTime=True&loc=Local
# driver: postgres
# addr: host=myhost user=gorm dbname=gorm sslmode=disable password=mypassword
redis:
addr: localhost:6379
password:
db: 0
admin:
name: Development (开发账号)
mail: mymail
password: mypassword
secretkey: JustWriteSomethingWhatYouLike
lang: en
#lang: zh
address: :8080
配置参数说明:
参数 | 描述 | 备注 |
---|---|---|
db | 数据库配置,支持sqlite3, mysql, postgres | 数据库配置: 驱动支持 sqlite3, mysql, postgres |
redis | Redis配置 | Redis 配置 |
admin | 管理员信息 | 管理员信息 |
secretkey | Token签名密钥 | Token 密钥 |
lang | 语言,如en, zh | 语言: en 为英文; zh 为简体中文 |
address | 监听地址 | 服务监听地址 |
4. 初始化并运行
$ (sudo) go run ./cmd/guora -init
5. 访问网站
访问 localhost:8080
并使用管理员账号登录:
mail (默认邮箱) | mymail |
password (默认密码) | mypassword |
运行测试
$ (sudo) go test ./cmd/guora
源码
仓库: guora
作者: meloalright
贡献者: contributors
变更日志
详见 Releases
许可证
MIT
更多关于golang自托管问答社区应用插件Guora的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang自托管问答社区应用插件Guora的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Guora: 自托管问答社区的Golang解决方案
Guora是一个用Go语言编写的自托管问答社区应用,类似于开源的Stack Overflow或Quora替代方案。它允许用户在自己的服务器上部署一个完全控制的问答平台。
主要特性
- 轻量级且高性能(得益于Go语言)
- 支持Markdown格式的问题和回答
- 用户认证系统
- 标签分类
- 投票机制
- 响应式设计
安装与部署
1. 从源码安装
# 克隆仓库
git clone https://github.com/Guora/guora.git
cd guora
# 安装依赖
go mod download
# 编译
go build -o guora
# 运行
./guora
2. 使用Docker部署
docker pull guora/guora
docker run -d -p 8080:8080 guora/guora
基本配置
Guora使用config.yaml
文件进行配置:
server:
port: 8080
mode: "release" # debug/release/test
database:
type: "sqlite3" # 支持sqlite3/mysql/postgres
path: "./guora.db" # SQLite数据库路径
# 如果使用MySQL或PostgreSQL
# host: "localhost"
# port: 3306
# user: "root"
# password: "password"
# name: "guora"
auth:
secret: "your-secret-key"
expire: 3600 # token过期时间(秒)
基本API示例
以下是使用Guora API的Golang示例代码:
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
const (
baseURL = "http://localhost:8080/api/v1"
)
// 用户注册
func register(username, email, password string) error {
data := map[string]string{
"username": username,
"email": email,
"password": password,
}
jsonData, err := json.Marshal(data)
if err != nil {
return err
}
resp, err := http.Post(baseURL+"/auth/register", "application/json", bytes.NewBuffer(jsonData))
if err != nil {
return err
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
return nil
}
// 用户登录
func login(email, password string) (string, error) {
data := map[string]string{
"email": email,
"password": password,
}
jsonData, err := json.Marshal(data)
if err != nil {
return "", err
}
resp, err := http.Post(baseURL+"/auth/login", "application/json", bytes.NewBuffer(jsonData))
if err != nil {
return "", err
}
defer resp.Body.Close()
var result struct {
Token string `json:"token"`
}
if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
return "", err
}
return result.Token, nil
}
// 创建问题
func createQuestion(token, title, content string, tags []string) error {
data := map[string]interface{}{
"title": title,
"content": content,
"tags": tags,
}
jsonData, err := json.Marshal(data)
if err != nil {
return err
}
req, err := http.NewRequest("POST", baseURL+"/questions", bytes.NewBuffer(jsonData))
if err != nil {
return err
}
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
return nil
}
func main() {
// 示例使用
err := register("testuser", "test@example.com", "password123")
if err != nil {
fmt.Println("注册失败:", err)
}
token, err := login("test@example.com", "password123")
if err != nil {
fmt.Println("登录失败:", err)
}
err = createQuestion(token, "Go语言性能如何?", "我想了解Go语言的性能特点", []string{"go", "performance"})
if err != nil {
fmt.Println("创建问题失败:", err)
}
}
自定义开发
Guora采用模块化设计,便于扩展。以下是添加自定义插件的示例:
- 在
internal/plugin
目录下创建新插件 - 实现插件接口:
package myplugin
import (
"github.com/Guora/internal/model"
)
type MyPlugin struct{}
func (p *MyPlugin) Name() string {
return "MyPlugin"
}
func (p *MyPlugin) OnQuestionCreate(q *model.Question) error {
// 在问题创建时执行自定义逻辑
return nil
}
func (p *MyPlugin) OnAnswerCreate(a *model.Answer) error {
// 在回答创建时执行自定义逻辑
return nil
}
// 注册插件
func init() {
plugin.Register(&MyPlugin{})
}
数据模型
Guora的主要数据模型包括:
// 用户模型
type User struct {
ID uint `gorm:"primaryKey"`
Username string `gorm:"unique"`
Email string `gorm:"unique"`
Password string
// 其他字段...
}
// 问题模型
type Question struct {
ID uint `gorm:"primaryKey"`
Title string
Content string
UserID uint
User User
Tags []Tag `gorm:"many2many:question_tags;"`
// 其他字段...
}
// 回答模型
type Answer struct {
ID uint `gorm:"primaryKey"`
Content string
QuestionID uint
Question Question
UserID uint
User User
// 其他字段...
}
// 标签模型
type Tag struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"unique"`
}
总结
Guora是一个功能完善且易于扩展的自托管问答社区解决方案。通过Go语言实现,它具有高性能和低资源消耗的特点,适合个人或小型团队部署使用。开发者可以根据需要轻松扩展功能或修改现有行为。