v3
veypi 6 months ago
parent 0e8ef78957
commit d472464d8a

@ -6,4 +6,4 @@
# #
run: run:
@go run ./cli/*.go -f ./cfg/dev.yml -l debug @go run ./cli/*.go -f ./cfg/dev.yml -l debug -p 4001

@ -8,8 +8,8 @@ package access
import ( import (
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
"oa/cfg" "github.com/veypi/OneAuth/cfg"
"oa/models" "github.com/veypi/OneAuth/models"
) )
type createOpts struct { type createOpts struct {

@ -8,8 +8,8 @@ package access
import ( import (
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
"oa/cfg" "github.com/veypi/OneAuth/cfg"
"oa/models" "github.com/veypi/OneAuth/models"
) )
type deleteOpts struct { type deleteOpts struct {

@ -8,8 +8,8 @@ package access
import ( import (
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
"oa/cfg" "github.com/veypi/OneAuth/cfg"
"oa/models" "github.com/veypi/OneAuth/models"
) )
var _ = Router.Get("/:id", getAccess) var _ = Router.Get("/:id", getAccess)

@ -8,8 +8,8 @@ package access
import ( import (
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
"oa/cfg" "github.com/veypi/OneAuth/cfg"
"oa/models" "github.com/veypi/OneAuth/models"
) )
type listOpts struct { type listOpts struct {

@ -7,9 +7,9 @@
package access package access
import ( import (
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
"oa/cfg"
"oa/models"
) )
type updateOpts struct { type updateOpts struct {

@ -3,12 +3,12 @@ package app
import ( import (
"fmt" "fmt"
"math/rand" "math/rand"
"oa/cfg"
"oa/errs"
"oa/libs/auth"
"oa/models"
"time" "time"
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/errs"
"github.com/veypi/OneAuth/libs/auth"
"github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
"github.com/veypi/utils" "github.com/veypi/utils"
"gorm.io/gorm" "gorm.io/gorm"

@ -2,8 +2,8 @@ package app_user
import ( import (
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
"oa/models" "github.com/veypi/OneAuth/cfg"
"oa/cfg" "github.com/veypi/OneAuth/models"
) )
type createOpts struct { type createOpts struct {

@ -1,9 +1,9 @@
package app_user package app_user
import ( import (
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
"oa/models"
"oa/cfg"
) )
type deleteOpts struct { type deleteOpts struct {

@ -1,9 +1,9 @@
package app_user package app_user
import ( import (
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
"oa/models"
"oa/cfg"
) )
var _ = Router.Get("/:user_id", getAppUser) var _ = Router.Get("/:user_id", getAppUser)

@ -2,8 +2,8 @@ package app_user
import ( import (
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
"oa/models" "github.com/veypi/OneAuth/cfg"
"oa/cfg" "github.com/veypi/OneAuth/models"
) )
type listOpts struct { type listOpts struct {

@ -2,8 +2,8 @@ package app_user
import ( import (
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
"oa/models" "github.com/veypi/OneAuth/cfg"
"oa/cfg" "github.com/veypi/OneAuth/models"
) )
type updateOpts struct { type updateOpts struct {

@ -8,11 +8,10 @@
package app package app
import ( import (
"oa/api/app/access" "github.com/veypi/OneAuth/api/app/access"
"oa/api/app/app_user" "github.com/veypi/OneAuth/api/app/app_user"
"oa/api/app/resource" "github.com/veypi/OneAuth/api/app/resource"
"oa/api/user/role" "github.com/veypi/OneAuth/api/app/role"
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
) )

@ -2,8 +2,8 @@ package resource
import ( import (
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
"oa/models" "github.com/veypi/OneAuth/cfg"
"oa/cfg" "github.com/veypi/OneAuth/models"
) )
var _ = Router.Post("/", createResource) var _ = Router.Post("/", createResource)

@ -2,8 +2,8 @@ package resource
import ( import (
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
"oa/models" "github.com/veypi/OneAuth/cfg"
"oa/cfg" "github.com/veypi/OneAuth/models"
) )
var _ = Router.Delete("/:resource_id", deleteResource) var _ = Router.Delete("/:resource_id", deleteResource)

@ -2,8 +2,8 @@ package resource
import ( import (
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
"oa/models" "github.com/veypi/OneAuth/cfg"
"oa/cfg" "github.com/veypi/OneAuth/models"
) )
var _ = Router.Get("/:resource_id", getResource) var _ = Router.Get("/:resource_id", getResource)

@ -2,8 +2,8 @@ package resource
import ( import (
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
"oa/models" "github.com/veypi/OneAuth/cfg"
"oa/cfg" "github.com/veypi/OneAuth/models"
) )
type listOpts struct { type listOpts struct {

@ -2,8 +2,8 @@ package resource
import ( import (
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
"oa/cfg" "github.com/veypi/OneAuth/cfg"
"oa/models" "github.com/veypi/OneAuth/models"
) )
var _ = Router.Patch("/:resource_id", updateResource) var _ = Router.Patch("/:resource_id", updateResource)

@ -1,9 +1,9 @@
package role package role
import ( import (
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
"oa/models"
"oa/cfg"
) )
var _ = Router.Post("/", createRole) var _ = Router.Post("/", createRole)

@ -2,8 +2,8 @@ package role
import ( import (
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
"oa/models" "github.com/veypi/OneAuth/cfg"
"oa/cfg" "github.com/veypi/OneAuth/models"
) )
var _ = Router.Delete("/:role_id", deleteRole) var _ = Router.Delete("/:role_id", deleteRole)

@ -2,8 +2,8 @@ package role
import ( import (
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
"oa/models" "github.com/veypi/OneAuth/cfg"
"oa/cfg" "github.com/veypi/OneAuth/models"
) )
var _ = Router.Get("/:role_id", getRole) var _ = Router.Get("/:role_id", getRole)

@ -1,9 +1,9 @@
package role package role
import ( import (
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
"oa/models"
"oa/cfg"
) )
var _ = Router.Get("/", listRoles) var _ = Router.Get("/", listRoles)

@ -1,9 +1,9 @@
package role package role
import ( import (
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
"oa/models"
"oa/cfg"
) )
var _ = Router.Patch("/:role_id", updateRole) var _ = Router.Patch("/:role_id", updateRole)

@ -9,10 +9,10 @@ package api
import ( import (
"fmt" "fmt"
"oa/api/app"
"oa/api/token"
"oa/api/user"
"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"
"github.com/veypi/OneBD/rest/middlewares" "github.com/veypi/OneBD/rest/middlewares"
) )
@ -20,7 +20,7 @@ import (
var Router = rest.NewRouter().UseAfter(middlewares.JsonResponse, middlewares.JsonErrorResponse) var Router = rest.NewRouter().UseAfter(middlewares.JsonResponse, middlewares.JsonErrorResponse)
var ( var (
_ = Router.Extend("user", user.Router) _ = Router.Extend("user", user.Router,)
_ = Router.Extend("token", token.Router) _ = Router.Extend("token", token.Router)
_ = Router.Extend("app", app.Router) _ = Router.Extend("app", app.Router)
) )

@ -1,10 +1,10 @@
package token package token
import ( import (
"oa/cfg"
"oa/models"
"time" "time"
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
) )

@ -9,12 +9,12 @@ package token
import ( import (
"net/http" "net/http"
"oa/cfg"
"oa/libs/auth"
"oa/models"
"time" "time"
"github.com/golang-jwt/jwt/v5" "github.com/golang-jwt/jwt/v5"
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/libs/auth"
"github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
"github.com/veypi/utils/logv" "github.com/veypi/utils/logv"
) )

@ -8,9 +8,8 @@
package token package token
import ( import (
"oa/cfg" "github.com/veypi/OneAuth/cfg"
"oa/models" "github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
) )

@ -10,14 +10,14 @@ package user
import ( import (
"encoding/base64" "encoding/base64"
"fmt" "fmt"
"oa/cfg"
M "oa/models"
"strings" "strings"
"time" "time"
"math/rand" "math/rand"
"github.com/google/uuid" "github.com/google/uuid"
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
"github.com/veypi/utils" "github.com/veypi/utils"
"gorm.io/gorm" "gorm.io/gorm"
@ -40,7 +40,7 @@ func userPost(x *rest.X) (any, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
data := &M.User{} data := &models.User{}
data.ID = strings.ReplaceAll(uuid.New().String(), "-", "") data.ID = strings.ReplaceAll(uuid.New().String(), "-", "")
data.Username = opts.Username data.Username = opts.Username
@ -82,7 +82,7 @@ func userPost(x *rest.X) (any, error) {
if err != nil { if err != nil {
return err return err
} }
app := &M.App{} app := &models.App{}
err = tx.Where("id = ?", cfg.Config.ID).First(app).Error err = tx.Where("id = ?", cfg.Config.ID).First(app).Error
if err != nil { if err != nil {
return err return err
@ -98,7 +98,7 @@ func userPost(x *rest.X) (any, error) {
if app.Typ != "public" { if app.Typ != "public" {
} }
return tx.Create(&M.AppUser{ return tx.Create(&models.AppUser{
UserID: data.ID, UserID: data.ID,
AppID: cfg.Config.ID, AppID: cfg.Config.ID,
Status: status, Status: status,

@ -8,8 +8,7 @@
package user package user
import ( import (
"oa/api/user/role" "github.com/veypi/OneAuth/api/user/role"
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
) )

@ -9,12 +9,12 @@ package user
import ( import (
"encoding/base64" "encoding/base64"
"oa/cfg"
"oa/libs/auth"
"oa/models"
"time" "time"
"github.com/golang-jwt/jwt/v5" "github.com/golang-jwt/jwt/v5"
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/libs/auth"
"github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
"github.com/veypi/utils" "github.com/veypi/utils"
"github.com/veypi/utils/logv" "github.com/veypi/utils/logv"

@ -8,9 +8,9 @@
package role package role
import ( import (
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
"oa/cfg"
M "oa/models"
) )
var _ = Router.Post("/", userRolePost) var _ = Router.Post("/", userRolePost)
@ -28,7 +28,7 @@ func userRolePost(x *rest.X) (any, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
data := &M.UserRole{} data := &models.UserRole{}
data.UserID = opts.UserID data.UserID = opts.UserID
data.RoleID = opts.RoleID data.RoleID = opts.RoleID

@ -8,9 +8,8 @@
package role package role
import ( import (
"oa/cfg" "github.com/veypi/OneAuth/cfg"
"oa/models" "github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
) )

@ -8,8 +8,8 @@
package role package role
import ( import (
"oa/cfg" "github.com/veypi/OneAuth/cfg"
M "oa/models" "github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
) )
@ -19,7 +19,7 @@ var _ = Router.Get("/:id", `
`, userRoleGet) `, userRoleGet)
func userRoleGet(x *rest.X) (any, error) { func userRoleGet(x *rest.X) (any, error) {
data := &M.UserRole{} data := &models.UserRole{}
err := cfg.DB().Where("id = ?", x.Params.Get("id")).First(data).Error err := cfg.DB().Where("id = ?", x.Params.Get("id")).First(data).Error
return data, err return data, err
} }
@ -42,7 +42,7 @@ func userRoleList(x *rest.X) (any, error) {
return nil, err return nil, err
} }
data := make([]*struct { data := make([]*struct {
M.UserRole models.UserRole
Username string `json:"username"` Username string `json:"username"`
Nickname string `json:"nickname"` Nickname string `json:"nickname"`
Icon string `json:"icon"` Icon string `json:"icon"`

@ -8,9 +8,9 @@
package role package role
import ( import (
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
"oa/cfg"
M "oa/models"
) )
type patchOpts struct { type patchOpts struct {
@ -26,8 +26,7 @@ func userRolePatch(x *rest.X) (any, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
data := &M.UserRole{} data := &models.UserRole{}
err = cfg.DB().Where("id = ?", opts.ID).First(data).Error err = cfg.DB().Where("id = ?", opts.ID).First(data).Error
if err != nil { if err != nil {
return nil, err return nil, err

@ -1,17 +1,16 @@
package user package user
import ( import (
"oa/cfg" "github.com/veypi/OneAuth/cfg"
"oa/libs/auth" "github.com/veypi/OneAuth/libs/auth"
M "oa/models" "github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
) )
var _ = Router.Delete("/:user_id", auth.Check("user", "user_id", auth.DoDelete), userDelete) var _ = Router.Delete("/:user_id", auth.Check("user", "user_id", auth.DoDelete), userDelete)
func userDelete(x *rest.X) (any, error) { func userDelete(x *rest.X) (any, error) {
data := &M.User{} data := &models.User{}
err := cfg.DB().Where("id = ?", x.Params.Get("user_id")).Delete(data).Error err := cfg.DB().Where("id = ?", x.Params.Get("user_id")).Delete(data).Error
return data, err return data, err
} }
@ -28,14 +27,14 @@ func userGet(x *rest.X) (any, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
data := &M.User{} data := &models.User{}
err = cfg.DB().Where("id = ?", opts.ID).First(data).Error err = cfg.DB().Where("id = ?", opts.ID).First(data).Error
return data, err return data, err
} }
var _ = Router.Get("/", auth.Check("user", "", auth.DoRead), userList) var _ = Router.Get("/", "list user", listOpts{}, auth.Check("user", "", auth.DoRead), userList)
type listOpts struct { type listOpts struct {
Username *string `json:"username" parse:"query"` Username *string `json:"username" parse:"query"`
@ -51,7 +50,7 @@ func userList(x *rest.X) (any, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
data := make([]*M.User, 0, 10) data := make([]*models.User, 0, 10)
query := cfg.DB() query := cfg.DB()
if opts.Username != nil { if opts.Username != nil {
@ -92,7 +91,7 @@ func userPatch(x *rest.X) (any, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
data := &M.User{} data := &models.User{}
err = cfg.DB().Where("id = ?", opts.ID).First(data).Error err = cfg.DB().Where("id = ?", opts.ID).First(data).Error
if err != nil { if err != nil {

@ -7,15 +7,11 @@
package cfg package cfg
type config struct { type Options struct {
Host string `json:"host"` DSN string `json:"dsn"` // Data Source Name
Port int `json:"port"` DB string `json:"db"` // DB type: mysql, postgres, sqlite
LoggerPath string `json:"logger_path,omitempty"`
LoggerLevel string `json:"logger_level,omitempty"`
DSN string `json:"dsn"`
DB string `json:"db"`
ID string `json:"id"` ID string `json:"id"`
Key string `json:"key"` Key string `json:"key"`
} }
var Config = &config{} var Config = &Options{}

@ -8,57 +8,65 @@
package main package main
import ( import (
app "oa" "github.com/veypi/OneAuth"
"oa/cfg" "github.com/veypi/OneAuth/cfg"
"oa/models" "github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
"github.com/veypi/utils/flags" "github.com/veypi/utils/flags"
"github.com/veypi/utils/logv" "github.com/veypi/utils/logv"
) )
var CMD = flags.New("app", "the backend server of app") var cmdMain = flags.New("app", "the backend server of app")
var cmdCfg = CMD.SubCommand("cfg", "generate cfg file") var cmdCfg = cmdMain.SubCommand("cfg", "generate cfg file")
var cmdDB = CMD.SubCommand("db", "database operations") var cmdDB = cmdMain.SubCommand("db", "database operations")
var configFile = cmdMain.String("f", "./dev.yaml", "the config file")
var configFile = CMD.String("f", "./dev.yaml", "the config file") var cliOpts = &struct {
Host string `json:"host"`
Port int `json:"port"`
LoggerPath string `json:"logger_path,omitempty"`
LoggerLevel string `json:"logger_level,omitempty"`
Core *cfg.Options
}{
Core: cfg.Config,
}
func init() { func init() {
CMD.StringVar(&cfg.Config.Host, "host", "0.0.0.0", "host") cmdMain.StringVar(&cliOpts.Host, "host", "0.0.0.0", "host")
CMD.IntVar(&cfg.Config.Port, "p", 4000, "port") cmdMain.IntVar(&cliOpts.Port, "p", 4000, "port")
CMD.StringVar(&cfg.Config.LoggerLevel, "l", "info", "log level") cmdMain.StringVar(&cliOpts.LoggerLevel, "l", "info", "log level")
CMD.StringVar(&cfg.Config.DSN, "dsn", "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local", "data source name")
CMD.StringVar(&cfg.Config.DB, "db", "mysql", "data source type: mysql/postgre/sqlite") cmdMain.Before = func() error {
CMD.Before = func() error {
flags.LoadCfg(*configFile, cfg.Config) flags.LoadCfg(*configFile, cfg.Config)
CMD.Parse() cmdMain.Parse()
logv.SetLevel(logv.AssertFuncErr(logv.ParseLevel(cfg.Config.LoggerLevel))) logv.SetLevel(logv.AssertFuncErr(logv.ParseLevel(cliOpts.LoggerLevel)))
return nil return nil
} }
CMD.Command = runWeb cmdMain.Command = runWeb
cmdCfg.Command = func() error { cmdCfg.Command = func() error {
flags.DumpCfg(*configFile, cfg.Config) return flags.DumpCfg(*configFile, cfg.Config)
return nil
} }
cmdDB.SubCommand("migrate", "migrate database").Command = models.Migrate cmdDB.SubCommand("migrate", "migrate database").Command = models.Migrate
cmdDB.SubCommand("drop", "drop database").Command = models.Drop cmdDB.SubCommand("drop", "drop database").Command = models.Drop
cmdDB.SubCommand("init", "init db data").Command = models.Init cmdDB.SubCommand("init", "init db data").Command = models.InitDB
} }
func main() { func main() {
CMD.Parse() cmdMain.Parse()
err := CMD.Run() err := cmdMain.Run()
if err != nil { if err != nil {
logv.Warn().Msg(err.Error()) logv.Warn().Msg(err.Error())
} }
} }
func runWeb() error { func runWeb() error {
server, err := rest.New(rest.WithHost(cfg.Config.Host), rest.WithPort(cfg.Config.Port)) server, err := rest.New(rest.WithHost(cliOpts.Host), rest.WithPort(cliOpts.Port))
if err != nil { if err != nil {
return err return err
} }
server.SetRouter(app.Router) server.SetRouter(OneAuth.Router)
server.EnableAI()
server.Router().Print() server.Router().Print()
return server.Run() return server.Run()
} }

@ -1,4 +1,4 @@
module oa module github.com/veypi/OneAuth
go 1.23.2 go 1.23.2

@ -4,12 +4,11 @@
// Distributed under terms of the MIT license. // Distributed under terms of the MIT license.
// //
package oa package OneAuth
import ( import (
"embed" "embed"
"oa/api" "github.com/veypi/OneAuth/api"
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
"github.com/veypi/OneBD/rest/middlewares/vyes" "github.com/veypi/OneBD/rest/middlewares/vyes"
"github.com/veypi/vyes-ui" "github.com/veypi/vyes-ui"

@ -11,12 +11,12 @@ import (
"context" "context"
"errors" "errors"
"fmt" "fmt"
"oa/cfg"
"oa/errs"
"strings" "strings"
"time" "time"
"github.com/golang-jwt/jwt/v5" "github.com/golang-jwt/jwt/v5"
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/errs"
"github.com/veypi/OneBD/rest" "github.com/veypi/OneBD/rest"
) )

@ -32,7 +32,7 @@ import (
// In the long term, this package should use the standard library's version // In the long term, this package should use the standard library's version
// only, and the internal fork deleted, once // only, and the internal fork deleted, once
// https://github.com/golang/go/issues/13400 is resolved. // https://github.com/golang/go/issues/13400 is resolved.
ixml "oa/libs/webdav/internal/xml" ixml "github.com/veypi/OneAuth/libs/webdav/internal/xml"
) )
// http://www.webdav.org/specs/rfc4918.html#ELEMENT_lockinfo // http://www.webdav.org/specs/rfc4918.html#ELEMENT_lockinfo

@ -16,7 +16,7 @@ import (
"strings" "strings"
"testing" "testing"
ixml "oa/libs/webdav/internal/xml" ixml "github.com/veypi/OneAuth/libs/webdav/internal/xml"
) )
func TestReadLockInfo(t *testing.T) { func TestReadLockInfo(t *testing.T) {

@ -7,7 +7,7 @@
package models package models
import ( import (
"oa/cfg" "github.com/veypi/OneAuth/cfg"
"strings" "strings"
"time" "time"
@ -31,7 +31,6 @@ func (m *BaseModel) BeforeCreate(tx *gorm.DB) error {
return nil return nil
} }
var AllModels = crud.New() var AllModels = crud.New()
func init() { func init() {
@ -51,7 +50,7 @@ func Drop() error {
return crud.AutoDrop(cfg.DB(), AllModels) return crud.AutoDrop(cfg.DB(), AllModels)
} }
func Init() error { func InitDB() error {
app := &App{} app := &App{}
app.ID = cfg.Config.ID app.ID = cfg.Config.ID
app.Name = "OA" app.Name = "OA"

@ -1,36 +1,71 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<style> <head>
.logout-btn { <meta name="description" content="用户头像和登录状态组件">
padding: 5px 10px; </head>
background: #fff;
color: #1e88e5;
border: none;
border-radius: 4px;
cursor: pointer;
transition: all 0.2s;
}
.logout-btn:hover {
background: #f5f5f5;
}
<style>
.header-user { .header-user {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 10px; gap: 12px;
padding: 8px 12px;
border-radius: 20px;
transition: all 0.2s ease;
}
.header-user:hover {
background: rgba(0, 0, 0, 0.05);
} }
.user-avatar { .user-avatar {
width: 32px; width: 36px;
height: 32px; height: 36px;
border-radius: 50%; border-radius: 50%;
object-fit: cover; object-fit: cover;
border: 2px solid #f8f9fa;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
} }
.user-name { .user-name {
font-size: 14px; font-size: 14px;
font-weight: 500;
color: #333;
text-decoration: none;
}
.user-name:hover {
color: #1e88e5;
}
.auth-btn {
padding: 6px 16px;
border-radius: 20px;
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s ease;
}
.login-btn {
background: #1e88e5;
color: white;
border: none;
}
.login-btn:hover {
background: #1565c0;
}
.logout-btn {
background: transparent;
color: #f44336;
border: 1px solid #f44336;
}
.logout-btn:hover {
background: rgba(244, 67, 54, 0.1);
} }
</style> </style>
@ -38,18 +73,20 @@
<div class="header-user ml-auto" v-if="user.name"> <div class="header-user ml-auto" v-if="user.name">
<img :src="user.icon" class="user-avatar" alt="用户头像"> <img :src="user.icon" class="user-avatar" alt="用户头像">
<a href='/profile' class="user-name">{{ user.name }}</a> <a href='/profile' class="user-name">{{ user.name }}</a>
<v-btn size='sm' color='#f1acac' typ='outline' @click="token.logout($env.root)" class="logout-btn"> <button @click="token.logout($env.root)" class="auth-btn logout-btn">
退出 退出
</v-btn> </button>
</div> </div>
<div class="header-user" v-else> <div class="header-user" v-else>
<span>未登录</span> <a href="/login" class="auth-btn login-btn">
<a :href="'/login'" class="logout-btn">
登录 登录
</a> </a>
</div> </div>
</body> </body>
<script setup> <script setup>
import token from 'token' import token from 'token'
user = token.body() || {} user = token.body() || {}
</script> </script>
</html>

@ -4,12 +4,10 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>oa</title> <title>oa</title>
<link rel="stylesheet" href="/assets/common.css">
<link rel="stylesheet" href="/assets/tailwind.min.css">
<script type="module" key='vyes' src="/assets/v.js"></script> <script type="module" key='vyes' src="/assets/v.js"></script>
<link rel="stylesheet" href="/assets/awesomefont/css/all.min.css" <link href="/assets/libs/tailwind/tailwind.min.css" rel="stylesheet">
integrity="sha512-Evv84Mr4kqVGRNSgIGL/F/aIDqQb7xQ2vcrdIwxfjThSH8CSR7PBEakCr51Ck+w+/U6swU2Im1vVX0SVk9ABhg==" <link href="/assets/libs/animate/animate.min.css" rel="stylesheet">
crossorigin="anonymous" referrerpolicy="no-referrer" /> <link href="/assets/libs/font-awesome/css/all.min.css" rel="stylesheet">
</head> </head>
<body root class="h-full w-full"> <body root class="h-full w-full">

Loading…
Cancel
Save