diff --git a/api/app/access/create.go b/api/app/access/create.go index 045f56c..b2aaa33 100644 --- a/api/app/access/create.go +++ b/api/app/access/create.go @@ -7,7 +7,7 @@ package access import ( - "github.com/veypi/OneBD/rest" + "github.com/vyes/vigo" "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/models" ) @@ -24,7 +24,7 @@ type createOpts struct { var _ = Router.Post("/", createAccess) -func createAccess(x *rest.X) (any, error) { +func createAccess(x *vigo.X) (any, error) { // 解析请求参数 opts := &createOpts{} if err := x.Parse(opts); err != nil { diff --git a/api/app/access/del.go b/api/app/access/del.go index d8d472b..58e7598 100644 --- a/api/app/access/del.go +++ b/api/app/access/del.go @@ -7,7 +7,7 @@ package access import ( - "github.com/veypi/OneBD/rest" + "github.com/vyes/vigo" "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/models" ) @@ -18,7 +18,7 @@ type deleteOpts struct { var _ = Router.Delete("/:id", deleteAccess) -func deleteAccess(x *rest.X) (any, error) { +func deleteAccess(x *vigo.X) (any, error) { // 解析路径参数 opts := &deleteOpts{} if err := x.Parse(opts); err != nil { @@ -28,7 +28,7 @@ func deleteAccess(x *rest.X) (any, error) { // 查找记录 var access models.Access if err := cfg.DB().Where("id = ?", opts.ID).First(&access).Error; err != nil { - return nil, rest.NewError("未找到资源").WithCode(404) + return nil, vigo.NewError("未找到资源").WithCode(404) } // 删除记录 diff --git a/api/app/access/get.go b/api/app/access/get.go index a3a582e..7ae0985 100644 --- a/api/app/access/get.go +++ b/api/app/access/get.go @@ -7,25 +7,25 @@ package access import ( - "github.com/veypi/OneBD/rest" "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/models" + "github.com/vyes/vigo" ) var _ = Router.Get("/:id", getAccess) -func getAccess(x *rest.X) (any, error) { +func getAccess(x *vigo.X) (any, error) { // 获取路径参数 id := x.Params.Get("id") if id == "" { - return nil, rest.NewError("ID不能为空").WithCode(400) + return nil, vigo.NewError("ID不能为空").WithCode(400) } // 查询数据库 var access models.Access err := cfg.DB().Where("id = ?", id).First(&access).Error if err != nil { - return nil, rest.NewError("未找到资源").WithCode(404) + return nil, vigo.NewError("未找到资源").WithCode(404) } return &access, nil diff --git a/api/app/access/init.go b/api/app/access/init.go index a6b5044..afa206e 100644 --- a/api/app/access/init.go +++ b/api/app/access/init.go @@ -8,7 +8,7 @@ package access import ( - "github.com/veypi/OneBD/rest" + "github.com/vyes/vigo" ) -var Router = rest.NewRouter() +var Router = vigo.NewRouter() diff --git a/api/app/access/list.go b/api/app/access/list.go index 25295ad..e3fee08 100644 --- a/api/app/access/list.go +++ b/api/app/access/list.go @@ -7,9 +7,9 @@ package access import ( - "github.com/veypi/OneBD/rest" "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/models" + "github.com/vyes/vigo" ) type listOpts struct { @@ -28,7 +28,7 @@ type listResponse struct { var _ = Router.Get("/", listAccess) -func listAccess(x *rest.X) (any, error) { +func listAccess(x *vigo.X) (any, error) { // 解析查询参数 opts := &listOpts{} if err := x.Parse(opts); err != nil { diff --git a/api/app/access/patch.go b/api/app/access/patch.go index 907797a..e2253cc 100644 --- a/api/app/access/patch.go +++ b/api/app/access/patch.go @@ -9,7 +9,7 @@ package access import ( "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/models" - "github.com/veypi/OneBD/rest" + "github.com/vyes/vigo" ) type updateOpts struct { @@ -21,7 +21,7 @@ type updateOpts struct { var _ = Router.Patch("/:id", updateAccess) -func updateAccess(x *rest.X) (any, error) { +func updateAccess(x *vigo.X) (any, error) { // 解析请求参数 opts := &updateOpts{} if err := x.Parse(opts); err != nil { @@ -31,7 +31,7 @@ func updateAccess(x *rest.X) (any, error) { // 查找记录 var access models.Access if err := cfg.DB().Where("id = ?", opts.ID).First(&access).Error; err != nil { - return nil, rest.NewError("未找到资源").WithCode(404) + return nil, vigo.NewError("未找到资源").WithCode(404) } // 更新字段 diff --git a/api/app/app.go b/api/app/app.go index 4991606..9503cc7 100644 --- a/api/app/app.go +++ b/api/app/app.go @@ -7,18 +7,18 @@ import ( "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/libs/auth" + "github.com/veypi/OneAuth/libs/utils" "github.com/veypi/OneAuth/models" - "github.com/veypi/OneBD/rest" - "github.com/veypi/utils" + "github.com/vyes/vigo" "gorm.io/gorm" ) var _ = Router.Get("/:app_id/key", auth.Check("app", "app_id", auth.DoDelete), appKey) -func appKey(x *rest.X) (any, error) { +func appKey(x *vigo.X) (any, error) { id := x.Params.Get("app_id") if id == "" { - return nil, rest.ErrArgMissing.WithArgs("app_id") + return nil, vigo.ErrArgMissing.WithArgs("app_id") } data := &models.App{} data.ID = id @@ -31,7 +31,7 @@ func appKey(x *rest.X) (any, error) { var _ = Router.Delete("/:app_id", auth.Check("app", "app_id", auth.DoDelete), appDelete) -func appDelete(x *rest.X) (any, error) { +func appDelete(x *vigo.X) (any, error) { data := &models.App{} err := cfg.DB().Where("id = ?", x.Params.Get("app_id")).Delete(data).Error @@ -41,7 +41,7 @@ func appDelete(x *rest.X) (any, error) { var _ = Router.Get("/:app_id", auth.Check("app", "app_id", auth.DoRead), appGet) -func appGet(x *rest.X) (any, error) { +func appGet(x *vigo.X) (any, error) { data := &models.App{} err := cfg.DB().Where("id = ?", x.Params.Get("app_id")).First(data).Error @@ -54,7 +54,7 @@ type listOpts struct { var _ = Router.Get("/", appList) -func appList(x *rest.X) (any, error) { +func appList(x *vigo.X) (any, error) { opts := &listOpts{} err := x.Parse(opts) if err != nil { @@ -92,7 +92,7 @@ type postOpts struct { var _ = Router.Post("/", auth.Check("app", "", auth.DoCreate), appPost) -func appPost(x *rest.X) (any, error) { +func appPost(x *vigo.X) (any, error) { opts := &postOpts{} err := x.Parse(opts) if err != nil { @@ -139,7 +139,7 @@ type patchOpts struct { var _ = Router.Patch("/:app_id", auth.Check("app", "app_id", auth.DoUpdate), appPatch) -func appPatch(x *rest.X) (any, error) { +func appPatch(x *vigo.X) (any, error) { opts := &patchOpts{} err := x.Parse(opts) if err != nil { diff --git a/api/app/app_user/create.go b/api/app/app_user/create.go index c146c05..3f299bc 100644 --- a/api/app/app_user/create.go +++ b/api/app/app_user/create.go @@ -1,9 +1,9 @@ package app_user import ( - "github.com/veypi/OneBD/rest" "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/models" + "github.com/vyes/vigo" ) type createOpts struct { @@ -14,7 +14,7 @@ type createOpts struct { var _ = Router.Post("/", createAppUser) -func createAppUser(x *rest.X) (any, error) { +func createAppUser(x *vigo.X) (any, error) { opts := &createOpts{} if err := x.Parse(opts); err != nil { return nil, err diff --git a/api/app/app_user/del.go b/api/app/app_user/del.go index e6e5696..fe645ab 100644 --- a/api/app/app_user/del.go +++ b/api/app/app_user/del.go @@ -3,7 +3,7 @@ package app_user import ( "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/models" - "github.com/veypi/OneBD/rest" + "github.com/vyes/vigo" ) type deleteOpts struct { @@ -13,7 +13,7 @@ type deleteOpts struct { var _ = Router.Delete("/:user_id", deleteAppUser) -func deleteAppUser(x *rest.X) (any, error) { +func deleteAppUser(x *vigo.X) (any, error) { opts := &deleteOpts{} if err := x.Parse(opts); err != nil { return nil, err @@ -21,7 +21,7 @@ func deleteAppUser(x *rest.X) (any, error) { appUser := &models.AppUser{} if err := cfg.DB().Where("app_id = ? AND user_id = ?", opts.AppID, opts.UserID).First(appUser).Error; err != nil { - return nil, rest.NewError("app_user not found").WithCode(404) + return nil, vigo.NewError("app_user not found").WithCode(404) } if err := cfg.DB().Delete(appUser).Error; err != nil { diff --git a/api/app/app_user/get.go b/api/app/app_user/get.go index ab2b215..3f7739e 100644 --- a/api/app/app_user/get.go +++ b/api/app/app_user/get.go @@ -3,23 +3,23 @@ package app_user import ( "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/models" - "github.com/veypi/OneBD/rest" + "github.com/vyes/vigo" ) var _ = Router.Get("/:user_id", getAppUser) -func getAppUser(x *rest.X) (any, error) { +func getAppUser(x *vigo.X) (any, error) { appID := x.Params.Get("app_id") userID := x.Params.Get("user_id") if appID == "" || userID == "" { - return nil, rest.NewError("app_id or user_id is empty").WithCode(400) + return nil, vigo.NewError("app_id or user_id is empty").WithCode(400) } appUser := &models.AppUser{} err := cfg.DB().Where("app_id = ? AND user_id = ?", appID, userID).First(appUser).Error if err != nil { - return nil, rest.NewError("app_user not found").WithCode(404) + return nil, vigo.NewError("app_user not found").WithCode(404) } return appUser, nil diff --git a/api/app/app_user/init.go b/api/app/app_user/init.go index 38900fa..0837361 100644 --- a/api/app/app_user/init.go +++ b/api/app/app_user/init.go @@ -8,7 +8,7 @@ package app_user import ( - "github.com/veypi/OneBD/rest" + "github.com/vyes/vigo" ) -var Router = rest.NewRouter() +var Router = vigo.NewRouter() diff --git a/api/app/app_user/list.go b/api/app/app_user/list.go index af8333a..fd1f71c 100644 --- a/api/app/app_user/list.go +++ b/api/app/app_user/list.go @@ -1,7 +1,7 @@ package app_user import ( - "github.com/veypi/OneBD/rest" + "github.com/vyes/vigo" "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/models" ) @@ -20,7 +20,7 @@ type listResponse struct { var _ = Router.Get("/", listAppUsers) -func listAppUsers(x *rest.X) (any, error) { +func listAppUsers(x *vigo.X) (any, error) { opts := &listOpts{} if err := x.Parse(opts); err != nil { return nil, err diff --git a/api/app/app_user/patch.go b/api/app/app_user/patch.go index bf2cad6..492fc14 100644 --- a/api/app/app_user/patch.go +++ b/api/app/app_user/patch.go @@ -1,7 +1,7 @@ package app_user import ( - "github.com/veypi/OneBD/rest" + "github.com/vyes/vigo" "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/models" ) @@ -14,7 +14,7 @@ type updateOpts struct { var _ = Router.Patch("/:user_id", updateAppUser) -func updateAppUser(x *rest.X) (any, error) { +func updateAppUser(x *vigo.X) (any, error) { opts := &updateOpts{} if err := x.Parse(opts); err != nil { return nil, err @@ -22,7 +22,7 @@ func updateAppUser(x *rest.X) (any, error) { appUser := &models.AppUser{} if err := cfg.DB().Where("app_id = ? AND user_id = ?", opts.AppID, opts.UserID).First(appUser).Error; err != nil { - return nil, rest.NewError("app_user not found").WithCode(404) + return nil, vigo.NewError("app_user not found").WithCode(404) } updates := map[string]interface{}{} diff --git a/api/app/init.go b/api/app/init.go index 0bca08f..741e861 100644 --- a/api/app/init.go +++ b/api/app/init.go @@ -12,14 +12,14 @@ import ( "github.com/veypi/OneAuth/api/app/app_user" "github.com/veypi/OneAuth/api/app/resource" "github.com/veypi/OneAuth/api/app/role" - "github.com/veypi/OneBD/rest" + "github.com/vyes/vigo" ) -var Router = rest.NewRouter() +var Router = vigo.NewRouter() var appRouter = Router.SubRouter(":app_id") var ( - _ = appRouter.Extend("resource",resource.Router) - _ = appRouter.Extend("user", app_user.Router) - _ = appRouter.Extend("role", role.Router) - _ =appRouter.Extend("access", access.Router) + _ = appRouter.Extend("resource", resource.Router) + _ = appRouter.Extend("user", app_user.Router) + _ = appRouter.Extend("role", role.Router) + _ = appRouter.Extend("access", access.Router) ) diff --git a/api/app/resource/create.go b/api/app/resource/create.go index 77dd772..66097fe 100644 --- a/api/app/resource/create.go +++ b/api/app/resource/create.go @@ -1,7 +1,7 @@ package resource import ( - "github.com/veypi/OneBD/rest" + "github.com/vyes/vigo" "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/models" ) @@ -14,7 +14,7 @@ type createOpts struct { Des string `json:"des" parse:"json"` } -func createResource(x *rest.X) (any, error) { +func createResource(x *vigo.X) (any, error) { // 解析参数 opts := &createOpts{} if err := x.Parse(opts); err != nil { @@ -30,7 +30,7 @@ func createResource(x *rest.X) (any, error) { // 保存到数据库 if err := cfg.DB().Create(resource).Error; err != nil { - return nil, rest.NewError("failed to create resource").WithCode(500) + return nil, vigo.NewError("failed to create resource").WithCode(500) } return resource, nil diff --git a/api/app/resource/del.go b/api/app/resource/del.go index 350a7fc..b6ff189 100644 --- a/api/app/resource/del.go +++ b/api/app/resource/del.go @@ -1,7 +1,7 @@ package resource import ( - "github.com/veypi/OneBD/rest" + "github.com/vyes/vigo" "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/models" ) @@ -12,7 +12,7 @@ type deleteOpts struct { ResourceID string `parse:"path"` } -func deleteResource(x *rest.X) (any, error) { +func deleteResource(x *vigo.X) (any, error) { // 解析参数 opts := &deleteOpts{} if err := x.Parse(opts); err != nil { @@ -22,12 +22,12 @@ func deleteResource(x *rest.X) (any, error) { // 查找资源 resource := &models.Resource{} if err := cfg.DB().Where("id = ?", opts.ResourceID).First(resource).Error; err != nil { - return nil, rest.NewError("resource not found").WithCode(404) + return nil, vigo.NewError("resource not found").WithCode(404) } // 删除资源 if err := cfg.DB().Delete(resource).Error; err != nil { - return nil, rest.NewError("failed to delete resource").WithCode(500) + return nil, vigo.NewError("failed to delete resource").WithCode(500) } return map[string]interface{}{ diff --git a/api/app/resource/get.go b/api/app/resource/get.go index ceef4e9..222fb82 100644 --- a/api/app/resource/get.go +++ b/api/app/resource/get.go @@ -1,25 +1,25 @@ package resource import ( - "github.com/veypi/OneBD/rest" + "github.com/vyes/vigo" "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/models" ) var _ = Router.Get("/:resource_id", getResource) -func getResource(x *rest.X) (any, error) { +func getResource(x *vigo.X) (any, error) { // 获取路径参数 resourceID := x.Params.Get("resource_id") if resourceID == "" { - return nil, rest.NewError("resource_id is required").WithCode(400) + return nil, vigo.NewError("resource_id is required").WithCode(400) } // 查询数据库 resource := &models.Resource{} err := cfg.DB().Where("id = ?", resourceID).First(resource).Error if err != nil { - return nil, rest.NewError("resource not found").WithCode(404) + return nil, vigo.NewError("resource not found").WithCode(404) } return resource, nil diff --git a/api/app/resource/init.go b/api/app/resource/init.go index 77e9e8a..3f790d4 100644 --- a/api/app/resource/init.go +++ b/api/app/resource/init.go @@ -8,7 +8,7 @@ package resource import ( - "github.com/veypi/OneBD/rest" + "github.com/vyes/vigo" ) -var Router = rest.NewRouter() +var Router = vigo.NewRouter() diff --git a/api/app/resource/list.go b/api/app/resource/list.go index 7c346a5..566068c 100644 --- a/api/app/resource/list.go +++ b/api/app/resource/list.go @@ -1,7 +1,7 @@ package resource import ( - "github.com/veypi/OneBD/rest" + "github.com/vyes/vigo" "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/models" ) @@ -20,7 +20,7 @@ type listResponse struct { var _ = Router.Get("/", listResources) -func listResources(x *rest.X) (any, error) { +func listResources(x *vigo.X) (any, error) { // 解析参数 opts := &listOpts{} if err := x.Parse(opts); err != nil { diff --git a/api/app/resource/patch.go b/api/app/resource/patch.go index be05f82..79ca1a9 100644 --- a/api/app/resource/patch.go +++ b/api/app/resource/patch.go @@ -1,7 +1,7 @@ package resource import ( - "github.com/veypi/OneBD/rest" + "github.com/vyes/vigo" "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/models" ) @@ -14,7 +14,7 @@ type updateOpts struct { Des *string `json:"des" parse:"json"` } -func updateResource(x *rest.X) (any, error) { +func updateResource(x *vigo.X) (any, error) { // 解析参数 opts := &updateOpts{} if err := x.Parse(opts); err != nil { @@ -24,7 +24,7 @@ func updateResource(x *rest.X) (any, error) { // 查找资源 resource := &models.Resource{} if err := cfg.DB().Where("id = ?", opts.ResourceID).First(resource).Error; err != nil { - return nil, rest.NewError("resource not found").WithCode(404) + return nil, vigo.NewError("resource not found").WithCode(404) } // 更新字段 @@ -39,7 +39,7 @@ func updateResource(x *rest.X) (any, error) { // 执行更新 if len(updates) > 0 { if err := cfg.DB().Model(resource).Updates(updates).Error; err != nil { - return nil, rest.NewError("failed to update resource").WithCode(500) + return nil, vigo.NewError("failed to update resource").WithCode(500) } } return resource, nil diff --git a/api/app/role/create.go b/api/app/role/create.go index e170887..e70e232 100644 --- a/api/app/role/create.go +++ b/api/app/role/create.go @@ -3,7 +3,7 @@ package role import ( "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/models" - "github.com/veypi/OneBD/rest" + "github.com/vyes/vigo" ) var _ = Router.Post("/", createRole) @@ -14,7 +14,7 @@ type createOpts struct { Des string `json:"des"` // 角色描述 } -func createRole(x *rest.X) (any, error) { +func createRole(x *vigo.X) (any, error) { // 解析参数 opts := &createOpts{} if err := x.Parse(opts); err != nil { diff --git a/api/app/role/del.go b/api/app/role/del.go index a44e242..0f8c889 100644 --- a/api/app/role/del.go +++ b/api/app/role/del.go @@ -1,7 +1,7 @@ package role import ( - "github.com/veypi/OneBD/rest" + "github.com/vyes/vigo" "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/models" ) @@ -12,7 +12,7 @@ type deleteOpts struct { RoleID string `parse:"path"` // 角色 ID } -func deleteRole(x *rest.X) (any, error) { +func deleteRole(x *vigo.X) (any, error) { // 解析参数 opts := &deleteOpts{} if err := x.Parse(opts); err != nil { @@ -22,7 +22,7 @@ func deleteRole(x *rest.X) (any, error) { // 查找角色 role := &models.Role{} if err := cfg.DB().Where("id = ?", opts.RoleID).First(role).Error; err != nil { - return nil, rest.NewError("role not found").WithCode(404) + return nil, vigo.NewError("role not found").WithCode(404) } // 执行删除操作 diff --git a/api/app/role/get.go b/api/app/role/get.go index 39f3338..3d6a56d 100644 --- a/api/app/role/get.go +++ b/api/app/role/get.go @@ -1,25 +1,25 @@ package role import ( - "github.com/veypi/OneBD/rest" + "github.com/vyes/vigo" "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/models" ) var _ = Router.Get("/:role_id", getRole) -func getRole(x *rest.X) (any, error) { +func getRole(x *vigo.X) (any, error) { // 获取角色 ID roleID := x.Params.Get("role_id") if roleID == "" { - return nil, rest.NewError("role_id is required").WithCode(400) + return nil, vigo.NewError("role_id is required").WithCode(400) } // 查询数据库 role := &models.Role{} err := cfg.DB().Where("id = ?", roleID).First(role).Error if err != nil { - return nil, rest.NewError("role not found").WithCode(404) + return nil, vigo.NewError("role not found").WithCode(404) } return role, nil diff --git a/api/app/role/init.go b/api/app/role/init.go index 6dc7ad0..5415b74 100644 --- a/api/app/role/init.go +++ b/api/app/role/init.go @@ -8,7 +8,7 @@ package role import ( - "github.com/veypi/OneBD/rest" + "github.com/vyes/vigo" ) -var Router = rest.NewRouter() +var Router = vigo.NewRouter() diff --git a/api/app/role/list.go b/api/app/role/list.go index 1465d6a..0f0d566 100644 --- a/api/app/role/list.go +++ b/api/app/role/list.go @@ -3,7 +3,7 @@ package role import ( "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/models" - "github.com/veypi/OneBD/rest" + "github.com/vyes/vigo" ) var _ = Router.Get("/", listRoles) @@ -21,7 +21,7 @@ type listResponse struct { Items []*models.Role `json:"items"` } -func listRoles(x *rest.X) (any, error) { +func listRoles(x *vigo.X) (any, error) { // 解析参数 opts := &listOpts{} if err := x.Parse(opts); err != nil { diff --git a/api/app/role/patch.go b/api/app/role/patch.go index 941ad6f..828af0e 100644 --- a/api/app/role/patch.go +++ b/api/app/role/patch.go @@ -3,7 +3,7 @@ package role import ( "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/models" - "github.com/veypi/OneBD/rest" + "github.com/vyes/vigo" ) var _ = Router.Patch("/:role_id", updateRole) @@ -14,7 +14,7 @@ type updateOpts struct { Des *string `json:"des"` // 可选,角色描述 } -func updateRole(x *rest.X) (any, error) { +func updateRole(x *vigo.X) (any, error) { // 解析参数 opts := &updateOpts{} if err := x.Parse(opts); err != nil { @@ -24,7 +24,7 @@ func updateRole(x *rest.X) (any, error) { // 查找角色 role := &models.Role{} if err := cfg.DB().Where("id = ?", opts.RoleID).First(role).Error; err != nil { - return nil, rest.NewError("role not found").WithCode(404) + return nil, vigo.NewError("role not found").WithCode(404) } // 准备更新字段 diff --git a/api/init.go b/api/init.go index 945cce9..ab5d11b 100644 --- a/api/init.go +++ b/api/init.go @@ -13,19 +13,18 @@ import ( "github.com/veypi/OneAuth/api/app" "github.com/veypi/OneAuth/api/token" "github.com/veypi/OneAuth/api/user" - "github.com/veypi/OneBD/rest" - "github.com/veypi/OneBD/rest/middlewares" + "github.com/vyes/vigo" + "github.com/vyes/vigo/middlewares/common" ) -var Router = rest.NewRouter().UseAfter(middlewares.JsonResponse, middlewares.JsonErrorResponse) +var Router = vigo.NewRouter().UseAfter(common.JsonResponse, common.JsonErrorResponse) var ( - _ = Router.Extend("user", user.Router,) - _ = Router.Extend("token", token.Router) - _ = Router.Extend("app", app.Router) + _ = Router.Extend("user", user.Router) + _ = Router.Extend("token", token.Router) + _ = Router.Extend("app", app.Router) ) -var _ = Router.Any("*", func(x *rest.X) error { +var _ = Router.Any("*", func(x *vigo.X) error { return fmt.Errorf("404") }) - diff --git a/api/token/base.go b/api/token/base.go index 607c03c..042108a 100644 --- a/api/token/base.go +++ b/api/token/base.go @@ -5,7 +5,7 @@ import ( "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/models" - "github.com/veypi/OneBD/rest" + "github.com/vyes/vigo" ) var _ = Router.Patch("/:token_id", tokenPatch) @@ -16,7 +16,7 @@ type patchOpts struct { OverPerm *string `json:"over_perm" parse:"json"` } -func tokenPatch(x *rest.X) (any, error) { +func tokenPatch(x *vigo.X) (any, error) { opts := &patchOpts{} err := x.Parse(opts) if err != nil { @@ -42,7 +42,7 @@ func tokenPatch(x *rest.X) (any, error) { var _ = Router.Delete("/:token_id", tokenDelete) -func tokenDelete(x *rest.X) (any, error) { +func tokenDelete(x *vigo.X) (any, error) { data := &models.Token{} err := cfg.DB().Where("id = ?", x.Params.Get("token_id")).Delete(data).Error return data, err diff --git a/api/token/create.go b/api/token/create.go index 407b422..c1ae401 100644 --- a/api/token/create.go +++ b/api/token/create.go @@ -15,8 +15,8 @@ import ( "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/libs/auth" "github.com/veypi/OneAuth/models" - "github.com/veypi/OneBD/rest" - "github.com/veypi/utils/logv" + "github.com/vyes/vigo" + "github.com/vyes/vigo/logv" ) type postOpts struct { @@ -33,7 +33,7 @@ type postOpts struct { var _ = Router.Post("/", tokenPost) // for user login app -func tokenPost(x *rest.X) (any, error) { +func tokenPost(x *vigo.X) (any, error) { opts := &postOpts{} err := x.Parse(opts) if err != nil { @@ -58,7 +58,7 @@ func tokenPost(x *rest.X) (any, error) { return nil, err } if refresh.ID == "" { - return nil, rest.ErrNotAuthorized + return nil, vigo.ErrNotAuthorized } err = cfg.DB().Where("id = ?", refresh.ID).First(data).Error if err != nil { @@ -106,7 +106,7 @@ func tokenPost(x *rest.X) (any, error) { claim.ExpiresAt = jwt.NewNumericDate(newToken.ExpiredAt) return auth.GenJwt(claim) } else { - return nil, rest.ErrNotPermitted + return nil, vigo.ErrNotPermitted } } else if typ == "ufs" { claim.AID = refresh.AID @@ -130,9 +130,9 @@ func tokenPost(x *rest.X) (any, error) { http.SetCookie(x, cookie) return token, nil } else { - return nil, rest.ErrArgInvalid + return nil, vigo.ErrArgInvalid } } else { - return nil, rest.ErrArgInvalid + return nil, vigo.ErrArgInvalid } } diff --git a/api/token/get.go b/api/token/get.go index dc1ce27..d45d405 100644 --- a/api/token/get.go +++ b/api/token/get.go @@ -10,7 +10,7 @@ package token import ( "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/models" - "github.com/veypi/OneBD/rest" + "github.com/vyes/vigo" ) type getOpts struct { @@ -19,7 +19,7 @@ type getOpts struct { var _ = Router.Get("/:token_id", tokenGet) -func tokenGet(x *rest.X) (any, error) { +func tokenGet(x *vigo.X) (any, error) { opts := &getOpts{} err := x.Parse(opts) if err != nil { @@ -38,7 +38,7 @@ type listOpts struct { var _ = Router.Get("/", tokenList) -func tokenList(x *rest.X) (any, error) { +func tokenList(x *vigo.X) (any, error) { opts := &listOpts{} err := x.Parse(opts) if err != nil { diff --git a/api/token/init.go b/api/token/init.go index e2e49c2..e0a0a46 100644 --- a/api/token/init.go +++ b/api/token/init.go @@ -8,7 +8,7 @@ package token import ( - "github.com/veypi/OneBD/rest" + "github.com/vyes/vigo" ) -var Router = rest.NewRouter() +var Router = vigo.NewRouter() diff --git a/api/user/create.go b/api/user/create.go index 0e2bd7b..954e857 100644 --- a/api/user/create.go +++ b/api/user/create.go @@ -17,9 +17,9 @@ import ( "github.com/google/uuid" "github.com/veypi/OneAuth/cfg" + "github.com/veypi/OneAuth/libs/utils" "github.com/veypi/OneAuth/models" - "github.com/veypi/OneBD/rest" - "github.com/veypi/utils" + "github.com/vyes/vigo" "gorm.io/gorm" ) @@ -34,7 +34,7 @@ type postOpts struct { Phone *string `json:"phone" gorm:"varchar(50);unique;default:null" parse:"json"` } -func userPost(x *rest.X) (any, error) { +func userPost(x *vigo.X) (any, error) { opts := &postOpts{} err := x.Parse(opts) if err != nil { @@ -47,20 +47,20 @@ func userPost(x *rest.X) (any, error) { data.Code = opts.Code data.Salt = utils.RandSeq(16) if len(data.Username) < 2 { - return nil, rest.ErrArgInvalid.WithArgs("username length") + return nil, vigo.ErrArgInvalid.WithArgs("username length") } code, err := base64.URLEncoding.DecodeString(opts.Code) if err != nil || len(code) < 8 { - return nil, rest.ErrArgInvalid.WithArgs("code") + return nil, vigo.ErrArgInvalid.WithArgs("code") } code = utils.PKCS7Padding(code, 32) data.Code, err = utils.AesEncrypt([]byte(data.ID), code, []byte(data.Salt)) if err != nil { - return nil, rest.ErrArgInvalid.WithArgs("code") + return nil, vigo.ErrArgInvalid.WithArgs("code") } ncode, err := utils.AesDecrypt([]byte(data.Code), code, []byte(data.Salt)) if err != nil || ncode != data.ID { - return nil, rest.ErrInternalServer.WithString("code decrypt failed") + return nil, vigo.ErrInternalServer.WithString("code decrypt failed") } if opts.Nickname != nil { data.Nickname = *opts.Nickname @@ -90,7 +90,7 @@ func userPost(x *rest.X) (any, error) { status := "ok" switch app.Typ { case "private": - return rest.ErrNotPermitted.WithArgs("not enable register") + return vigo.ErrNotPermitted.WithArgs("not enable register") case "apply": status = "applying" case "public": diff --git a/api/user/init.go b/api/user/init.go index 0ad5461..3703e35 100644 --- a/api/user/init.go +++ b/api/user/init.go @@ -9,11 +9,11 @@ package user import ( "github.com/veypi/OneAuth/api/user/role" - "github.com/veypi/OneBD/rest" + "github.com/vyes/vigo" ) -var Router = rest.NewRouter() +var Router = vigo.NewRouter() var ( - _ = Router.Extend("/:user_id/user_role", role.Router) + _ = Router.Extend("/:user_id/user_role", role.Router) ) diff --git a/api/user/login.go b/api/user/login.go index 261b296..eddfe60 100644 --- a/api/user/login.go +++ b/api/user/login.go @@ -14,10 +14,10 @@ import ( "github.com/golang-jwt/jwt/v5" "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/libs/auth" + "github.com/veypi/OneAuth/libs/utils" "github.com/veypi/OneAuth/models" - "github.com/veypi/OneBD/rest" - "github.com/veypi/utils" - "github.com/veypi/utils/logv" + "github.com/vyes/vigo" + "github.com/vyes/vigo/logv" ) var _ = Router.Post("/login", userLogin) @@ -32,7 +32,7 @@ type loginOpts struct { Device *string `json:"device" parse:"json"` } -func userLogin(x *rest.X) (any, error) { +func userLogin(x *vigo.X) (any, error) { // Implement login logic here // For example, validate user credentials and return a token opts := &loginOpts{} @@ -61,14 +61,14 @@ func userLogin(x *rest.X) (any, error) { logv.Info().Str("user", user.ID).Msg("login") code, err := base64.URLEncoding.DecodeString(opts.Code) if err != nil { - return nil, rest.ErrArgInvalid.WithArgs("code") + return nil, vigo.ErrArgInvalid.WithArgs("code") } logv.Warn().Msgf("code: %s", code) ncode, err := utils.AesDecrypt([]byte(user.Code), utils.PKCS7Padding(code, 32), []byte(user.Salt)) logv.Warn().Msgf("id: %s\n%s", ncode, user.ID) if err != nil || string(ncode) != user.ID { - return nil, rest.ErrNotAuthorized + return nil, vigo.ErrNotAuthorized } aid := cfg.Config.ID if opts.AppID != nil && *opts.AppID != "" { diff --git a/api/user/role/create.go b/api/user/role/create.go index 7a75e3f..739e74b 100644 --- a/api/user/role/create.go +++ b/api/user/role/create.go @@ -10,7 +10,7 @@ package role import ( "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/models" - "github.com/veypi/OneBD/rest" + "github.com/vyes/vigo" ) var _ = Router.Post("/", userRolePost) @@ -22,7 +22,7 @@ type postOpts struct { Status string `json:"status" parse:"json"` } -func userRolePost(x *rest.X) (any, error) { +func userRolePost(x *vigo.X) (any, error) { opts := &postOpts{} err := x.Parse(opts) if err != nil { diff --git a/api/user/role/del.go b/api/user/role/del.go index bd0f847..3b33daa 100644 --- a/api/user/role/del.go +++ b/api/user/role/del.go @@ -10,15 +10,15 @@ package role import ( "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/models" - "github.com/veypi/OneBD/rest" + "github.com/vyes/vigo" ) var _ = Router.Delete("/:id", userRoleDelete) -func userRoleDelete(x *rest.X) (any, error) { +func userRoleDelete(x *vigo.X) (any, error) { id := x.Params.Get("id") if id == "" { - return nil, rest.ErrArgInvalid.WithArgs("id") + return nil, vigo.ErrArgInvalid.WithArgs("id") } data := &models.UserRole{} err := cfg.DB().Where("id = ?", id).Delete(data).Error diff --git a/api/user/role/get.go b/api/user/role/get.go index e926a97..9599f9d 100644 --- a/api/user/role/get.go +++ b/api/user/role/get.go @@ -11,14 +11,14 @@ import ( "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/models" - "github.com/veypi/OneBD/rest" + "github.com/vyes/vigo" ) var _ = Router.Get("/:id", ` get user role `, userRoleGet) -func userRoleGet(x *rest.X) (any, error) { +func userRoleGet(x *vigo.X) (any, error) { data := &models.UserRole{} err := cfg.DB().Where("id = ?", x.Params.Get("id")).First(data).Error return data, err @@ -35,7 +35,7 @@ type listOpts struct { Status *string `json:"status" parse:"query"` } -func userRoleList(x *rest.X) (any, error) { +func userRoleList(x *vigo.X) (any, error) { opts := &listOpts{} err := x.Parse(opts) if err != nil { diff --git a/api/user/role/init.go b/api/user/role/init.go index f5c2d5d..a5564c7 100644 --- a/api/user/role/init.go +++ b/api/user/role/init.go @@ -7,6 +7,6 @@ package role -import "github.com/veypi/OneBD/rest" +import "github.com/vyes/vigo" -var Router = rest.NewRouter() +var Router = vigo.NewRouter() diff --git a/api/user/role/patch.go b/api/user/role/patch.go index 8004c2a..e9a71d1 100644 --- a/api/user/role/patch.go +++ b/api/user/role/patch.go @@ -10,7 +10,7 @@ package role import ( "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/models" - "github.com/veypi/OneBD/rest" + "github.com/vyes/vigo" ) type patchOpts struct { @@ -20,7 +20,7 @@ type patchOpts struct { var _ = Router.Patch("/:id", userRolePatch) -func userRolePatch(x *rest.X) (any, error) { +func userRolePatch(x *vigo.X) (any, error) { opts := &patchOpts{} err := x.Parse(opts) if err != nil { diff --git a/api/user/user.go b/api/user/user.go index f426933..268f962 100644 --- a/api/user/user.go +++ b/api/user/user.go @@ -4,12 +4,12 @@ import ( "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/libs/auth" "github.com/veypi/OneAuth/models" - "github.com/veypi/OneBD/rest" + "github.com/vyes/vigo" ) var _ = Router.Delete("/:user_id", auth.Check("user", "user_id", auth.DoDelete), userDelete) -func userDelete(x *rest.X) (any, error) { +func userDelete(x *vigo.X) (any, error) { data := &models.User{} err := cfg.DB().Where("id = ?", x.Params.Get("user_id")).Delete(data).Error return data, err @@ -21,7 +21,7 @@ type getOpts struct { ID string `json:"id" parse:"path@user_id"` } -func userGet(x *rest.X) (any, error) { +func userGet(x *vigo.X) (any, error) { opts := &getOpts{} err := x.Parse(opts) if err != nil { @@ -44,7 +44,7 @@ type listOpts struct { Status *uint `json:"status" parse:"query"` } -func userList(x *rest.X) (any, error) { +func userList(x *vigo.X) (any, error) { opts := &listOpts{} err := x.Parse(opts) if err != nil { @@ -85,7 +85,7 @@ type patchOpts struct { Status *uint `json:"status" parse:"json"` } -func userPatch(x *rest.X) (any, error) { +func userPatch(x *vigo.X) (any, error) { opts := &patchOpts{} err := x.Parse(opts) if err != nil { diff --git a/cfg/cfg.go b/cfg/cfg.go index 6aeee60..7fce073 100644 --- a/cfg/cfg.go +++ b/cfg/cfg.go @@ -18,7 +18,7 @@ type Options struct { } var Config = &Options{ - TokenExpire: time.Minute / 2, + TokenExpire: time.Minute * 30, ID: "test", Key: "asdfghjklqwertyuiopzxcvbnm1234567890", } diff --git a/cfg/db.go b/cfg/db.go index b632d77..68f471b 100644 --- a/cfg/db.go +++ b/cfg/db.go @@ -21,11 +21,12 @@ func DB() *gorm.DB { if db == nil { var err error var conn gorm.Dialector - if Config.DB == "mysql" { + switch Config.DB { + case "mysql": conn = mysql.Open(Config.DSN) - } else if Config.DB == "postgres" { + case "postgres": conn = postgres.Open(Config.DSN) - } else { + default: conn = sqlite.Open(Config.DSN) } db, err = gorm.Open(conn, diff --git a/cli/main.go b/cli/main.go index 3126ef3..1f7ba85 100644 --- a/cli/main.go +++ b/cli/main.go @@ -11,9 +11,9 @@ import ( "github.com/veypi/OneAuth" "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/models" - "github.com/veypi/OneBD/rest" - "github.com/veypi/utils/flags" - "github.com/veypi/utils/logv" + "github.com/vyes/vigo" + "github.com/vyes/vigo/flags" + "github.com/vyes/vigo/logv" ) var cmdMain = flags.New("app", "the backend server of app") @@ -61,7 +61,7 @@ func main() { } func runWeb() error { - server, err := rest.New(rest.WithHost(cliOpts.Host), rest.WithPort(cliOpts.Port)) + server, err := vigo.New(vigo.WithHost(cliOpts.Host), vigo.WithPort(cliOpts.Port)) if err != nil { return err } diff --git a/errs/errors.go b/errs/errors.go index 66a9506..96aec31 100644 --- a/errs/errors.go +++ b/errs/errors.go @@ -7,12 +7,12 @@ package errs -import "github.com/veypi/OneBD/rest" +import "github.com/vyes/vigo" var ( - AuthNotFound = rest.NewError("auth not found").WithCode(40100) - AuthFailed = rest.NewError("auth failed").WithCode(40101) - AuthExpired = rest.NewError("auth expired").WithCode(40102) - AuthInvalid = rest.NewError("auth invalid").WithCode(40103) - AuthNoPerm = rest.NewError("auth no permission").WithCode(40104) + AuthNotFound = vigo.NewError("auth not found").WithCode(40100) + AuthFailed = vigo.NewError("auth failed").WithCode(40101) + AuthExpired = vigo.NewError("auth expired").WithCode(40102) + AuthInvalid = vigo.NewError("auth invalid").WithCode(40103) + AuthNoPerm = vigo.NewError("auth no permission").WithCode(40104) ) diff --git a/go.mod b/go.mod index b369016..b1c1fe0 100644 --- a/go.mod +++ b/go.mod @@ -1,29 +1,26 @@ module github.com/veypi/OneAuth -go 1.23.2 +go 1.24.1 replace github.com/veypi/vyes-ui => ../vyes-ui/ -replace github.com/veypi/OneBD => ../OneBD/ - -replace github.com/veypi/utils => ../utils/ +replace github.com/vyes/vigo => ../vigo/ require ( github.com/glebarez/sqlite v1.11.0 - github.com/go-sql-driver/mysql v1.7.0 github.com/golang-jwt/jwt/v5 v5.2.2 github.com/google/uuid v1.6.0 - github.com/veypi/OneBD v0.0.0-00010101000000-000000000000 - github.com/veypi/utils v0.3.7 github.com/veypi/vyes-ui v0.0.0-00010101000000-000000000000 + github.com/vyes/vigo v0.0.0-00010101000000-000000000000 gorm.io/driver/mysql v1.5.7 gorm.io/driver/postgres v1.5.11 - gorm.io/gorm v1.25.12 + gorm.io/gorm v1.30.0 ) require ( github.com/dustin/go-humanize v1.0.1 // indirect github.com/glebarez/go-sqlite v1.21.2 // indirect + github.com/go-sql-driver/mysql v1.7.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect github.com/jackc/pgx/v5 v5.5.5 // indirect @@ -31,16 +28,17 @@ require ( github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/kr/text v0.2.0 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rogpeppe/go-internal v1.14.1 // indirect - github.com/rs/zerolog v1.17.2 // indirect - golang.org/x/crypto v0.17.0 // indirect - golang.org/x/net v0.10.0 // indirect - golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.26.0 // indirect - golang.org/x/text v0.14.0 // indirect - gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect + github.com/rs/zerolog v1.34.0 // indirect + golang.org/x/crypto v0.40.0 // indirect + golang.org/x/net v0.42.0 // indirect + golang.org/x/sync v0.16.0 // indirect + golang.org/x/sys v0.34.0 // indirect + golang.org/x/text v0.27.0 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect modernc.org/libc v1.22.5 // indirect modernc.org/mathutil v1.5.0 // indirect diff --git a/go.sum b/go.sum index b94ad22..e3b939c 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,4 @@ -github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= -github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -13,6 +11,7 @@ github.com/glebarez/sqlite v1.11.0 h1:wSG0irqzP6VurnMEpFGer5Li19RpIRi2qvQz++w0GM github.com/glebarez/sqlite v1.11.0/go.mod h1:h8/o8j5wiAsqSPoWELDUdJXhjAhsVliSn7bWZjOhrgQ= github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= @@ -35,9 +34,12 @@ github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= @@ -45,40 +47,34 @@ github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94 github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/zerolog v1.17.2 h1:RMRHFw2+wF7LO0QqtELQwo8hqSmqISyCJeFeAAuWcRo= -github.com/rs/zerolog v1.17.2/go.mod h1:9nvC1axdVrAHcu/s9taAVfBuIdTZLVQmKQyvrUjF5+I= +github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= +github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY= +github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +github.com/veypi/utils v0.4.2 h1:utIQwkLRDssddbAcZz2Q9xPm3nfANPKsD5lmIGBa7CA= +github.com/veypi/utils v0.4.2/go.mod h1:GDeV3o1EE73dRrZ3cu/j97gPwXyzqtkWiM3D2I+e+6k= +golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= +golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= +golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= +golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= +golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= +golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= -golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/tools v0.0.0-20190828213141-aed303cbaa74/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= +golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= +golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -87,8 +83,8 @@ gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkD gorm.io/driver/postgres v1.5.11 h1:ubBVAfbKEUld/twyKZ0IYn9rSQh448EdelLYk9Mv314= gorm.io/driver/postgres v1.5.11/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI= gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= -gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8= -gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ= +gorm.io/gorm v1.30.0 h1:qbT5aPv1UH8gI99OsRlvDToLxW5zR7FzS9acZDOZcgs= +gorm.io/gorm v1.30.0/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE= modernc.org/libc v1.22.5 h1:91BNch/e5B0uPbJFgqbxXuOnxBQjlS//icfQEGmvyjE= modernc.org/libc v1.22.5/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY= modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= diff --git a/init.go b/init.go index 92aef44..30845ad 100644 --- a/init.go +++ b/init.go @@ -9,12 +9,12 @@ package OneAuth import ( "embed" "github.com/veypi/OneAuth/api" - "github.com/veypi/OneBD/rest" - "github.com/veypi/OneBD/rest/middlewares/vyes" + "github.com/vyes/vigo" + "github.com/vyes/vigo/middlewares/vyes" "github.com/veypi/vyes-ui" ) -var Router = rest.NewRouter() +var Router = vigo.NewRouter() //go:embed ui/* var uifs embed.FS diff --git a/libs/auth/jwt.go b/libs/auth/jwt.go index 32b9b13..9070f4e 100644 --- a/libs/auth/jwt.go +++ b/libs/auth/jwt.go @@ -16,7 +16,7 @@ import ( "github.com/golang-jwt/jwt/v5" "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/errs" - "github.com/veypi/OneBD/rest" + "github.com/vyes/vigo" ) func GenJwt(claim *Claims) (string, error) { @@ -49,7 +49,7 @@ func ParseJwt(tokenString string) (*Claims, error) { return claims, nil } -func checkJWT(x *rest.X) (*Claims, error) { +func checkJWT(x *vigo.X) (*Claims, error) { authHeader := x.Request.Header.Get("Authorization") if authHeader == "" { authHeader = x.Request.URL.Query().Get("Authorization") @@ -70,12 +70,12 @@ func checkJWT(x *rest.X) (*Claims, error) { return claims, nil } -func CheckJWT(x *rest.X) (any, error) { +func CheckJWT(x *vigo.X) (any, error) { return checkJWT(x) } -func Check(target string, pid string, l AuthLevel) func(x *rest.X) (any, error) { - return func(x *rest.X) (any, error) { +func Check(target string, pid string, l AuthLevel) func(x *vigo.X) (any, error) { + return func(x *vigo.X) (any, error) { claims, err := checkJWT(x) if err != nil { return nil, err diff --git a/libs/libs.go b/libs/libs.go deleted file mode 100644 index 07d2ef9..0000000 --- a/libs/libs.go +++ /dev/null @@ -1,25 +0,0 @@ -// -// libs.go -// Copyright (C) 2024 veypi -// 2024-11-04 21:50 -// Distributed under terms of the GPL license. -// - -package libs - -import ( - "net/http" - - "github.com/veypi/OneBD/rest" -) - -func CorsAllowAny(x *rest.X) { - origin := x.Request.Header.Get("Origin") - x.Header().Set("Access-Control-Allow-Origin", origin) - x.Header().Set("Access-Control-Allow-Credentials", "true") - x.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, PATCH, PROPFIND") - x.Header().Set("Access-Control-Allow-Headers", "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, depth") - if x.Request.Method == http.MethodOptions && x.Request.Header.Get("Access-Control-Request-Method") != "" { - x.Stop() - } -} diff --git a/libs/utils/crypto.go b/libs/utils/crypto.go new file mode 100644 index 0000000..7f8bbc1 --- /dev/null +++ b/libs/utils/crypto.go @@ -0,0 +1,173 @@ +package utils + +// +// crypto.go +// Copyright (C) 2020 light +// +// Distributed under terms of the MIT license. +// + +import ( + "bytes" + "crypto" + "crypto/aes" + "crypto/cipher" + "crypto/rand" + "crypto/rsa" + "crypto/sha256" + "crypto/x509" + "encoding/base64" + "encoding/pem" + "errors" +) + +// PKCS7Padding 添加 PKCS#7 填充 +func PKCS7Padding(ciphertext []byte, blockSize int) []byte { + padding := blockSize - len(ciphertext)%blockSize + padtext := bytes.Repeat([]byte{byte(padding)}, padding) + return append(ciphertext, padtext...) +} + +// PKCS7UnPadding 移除 PKCS#7 填充 +func PKCS7UnPadding(origData []byte) ([]byte, bool) { + length := len(origData) + unpadding := int(origData[length-1]) + if unpadding >= length { + return nil, false + } + return origData[:(length - unpadding)], true +} + +// AesEncrypt 使用 AES-256-CBC 进行加密 +// key 256 bit / 32 Byte +// iv 128 bit / 16 Byte +func AesEncrypt(plaintext, key, iv []byte) (string, error) { + block, err := aes.NewCipher(key) + if err != nil { + return "", err + } + + plaintext = PKCS7Padding(plaintext, block.BlockSize()) + blockMode := cipher.NewCBCEncrypter(block, iv) + crypted := make([]byte, len(plaintext)) + blockMode.CryptBlocks(crypted, plaintext) + + return base64.StdEncoding.EncodeToString(crypted), nil +} + +// AesDecrypt 使用 AES-256-CBC 进行解密 +func AesDecrypt(encrypted, key, iv []byte) (string, error) { + block, err := aes.NewCipher(key) + if err != nil { + return "", err + } + + encrypted, err = base64.StdEncoding.DecodeString(string(encrypted)) + if err != nil { + return "", err + } + + blockMode := cipher.NewCBCDecrypter(block, iv) + origData := make([]byte, len(encrypted)) + blockMode.CryptBlocks(origData, encrypted) + origData, ok := PKCS7UnPadding(origData) + if !ok { + return "", errors.New("PKCS7UnPadding error") + } + return string(origData), nil +} + +// rsa + +func GetRsaKey(bits int) (public *rsa.PublicKey, private *rsa.PrivateKey, err error) { + private, err = rsa.GenerateKey(rand.Reader, bits) + if err != nil { + return + } + public = &private.PublicKey + return +} + +func GetPublicStr(key *rsa.PublicKey) (string, error) { + der, err := x509.MarshalPKIXPublicKey(key) + if err != nil { + return "", err + } + publicBlock := &pem.Block{ + Type: "PUBLIC KEY", + Bytes: der, + } + return string(pem.EncodeToMemory(publicBlock)), nil +} + +func GetPrivateStr(key *rsa.PrivateKey) (string, error) { + derStream := x509.MarshalPKCS1PrivateKey(key) + priBlock := &pem.Block{ + Type: "RSA PRIVATE KEY", + Bytes: derStream, + } + return string(pem.EncodeToMemory(priBlock)), nil +} + +func GetPublicFromStr(key string) (*rsa.PublicKey, error) { + //解密pem格式的公钥 + block, _ := pem.Decode([]byte(key)) + if block == nil { + return nil, errors.New("public key error") + } + // 解析公钥 + pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes) + if err != nil { + return nil, err + } + // 类型断言 + pub := pubInterface.(*rsa.PublicKey) + return pub, nil +} + +func GetPrivateFromStr(key string) (*rsa.PrivateKey, error) { + block, _ := pem.Decode([]byte(key)) + if block == nil { + return nil, errors.New("private key error") + } + //解析PKCS1格式的私钥 + return x509.ParsePKCS1PrivateKey(block.Bytes) +} + +func RsaEncode(msg string, key *rsa.PublicKey) (string, error) { + encryptedBytes, err := rsa.EncryptOAEP( + sha256.New(), + rand.Reader, + key, + []byte(msg), + nil) + if err != nil { + return "", err + } + return ToBase64(encryptedBytes), nil +} + +func RsaDecode(msg string, key *rsa.PrivateKey) (string, error) { + raw, err := FromBase64(msg) + if err != nil { + return "", err + } + decryptedBytes, err := key.Decrypt(nil, raw, &rsa.OAEPOptions{Hash: crypto.SHA256}) + return string(decryptedBytes), err +} + +func RsaSign(msg string, key *rsa.PrivateKey) (string, error) { + signature, err := rsa.SignPSS(rand.Reader, key, crypto.SHA256, HashSha256Byte([]byte(msg)), nil) + if err != nil { + return "", err + } + return ToBase64(signature), nil +} + +func RsaCheckSign(msg string, sign string, key *rsa.PublicKey) error { + raw, err := FromBase64(sign) + if err != nil { + return err + } + return rsa.VerifyPSS(key, crypto.SHA256, HashSha256Byte([]byte(msg)), raw, nil) +} diff --git a/libs/utils/hash.go b/libs/utils/hash.go new file mode 100644 index 0000000..c04f5d5 --- /dev/null +++ b/libs/utils/hash.go @@ -0,0 +1,36 @@ +package utils + +import ( + "crypto/md5" + "crypto/sha256" + "encoding/base64" + "encoding/hex" +) + +func HashMd5(s string) string { + h := md5.New() + h.Write([]byte(s)) + return hex.EncodeToString(h.Sum(nil)) +} + +func HashSha256Byte(msg []byte) []byte { + msgHash := sha256.New() + _, err := msgHash.Write(msg) + if err != nil { + panic(err) + } + msgHashSum := msgHash.Sum(nil) + return msgHashSum +} + +func HashSha256(msg string) string { + return hex.EncodeToString(HashSha256Byte([]byte(msg))) +} + +func ToBase64(src []byte) string { + return base64.StdEncoding.EncodeToString(src) +} + +func FromBase64(src string) ([]byte, error) { + return base64.StdEncoding.DecodeString(src) +} diff --git a/libs/utils/utils.go b/libs/utils/utils.go new file mode 100644 index 0000000..5a40bc7 --- /dev/null +++ b/libs/utils/utils.go @@ -0,0 +1,33 @@ +// +// utils.go +// Copyright (C) 2025 veypi +// 2025-07-15 17:13 +// Distributed under terms of the MIT license. +// + +package utils + +import ( + "math/rand" + "time" + "unsafe" +) + +var letters = []byte("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890") +var size = int32(len(letters)) +var seed = rand.New(rand.NewSource(time.Now().UnixNano())) + +// RandSeq produce random string seq +func RandSeq(n int) string { + b := make([]byte, n) + for i := range b { + b[i] = letters[seed.Int31n(size)] + } + return *(*string)(unsafe.Pointer(&b)) +} + +func Rand(n int) []byte { + b := make([]byte, n) + seed.Read(b) + return b +} diff --git a/libs/webdav/dir_render.go b/libs/webdav/dir_render.go index 5774fc6..4d08637 100644 --- a/libs/webdav/dir_render.go +++ b/libs/webdav/dir_render.go @@ -16,7 +16,7 @@ import ( "net/url" "strings" - "github.com/veypi/utils/logv" + "github.com/vyes/vigo/logv" ) type anyDirs interface { diff --git a/libs/webdav/webdav.go b/libs/webdav/webdav.go index 536989b..d04b315 100644 --- a/libs/webdav/webdav.go +++ b/libs/webdav/webdav.go @@ -17,7 +17,7 @@ import ( "strings" "time" - "github.com/veypi/utils/logv" + "github.com/vyes/vigo/logv" ) func NewWebdav(p string) *Handler { diff --git a/models/app.go b/models/app.go index 4497ecd..bb05694 100644 --- a/models/app.go +++ b/models/app.go @@ -1,7 +1,7 @@ package models import ( - "github.com/veypi/utils/logv" + "github.com/vyes/vigo/logv" "gorm.io/gorm" ) diff --git a/models/init.go b/models/init.go index c6d2552..cf4e3f0 100644 --- a/models/init.go +++ b/models/init.go @@ -12,8 +12,8 @@ import ( "time" "github.com/google/uuid" - "github.com/veypi/OneBD/rest/middlewares/crud" - "github.com/veypi/utils/logv" + "github.com/vyes/vigo/logv" + "github.com/vyes/vigo/middlewares/dbmodels" "gorm.io/gorm" ) @@ -31,23 +31,18 @@ func (m *BaseModel) BeforeCreate(tx *gorm.DB) error { return nil } -var AllModels = crud.New() +var AllModels = &dbmodels.ModelList{} func init() { AllModels.Append(User{}, AppUser{}, Resource{}, Access{}, Role{}, UserRole{}, Token{}, App{}) - AllModels.One2Many(App{}, Resource{}) - AllModels.One2Many(App{}, Role{}) - AllModels.One2Many(App{}, Access{}) - AllModels.Many2Many(AppUser{}, App{}, User{}) - AllModels.Many2Many(UserRole{}, App{}, User{}, Role{}) } func Migrate() error { - return crud.AutoMigrate(cfg.DB(), AllModels) + return AllModels.AutoMigrate(cfg.DB()) } func Drop() error { - return crud.AutoDrop(cfg.DB(), AllModels) + return AllModels.AutoDrop(cfg.DB()) } func InitDB() error { diff --git a/ui/ico.html b/ui/ico.html index 95a1026..62f4747 100644 --- a/ui/ico.html +++ b/ui/ico.html @@ -73,7 +73,7 @@
用户头像 {{ user.name }} -
diff --git a/ui/layout/default.html b/ui/layout/default.html index 19bd6bd..5506a62 100644 --- a/ui/layout/default.html +++ b/ui/layout/default.html @@ -111,14 +111,6 @@ diff --git a/ui/page/login.html b/ui/page/login.html index 7884185..853096b 100644 --- a/ui/page/login.html +++ b/ui/page/login.html @@ -399,8 +399,8 @@ username: signInForm.username, code: btoa(signInForm.password), }); - localStorage.setItem('refresh', loginResponse) if (loginResponse) { + localStorage.setItem('refresh', loginResponse) window.location.href = redirect } } catch (error) { diff --git a/ui/root.html b/ui/root.html index adaf169..2cfdcb8 100644 --- a/ui/root.html +++ b/ui/root.html @@ -15,17 +15,5 @@ - diff --git a/ui/routes.js b/ui/routes.js new file mode 100644 index 0000000..02ee3d8 --- /dev/null +++ b/ui/routes.js @@ -0,0 +1,69 @@ +/* + * routes.js + * Copyright (C) 2025 veypi + * + * Distributed under terms of the MIT license. + */ + +import token from './token.js' + +function wrapAxios(axios) { + axios.interceptors.response.use(function(response) { + if (response.data && response.data.code === 0) { + return response.data.data + } + return response; + }, function(error) { + let data = error.response ? error.response.data : error.response + if (data.code >= 400) { + return Promise.reject(data.message) + } + return Promise.reject(data.message); + }); +} + +async function checkAuth(to, from, next) { + if (token.isExpired()) { + await token.refresh() + } + if (token.isExpired()) { + token.logout() + } +} +/** + * 定义路由 + * @param{{$axios:Axios, $bus:EventBus, $router: VRouter, root:string}} env + * */ +function setup(env) { + token.setRoot(env.root) + token.wrapAxios(env.$axios) + wrapAxios(env.$axios) + let user = token.body() + env.Guser = user + env.Gtoken = token.getToken() + + // 添加路由 + env.$router.addRoutes([ + { + path: '/', + component: '/page/index.html', + name: 'home', + }, + { + path: '/404', + component: '/page/404.html', + name: '404' + }, + { + path: '*', // 通配符,匹配所有未定义的路由 + component: (path) => { + if (path.endsWith('.html')) { + return path; // 如果是HTML文件,直接返回 + } + path = '/page' + path + return path + '.html' + }, + } + ]) +} +export default setup diff --git a/ui/token.js b/ui/token.js index 8eab1d3..9eca9f7 100644 --- a/ui/token.js +++ b/ui/token.js @@ -23,6 +23,14 @@ class TokenService { return localStorage.getItem(this.tokenKey); } + toJSON() { + return this.getToken() + } + + toString() { + return this.getToken() + } + setRefreshToken(refreshToken) { localStorage.setItem(this.refreshTokenKey, refreshToken); } @@ -56,17 +64,20 @@ class TokenService { if (!this.__cache) { this.__cache = this.parseToken(this.getToken()); } + if (!this.__cache) { + this.__cache = this.parseToken(this.getRefreshToken()); + } return this.__cache } - logout() { + logout(to) { this.clearToken(); - location.href = this.__root + '/login?redirect=' + window.location.pathname; + location.href = this.__root + '/login?redirect=' + (to || window.location.pathname); } - async refreshToken() { + async refresh() { const refreshToken = this.getRefreshToken(); if (!refreshToken) { - this.logout() + // this.logout() return; } try { @@ -141,13 +152,10 @@ class TokenService { }, async function(error) { // 任何超出 2xx 范围的状态码都会触发此函数 const originalRequest = error.config; - console.log(error) // 检查错误响应状态码是否为 401 (未授权) // 并且确保这不是一个已经重试过的请求 (通过 originalRequest._retry 标记) - if (error.response && error.response.status === 401 && !originalRequest._retry) { - // 标记此请求为已重试,避免无限循环 - originalRequest._retry = true; + if (error.response && error.response.status === 401) { // 统计该请求的重试次数 originalRequest.__retryCount = originalRequest.__retryCount || 0; @@ -183,7 +191,7 @@ class TokenService { try { // 发送请求来刷新令牌 - await that.refreshToken(); + await that.refresh(); const newToken = that.getToken(); // 更新原始请求的 Authorization 头为新的令牌 @@ -195,10 +203,10 @@ class TokenService { } catch (refreshError) { // 如果刷新令牌本身也失败了 (例如,refresh token 已过期) // 清除本地令牌 - that.clearToken(); // 拒绝等待队列中的所有请求 processQueue(refreshError); - that.logout(); + // that.clearToken(); + // that.logout(); // 拒绝原始请求的 Promise return Promise.reject(refreshError); } finally {