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:
68
backend/internal/utils/slug.go
Normal file
68
backend/internal/utils/slug.go
Normal 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)
|
||||
}
|
||||
Reference in New Issue
Block a user