feat(search): 库存搜索支持拼音/首字母,按回车触发
- 新增 util.ToPinyin(),使用 go-pinyin 生成全拼和首字母 - Product model 新增 name_pinyin / name_initials 列(AutoMigrate) - 启动时自动回填存量商品拼音 - Create / Update / FindOrCreate 写入时同步生成拼音 - 库存搜索 SQL 加入拼音/首字母 LIKE 条件 - 前端去掉 300ms 防抖,改为回车/点击搜索按钮触发 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
package util
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
gp "github.com/mozillazg/go-pinyin"
|
||||
)
|
||||
|
||||
var (
|
||||
fullArgs = func() gp.Args {
|
||||
a := gp.NewArgs()
|
||||
a.Style = gp.Normal
|
||||
a.Fallback = func(r rune, _ gp.Args) []string {
|
||||
return []string{strings.ToLower(string(r))}
|
||||
}
|
||||
return a
|
||||
}()
|
||||
initialArgs = func() gp.Args {
|
||||
a := gp.NewArgs()
|
||||
a.Style = gp.FirstLetter
|
||||
a.Fallback = func(r rune, _ gp.Args) []string {
|
||||
s := strings.ToLower(string(r))
|
||||
if s == "" {
|
||||
return nil
|
||||
}
|
||||
return []string{string(s[0])}
|
||||
}
|
||||
return a
|
||||
}()
|
||||
)
|
||||
|
||||
// ToPinyin converts a Chinese name to full pinyin and initials.
|
||||
// Non-Chinese characters are kept as-is (lowercased).
|
||||
// Example: "茅台酒" → ("maotaijiu", "mtj")
|
||||
func ToPinyin(s string) (full, initials string) {
|
||||
var fb, ib strings.Builder
|
||||
for _, row := range gp.Pinyin(s, fullArgs) {
|
||||
if len(row) > 0 {
|
||||
fb.WriteString(row[0])
|
||||
}
|
||||
}
|
||||
for _, row := range gp.Pinyin(s, initialArgs) {
|
||||
if len(row) > 0 {
|
||||
ib.WriteString(row[0])
|
||||
}
|
||||
}
|
||||
return fb.String(), ib.String()
|
||||
}
|
||||
Reference in New Issue
Block a user