feat: add SMS verification registration with UniSMS provider

- Add phone field to user model with index and helper methods
- Implement SMS provider interface with UniSMS (合一短信) implementation
- Add SMS verification code sending endpoint with rate limiting (1/60s)
- Support SMS registration in Register() (mutually exclusive with email)
- Add SMS configuration to admin settings (provider, keys, signature, template)
- Display phone number in admin user list contact column
- Add i18n translations for all SMS-related messages (zh-CN, en, zh-TW)
- Add Claude Code skills: sync-upstream, migrate-server
- Update CLAUDE.md with git conventions and deployment guide

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
nosqli
2026-03-06 23:57:15 +08:00
parent 4a4cf0a0df
commit 835cd8e74b
26 changed files with 815 additions and 17 deletions

22
common/sms_unisms.go Normal file
View File

@@ -0,0 +1,22 @@
package common
import (
unisms "github.com/apistd/uni-go-sdk/sms"
)
type UniSmsProvider struct{}
func (p *UniSmsProvider) SendCode(phone string, code string) error {
client := unisms.NewClient(SMSAccessKeyId, SMSAccessKeySecret)
message := unisms.BuildMessage()
message.SetTo(phone)
message.SetSignature(SMSSignName)
message.SetTemplateId(SMSTemplateCode)
message.SetTemplateData(map[string]string{"code": code})
_, err := client.Send(message)
return err
}
func init() {
RegisterSmsProvider("unisms", &UniSmsProvider{})
}