golang自托管问答社区应用插件Guora的使用

Golang自托管问答社区应用插件Guora的使用

Guora是一个基于Golang开发的类似知乎的自托管问答应用,包含问答、评论、点赞、管理后台等功能。

Guora UI界面

快速开始(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采用模块化设计,便于扩展。以下是添加自定义插件的示例:

  1. internal/plugin目录下创建新插件
  2. 实现插件接口:
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语言实现,它具有高性能和低资源消耗的特点,适合个人或小型团队部署使用。开发者可以根据需要轻松扩展功能或修改现有行为。

回到顶部