diff --git a/cmd/authlibskin/config.yaml.template b/cmd/authlibskin/config.yaml.template new file mode 100644 index 0000000..fc917af --- /dev/null +++ b/cmd/authlibskin/config.yaml.template @@ -0,0 +1,54 @@ +# 为 true 则 uuid 生成方式于离线模式相同,若从离线模式切换不会丢失数据。 +# 已有用户数据的情况下勿更改此项 +OfflineUUID: true + +Port: "0.0.0.0:8080" + +Log: + Level: "debug" + # json 格式输出 + Json: false + +Sql: + MysqlDsn: "" + +# 输出每条执行的 sql 语句 +Debug: false + +Cache: + # 默认使用内存缓存,若需要集群部署,请更换 redis + Type: "" + # 内存缓存使用大小,单位 b + Ram: 10000000 + +# 位于反向代理后启用,用于记录真实 ip +RaelIP: false + +# ip 段最大注册用户,ipv4 为 /24 ipv6 为 /48 +MaxIpUser: 10 + +# 运行后勿修改,若为集群需设置为一致 +RsaPriKey: "" + +# 材质文件保存路径,如果需要对象存储可以把对象储存挂载到本地目录上 +TexturePath: "skin" + +# 材质静态文件提供基础地址 +# 如果静态文件位于 oss 上,比如 https://s3.amazonaws.com/example/1.png +# 则填写 https://s3.amazonaws.com/example +TextureBaseUrl: "" + +# 用于在支持的启动器中展示本站的注册地址 +# 填写类似 https://example.com +WebBaseUrl: "" + +# 皮肤站名字,用于在多个地方展示 +ServerName: "" + + +Captcha: + # 验证码类型,目前只支持 cloudflare turnstile + # 填写 turnstile + Type: "" + SiteKey: "" + Secret: "" diff --git a/cmd/authlibskin/main.go b/cmd/authlibskin/main.go index 5bfee1d..c6f080b 100644 --- a/cmd/authlibskin/main.go +++ b/cmd/authlibskin/main.go @@ -2,22 +2,42 @@ package main import ( "context" + "errors" "flag" + "fmt" "os" + _ "embed" + + "github.com/samber/lo" "github.com/xmdhs/authlib-skin/config" + "github.com/xmdhs/authlib-skin/server" ) var configPath string +//go:embed config.yaml.template +var configTempLate []byte + func init() { - flag.StringVar(&configPath, "c", "", "") + flag.StringVar(&configPath, "c", "config.yaml", "") flag.Parse() } func main() { ctx := context.Background() - os.ReadFile(configPath) + b, err := os.ReadFile(configPath) + if err != nil { + if errors.Is(err, os.ErrNotExist) { + lo.Must0(os.WriteFile("config.yaml", configTempLate, 0600)) + fmt.Println("已写入模板配置文件") + return + } + panic(err) + } + config := lo.Must(config.YamlDeCode(b)) - config.YamlDeCode() + s, cancel := lo.Must2(server.InitializeRoute(ctx, config)) + defer cancel() + panic(s.ListenAndServe()) } diff --git a/frontend/src/views/Login.tsx b/frontend/src/views/Login.tsx index db3dcfa..4dc2751 100644 --- a/frontend/src/views/Login.tsx +++ b/frontend/src/views/Login.tsx @@ -61,20 +61,18 @@ export default function SignIn() { }). catch(v => { captchaRef.current?.reload() - + console.warn(v) if (v instanceof ApiErr) { switch (v.code) { case 6: - setErr("错误的密码") - break + setErr("密码或用户名错误") + return case 9: setErr("用户已被禁用") - break + return } - return } setErr(String(v)) - console.warn(v) }). finally(() => setLoading(false)) diff --git a/frontend/src/views/Register.tsx b/frontend/src/views/Register.tsx index 2839c77..a55c3f5 100644 --- a/frontend/src/views/Register.tsx +++ b/frontend/src/views/Register.tsx @@ -55,17 +55,15 @@ export default function SignUp() { catch(v => { captchaRef.current?.reload() console.warn(v) - if (v instanceof ApiErr) { switch (v.code) { case 3: setRegErr("邮箱已存在") - break + return case 7: setRegErr("用户名已存在") - break + return } - return } setRegErr(String(v)) }). diff --git a/service/user.go b/service/user.go index bf01fb0..f28b39f 100644 --- a/service/user.go +++ b/service/user.go @@ -21,7 +21,7 @@ var ( ErrExistUser = errors.New("邮箱已存在") ErrExitsName = errors.New("用户名已存在") ErrRegLimit = errors.New("超过注册 ip 限制") - ErrPassWord = errors.New("错误的密码") + ErrPassWord = errors.New("错误的密码或用户名") ErrChangeName = errors.New("离线模式 uuid 不允许修改用户名") ) @@ -98,6 +98,10 @@ func (w *WebService) Login(ctx context.Context, l model.Login, ip string) (model } u, err := w.client.User.Query().Where(user.Email(l.Email)).WithProfile().Only(ctx) if err != nil { + var ne *ent.NotFoundError + if errors.As(err, &ne) { + return model.LoginRep{}, fmt.Errorf("Login: %w", ErrPassWord) + } return model.LoginRep{}, fmt.Errorf("Login: %w", err) } err = w.validatePass(ctx, u, l.Password)