refactor: 重构后端架构为 go-zero 框架,优化项目结构

主要变更:
- 采用 go-zero 框架替代 Gin,提升开发效率
- 重构项目结构,API 文件模块化组织
- 将 model 移至 api/internal/model 目录
- 移除 common 包,改为标准 pkg 目录结构
- 实现统一的仓储模式,支持配置驱动数据库切换
- 简化测试策略,专注 API 集成测试
- 更新 CLAUDE.md 文档,提供详细的开发指导

技术栈更新:
- 框架: Gin → go-zero v1.6.0+
- 代码生成: 引入 goctl 工具
- 架构模式: 四层架构 → go-zero 三层架构 (Handler→Logic→Model)
- 项目布局: 遵循 Go 社区标准和 go-zero 最佳实践
This commit is contained in:
xujiang
2025-07-10 15:05:52 +08:00
parent a2f2f66f88
commit 39a42695d3
52 changed files with 6047 additions and 2349 deletions

View File

@ -0,0 +1,68 @@
package utils
import (
"regexp"
"strconv"
"strings"
"unicode"
)
// GenerateSlug 生成URL友好的slug
func GenerateSlug(text string) string {
// 转换为小写
text = strings.ToLower(text)
// 移除重音字符
text = removeAccents(text)
// 替换空格和特殊字符为连字符
reg := regexp.MustCompile(`[^\p{L}\p{N}]+`)
text = reg.ReplaceAllString(text, "-")
// 移除首尾的连字符
text = strings.Trim(text, "-")
// 移除连续的连字符
reg = regexp.MustCompile(`-+`)
text = reg.ReplaceAllString(text, "-")
return text
}
// removeAccents 移除重音字符的转换函数
func removeAccents(text string) string {
var result strings.Builder
for _, r := range text {
if !unicode.Is(unicode.Mn, r) {
result.WriteRune(r)
}
}
return result.String()
}
// TruncateString 截断字符串到指定长度
func TruncateString(s string, length int) string {
if len(s) <= length {
return s
}
return s[:length]
}
// GenerateUniqueSlug 生成唯一的slug
func GenerateUniqueSlug(base string, existingCheck func(string) bool) string {
slug := GenerateSlug(base)
if !existingCheck(slug) {
return slug
}
// 如果存在重复,添加数字后缀
for i := 1; i <= 1000; i++ {
candidateSlug := slug + "-" + strconv.Itoa(i)
if !existingCheck(candidateSlug) {
return candidateSlug
}
}
// 如果还是重复,使用时间戳
return slug + "-" + GenerateRandomString(6)
}