e9a6543a8b
- 新增 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>
49 lines
1008 B
Go
49 lines
1008 B
Go
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()
|
|
}
|