diff --git a/api/api.go b/api/api.go new file mode 100644 index 0000000..9520d9e --- /dev/null +++ b/api/api.go @@ -0,0 +1,11 @@ +package api + +import "schisandra-cloud-album/api/auth_api" + +// Apis 统一导出的api +type Apis struct { + AuthApi auth_api.AuthAPI +} + +// Api new函数实例化,实例化完成后会返回结构体地指针类型 +var Api = new(Apis) diff --git a/api/auth_api/auth_api.go b/api/auth_api/auth_api.go new file mode 100644 index 0000000..4d2fd77 --- /dev/null +++ b/api/auth_api/auth_api.go @@ -0,0 +1,19 @@ +package auth_api + +import ( + "github.com/gin-gonic/gin" + "schisandra-cloud-album/common/result" + "schisandra-cloud-album/service" +) + +var authService = service.Service.AuthService + +// GetUserList +// @Summary 获取所有用户列表 +// @Tags 鉴权模块 +// @Success 200 {string} json +// @Router /api/auth/user/List [get] +func (AuthAPI) GetUserList(c *gin.Context) { + userList := authService.GetUserList() + result.OkWithData(userList, c) +} diff --git a/api/auth_api/enter.go b/api/auth_api/enter.go new file mode 100644 index 0000000..acc0d12 --- /dev/null +++ b/api/auth_api/enter.go @@ -0,0 +1,3 @@ +package auth_api + +type AuthAPI struct{} diff --git a/cmd/gen/gen.go b/cmd/gen/gen.go index bcc9a29..2fa6ee3 100644 --- a/cmd/gen/gen.go +++ b/cmd/gen/gen.go @@ -1,46 +1,75 @@ package main import ( + "encoding/json" "fmt" "gorm.io/driver/mysql" "gorm.io/gen" + "gorm.io/gen/field" "gorm.io/gorm" + "gorm.io/gorm/schema" + "os" + "strings" ) -const MysqlDsn = "root:LDQ20020618xxx@(1.95.0.111:3306)/schisandra-cloud-album?charset=utf8mb4&parseTime=True&loc=Local" +const dbName = `schisandra-cloud-album` +const dbUser = "root" +const dbPwd = "LDQ20020618xxx" +const dbHost = "1.95.0.111" +const dbPort = "3306" +const MysqlConfig = dbUser + ":" + dbPwd + "@tcp(" + dbHost + ":" + dbPort + ")/" + string(dbName) + "?charset=utf8mb4&parseTime=True&loc=Local" func main() { - // 初始化连接数据库 - db, err := gorm.Open(mysql.Open(MysqlDsn)) + // 生成所有model和query + processAllTables(initInfo()) + // 处理表关联关系 + processTableRelations(initInfo()) + +} + +/** + * 初始化数据库连接 + * 生成generator实例 + * 自定义字段的数据类型 + * 自定义模型结体字段的标签 + */ +func initInfo() (db *gorm.DB, g *gen.Generator, fieldOpts []gen.ModelOpt) { + // 连接数据库 + db, err := gorm.Open(mysql.Open(MysqlConfig), &gorm.Config{ + DisableForeignKeyConstraintWhenMigrating: true, + NamingStrategy: schema.NamingStrategy{ + SingularTable: true, + }, + }) if err != nil { - panic(fmt.Errorf("cannot establish db connection: %w", err)) + panic(fmt.Errorf("数据库连接失败,请检查连接配置: %w", err)) } // 生成实例 - g := gen.NewGenerator(gen.Config{ - // 相对执行`go run`时的路径, 会自动创建目录 - OutPath: "model", + g = gen.NewGenerator(gen.Config{ + // 相对执行`go run`时的路径, 会自动创建目录,相对路径为工程根目录 + OutPath: "query", // WithDefaultQuery 生成默认查询结构体(作为全局变量使用), 即`Q`结构体和其字段(各表模型) // WithoutContext 生成没有context调用限制的代码供查询 // WithQueryInterface 生成interface形式的查询代码(可导出), 如`Where()`方法返回的就是一个可导出的接口类型 - Mode: gen.WithoutContext | gen.WithDefaultQuery | gen.WithQueryInterface, + Mode: gen.WithDefaultQuery | gen.WithQueryInterface, // 表字段可为 null 值时, 对应结体字段使用指针类型 - FieldNullable: true, // gen pointer when field is nullable + FieldNullable: true, // generate pointer when field is nullable // 表字段默认值与模型结构体字段零值不一致的字段, 在插入数据时需要赋值该字段值为零值的, 结构体字段须是指针类型才能成功, 即`FieldCoverable:true`配置下生成的结构体字段. // 因为在插入时遇到字段为零值的会被GORM赋予默认值. 如字段`age`表默认值为10, 即使你显式设置为0最后也会被GORM设为10提交. // 如果该字段没有上面提到的插入时赋零值的特殊需要, 则字段为非指针类型使用起来会比较方便. - FieldCoverable: false, // gen pointer when field has default value, to fix problem zero value cannot be assign: https://gorm.io/docs/create.html#Default-Values + FieldCoverable: false, // generate pointer when field has default value, to fix problem zero value cannot be assign: https://gorm.io/docs/create.html#Default-Values // 模型结构体字段的数字类型的符号表示是否与表字段的一致, `false`指示都用有符号类型 FieldSignable: false, // detect integer field's unsigned type, adjust generated data type // 生成 gorm 标签的字段索引属性 - FieldWithIndexTag: false, // gen with gorm index tag + FieldWithIndexTag: false, // generate with gorm index tag // 生成 gorm 标签的字段类型属性 - FieldWithTypeTag: true, // gen with gorm column type tag + FieldWithTypeTag: true, // generate with gorm column type tag }) // 设置目标 db g.UseDB(db) @@ -57,8 +86,184 @@ func main() { // 要先于`ApplyBasic`执行 g.WithDataTypeMap(dataMap) - g.ApplyBasic( - g.GenerateAllTable(), - ) - g.Execute() + // 自定义模型结体字段的标签 + // 将特定字段名的 json 标签加上`string`属性,即 MarshalJSON 时该字段由数字类型转成字符串类型 + // jsonField := gen.FieldJSONTagWithNS(func(columnName string) (tagContent string) { + // toStringField := `balance, ` + // if strings.Contains(toStringField, columnName) { + // return columnName + ",string" + // } + // return columnName + // }) + + // 将非默认字段名的字段定义为自动时间戳和软删除字段; + // 自动时间戳默认字段名为:`updated_at`、`created_at, 表字段数据类型为: INT 或 DATETIME + // 软删除默认字段名为:`deleted_at`, 表字段数据类型为: DATETIME + autoUpdateTimeField := gen.FieldGORMTag("update_time", func(tag field.GormTag) field.GormTag { + return tag.Append("autoUpdateTime") + }) + autoCreateTimeField := gen.FieldGORMTag("created_time", func(tag field.GormTag) field.GormTag { + return tag.Append("autoCreateTime") + }) + //softDeleteField := gen.FieldType("deletedAt", "gorm.DeletedAt") + + // 模型自定义选项组 + fieldOpts = []gen.ModelOpt{ + // jsonField, + autoCreateTimeField, + autoUpdateTimeField, + //softDeleteField, + } + + return db, g, fieldOpts +} + +/** + *创建全部模型文件,生成所有model和query + *将生成的query目录下的gen.go文件移动到当前目录tmp文件夹下 + */ +func processAllTables(db *gorm.DB, g *gen.Generator, fieldOpts []gen.ModelOpt) { + allModel := g.GenerateAllTable(fieldOpts...) + g.ApplyBasic(allModel...) + g.Execute() + + // 将生成的query目录下的gen.go文件移动到当前目录tmp文件夹下 + moveGenFile() +} + +/** + * 将生成的query目录下的gen.go根文件移动到当前目录tmp文件夹下, + * gen.go文件中保存的是所有表的模型的引用, + * gen在生成query文件时,只会将ApplyBasic方法参数中的模型写入query中的根文件gen.go中, + * 而我们在后续调用processTableRelations方法处理关联关系的时候,只处理有关联关系的表, + * 方法中生成的gen.go中只会有有关联关系的表的模型的引用,因此需要将保存了所有表的模型的引用的gen.go文件 + * 移动到tmp文件夹下,然后再调用processTableRelations方法处理关联关系,处理完关联关系后, + * 再将tmp文件夹下的gen.go文件移动到query目录下。 + */ +func moveGenFile() { + workDir, _ := os.Getwd() + err := os.MkdirAll(workDir+"/tmp", 0777) + if err != nil { + fmt.Println("创建文件夹logs失败!", err) + return + } + genFile := workDir + "/query/gen.go" + if _, err := os.Stat(genFile); err != nil { + fmt.Println("gen.go文件不存在!") + return + } + fmt.Println("gen.go文件存在:", genFile) + er := os.Rename(genFile, workDir+"/tmp/gen.go") + if er != nil { + return + } +} + +type Results struct { + TABLE_NAME string //子表名 + COLUMN_NAME string //子表列名 + CONSTRAINT_NAME string //约束名 + REFERENCED_TABLE_NAME string //关联表名 + REFERENCED_COLUMN_NAME string //关联列名 +} + +/** + * 处理表关联关系 + */ +func processTableRelations(db *gorm.DB, g *gen.Generator, fieldOpts []gen.ModelOpt) { + relationList := []Results{} + // 执行这条sql语句,获取当前数据库中所有表之间的外键关联关系 + // 执行结果保存到relationList中 + db.Raw("SELECT TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME,REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = ? AND REFERENCED_TABLE_SCHEMA IS NOT NULL;", dbName).Scan(&relationList) + + type subTable struct { + TABLE_NAME string //子表名 + TABLE_NAME_UP string //子表名首字母大写 + COLUMN_NAME string //子表列名 + COLUMN_NAME_UP string //子表列名首字母大写 + } + + masterTableMap := make(map[string][]subTable) + // 将relationList中的数据按照关联表名进行分组,将关联了父表名的所有子表数据放到一个切片中,然后将切片放到map中,map的key为父表名,value为子表切片 + for _, sub := range relationList { + st := subTable{ + TABLE_NAME: sub.TABLE_NAME, //子表名 + COLUMN_NAME: sub.COLUMN_NAME, //子表列名 + TABLE_NAME_UP: Case2Camel(sub.TABLE_NAME), //将子表名下划线去掉,转换成首字母大写 + COLUMN_NAME_UP: Case2Camel(ProcessID(sub.COLUMN_NAME)), //将子表列名中以id结尾的字段中的id转换成ID格式,再将子表列名下划线去掉,转换成首字母大写 + } + masterTableMap[sub.REFERENCED_TABLE_NAME] = append(masterTableMap[sub.REFERENCED_TABLE_NAME], st) + } + + fmt.Println("主表 Map:::", ToJson(masterTableMap)) + + // 生成新的generator实例,用于通过数据库子表名称,创建子表的模型基本结构体(BaseStruct) + newGenerator := gen.NewGenerator(gen.Config{}) + newGenerator.UseDB(db) + + relationModels := []any{} + // 遍历map,将map中的数据取出来,生成对应的关联关系模型文件 + for masterTable, subTables := range masterTableMap { + subModels := []gen.ModelOpt{} + // 遍历子表切片,将子表切片中的数据取出来,生成对应的关联关系模型文件 + for _, subTable := range subTables { + // 目前只支持一对多关联关系,即:HasMany + // 但是也能覆盖has_one和belongs_to的关联关系,只不过在生成的model中会多出一个切片字段,该切片中只有一个值 + // 对于多对多关联关系(many2many),请先设计中间连接表,连接表中定义两个主键,即:复合主键,每个主键关联一张主表, + // 这样就能生成两个一对多的关联关系,再运行本程序,就能实现多对多的关联关系了 + subModels = append(subModels, gen.FieldRelate(field.HasMany, subTable.TABLE_NAME_UP, newGenerator.GenerateModel(subTable.TABLE_NAME), + &field.RelateConfig{ + // RelateSlice配置为true,那么在主表生成model的时候会生成关联表的切片 + RelateSlice: true, + // 配置关联关系的外键字段,并且将外键字段的gorm标签中的foreignKey属性设置为关联表的列名 + GORMTag: field.GormTag{"foreignKey": {subTable.COLUMN_NAME_UP}}, + })) + } + relationModels = append(relationModels, g.GenerateModel(masterTable, append(fieldOpts, subModels...)...)) + } + + g.ApplyBasic(relationModels...) + g.Execute() + + // 将当前目录tmp文件夹下的gen.go文件移动到query目录下 + moveGenFileBack() +} + +/** + * 将当前目录tmp文件夹下的gen.go文件移动到query目录下 + */ +func moveGenFileBack() { + workDir, _ := os.Getwd() + genFile := workDir + "/query/gen.go" + if _, err := os.Stat(genFile); err != nil { + fmt.Println("gen.go文件不存在!") + return + } + err := os.Rename(workDir+"/tmp/gen.go", genFile) + if err != nil { + return + } +} + +// Case2Camel 下划线写法转为驼峰写法 +func Case2Camel(name string) string { + words := strings.Split(name, "_") + var result string + for _, word := range words { + result += strings.ToUpper(string(word[0])) + word[1:] + } + return result +} + +func ProcessID(str string) string { + if strings.HasSuffix(str, "id") { + str, _ = strings.CutSuffix(str, "id") + str = str + "ID" + } + return str +} + +func ToJson(result interface{}) string { + jsonBytes, _ := json.Marshal(result) + return string(jsonBytes) } diff --git a/core/gorm.go b/core/gorm.go index fe8acca..44928f8 100644 --- a/core/gorm.go +++ b/core/gorm.go @@ -5,6 +5,8 @@ import ( "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" + "log" + "os" "schisandra-cloud-album/global" "time" ) @@ -19,10 +21,25 @@ func MySQlConnect() *gorm.DB { } dsn := global.CONFIG.MySQL.Dsn() var mysqlLogger logger.Interface - if global.CONFIG.System.Env == "dev" { - mysqlLogger = logger.Default.LogMode(logger.Info) + if global.CONFIG.System.Env == "debug" { + //自定义日子模板 打印SQL语句 + mysqlLogger = logger.New( + log.New(os.Stdout, "\r\n", log.LstdFlags), + logger.Config{ + SlowThreshold: time.Second, //慢sql日志 + LogLevel: logger.Info, //级别 + Colorful: true, //颜色 + + }) } else { - mysqlLogger = logger.Default.LogMode(logger.Error) + mysqlLogger = logger.New( + log.New(os.Stdout, "\r\n", log.LstdFlags), + logger.Config{ + SlowThreshold: time.Second, //慢sql日志 + LogLevel: logger.Error, //级别 + Colorful: true, //颜色 + + }) } db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ diff --git a/docs/docs.go b/docs/docs.go new file mode 100644 index 0000000..ef997ed --- /dev/null +++ b/docs/docs.go @@ -0,0 +1,53 @@ +// Package docs Code generated by swaggo/swag. DO NOT EDIT +package docs + +import "github.com/swaggo/swag" + +const docTemplate = `{ + "schemes": {{ marshal .Schemes }}, + "swagger": "2.0", + "info": { + "description": "{{escape .Description}}", + "title": "{{.Title}}", + "contact": {}, + "version": "{{.Version}}" + }, + "host": "{{.Host}}", + "basePath": "{{.BasePath}}", + "paths": { + "/api/auth/user/List": { + "get": { + "tags": [ + "鉴权模块" + ], + "summary": "获取所有用户列表", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + } + } + } + } + } +}` + +// SwaggerInfo holds exported Swagger Info so clients can modify it +var SwaggerInfo = &swag.Spec{ + Version: "", + Host: "", + BasePath: "", + Schemes: []string{}, + Title: "", + Description: "", + InfoInstanceName: "swagger", + SwaggerTemplate: docTemplate, + LeftDelim: "{{", + RightDelim: "}}", +} + +func init() { + swag.Register(SwaggerInfo.InstanceName(), SwaggerInfo) +} diff --git a/docs/swagger.json b/docs/swagger.json new file mode 100644 index 0000000..fc2e332 --- /dev/null +++ b/docs/swagger.json @@ -0,0 +1,24 @@ +{ + "swagger": "2.0", + "info": { + "contact": {} + }, + "paths": { + "/api/auth/user/List": { + "get": { + "tags": [ + "鉴权模块" + ], + "summary": "获取所有用户列表", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/docs/swagger.yaml b/docs/swagger.yaml new file mode 100644 index 0000000..fee9e38 --- /dev/null +++ b/docs/swagger.yaml @@ -0,0 +1,14 @@ +info: + contact: {} +paths: + /api/auth/user/List: + get: + responses: + "200": + description: OK + schema: + type: string + summary: 获取所有用户列表 + tags: + - 鉴权模块 +swagger: "2.0" diff --git a/go.mod b/go.mod index 62d8ea2..8e4039f 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,9 @@ go 1.22.5 require ( github.com/gin-gonic/gin v1.10.0 github.com/sirupsen/logrus v1.9.3 + github.com/swaggo/files v1.0.1 + github.com/swaggo/gin-swagger v1.6.0 + github.com/swaggo/swag v1.16.3 gopkg.in/yaml.v3 v3.0.1 gorm.io/driver/mysql v1.5.7 gorm.io/gen v0.3.26 @@ -13,12 +16,17 @@ require ( require ( filippo.io/edwards25519 v1.1.0 // indirect + github.com/KyleBanks/depth v1.2.1 // indirect github.com/bytedance/sonic v1.12.0 // indirect github.com/bytedance/sonic/loader v0.2.0 // indirect github.com/cloudwego/base64x v0.1.4 // indirect github.com/cloudwego/iasm v0.2.0 // indirect github.com/gabriel-vasile/mimetype v1.4.5 // indirect github.com/gin-contrib/sse v0.1.0 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect + github.com/go-openapi/spec v0.21.0 // indirect + github.com/go-openapi/swag v0.23.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.22.0 // indirect @@ -26,9 +34,11 @@ require ( github.com/goccy/go-json v0.10.3 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect + github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/cpuid/v2 v2.2.8 // indirect github.com/leodido/go-urn v1.4.0 // indirect + github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect diff --git a/go.sum b/go.sum index d6f20ba..97bcc73 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= +github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= github.com/bytedance/sonic v1.12.0 h1:YGPgxF9xzaCNvd/ZKdQ28yRovhfMFZQjuk6fKBzZ3ls= github.com/bytedance/sonic v1.12.0/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk= github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= @@ -14,10 +16,20 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/gabriel-vasile/mimetype v1.4.5 h1:J7wGKdGu33ocBOhGy0z653k/lFKLFDPJMG8Gql0kxn4= github.com/gabriel-vasile/mimetype v1.4.5/go.mod h1:ibHel+/kbxn9x2407k1izTA1S81ku1z/DlgOW2QE0M4= +github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4= +github.com/gin-contrib/gzip v0.0.6/go.mod h1:QOJlmV2xmayAjkNS2Y8NQsMneuRShOU/kjovCXNuzzk= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= +github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY= +github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= @@ -50,14 +62,22 @@ github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= @@ -74,6 +94,8 @@ github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6 github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= 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/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -88,33 +110,66 @@ github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/swaggo/files v1.0.1 h1:J1bVJ4XHZNq0I46UU90611i9/YzdrF7x92oX1ig5IdE= +github.com/swaggo/files v1.0.1/go.mod h1:0qXmMNH6sXNf+73t65aKeB+ApmgxdnkQzVTAj2uaMUg= +github.com/swaggo/gin-swagger v1.6.0 h1:y8sxvQ3E20/RCyrXeFfg60r6H0Z+SwpTjMYsMm+zy8M= +github.com/swaggo/gin-swagger v1.6.0/go.mod h1:BG00cCEy294xtVpyIAHG6+e2Qzj/xKlRdOqDkvq0uzo= +github.com/swaggo/swag v1.16.3 h1:PnCYjPCah8FK4I26l2F/KQ4yz3sILcVUN3cTlBFA9Pg= +github.com/swaggo/swag v1.16.3/go.mod h1:DImHIuOFXKpMFAQjcC7FG4m3Dg4+QuUgUzJmKjI/gRk= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc= golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8= golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg= golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= 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/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= diff --git a/model/sca_auth_permission.gen.go b/model/sca_auth_permission.gen.go new file mode 100644 index 0000000..0ec2be6 --- /dev/null +++ b/model/sca_auth_permission.gen.go @@ -0,0 +1,35 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package model + +import ( + "time" +) + +const TableNameScaAuthPermission = "sca_auth_permission" + +// ScaAuthPermission 权限表 +type ScaAuthPermission struct { + ID int64 `gorm:"column:id;type:bigint(20);primaryKey;comment:主键ID" json:"id"` // 主键ID + PermissionName *string `gorm:"column:permission_name;type:varchar(64);comment:权限名称" json:"permission_name"` // 权限名称 + ParentID *int64 `gorm:"column:parent_id;type:bigint(20);comment:父ID" json:"parent_id"` // 父ID + Type *int64 `gorm:"column:type;type:tinyint(4);comment:类型 0 菜单 1 目录 2 按钮 -1其他" json:"type"` // 类型 0 菜单 1 目录 2 按钮 -1其他 + Path *string `gorm:"column:path;type:varchar(255);comment:路径" json:"path"` // 路径 + Status *int64 `gorm:"column:status;type:tinyint(4);comment:状态 0 启用 1 停用" json:"status"` // 状态 0 启用 1 停用 + Icon *string `gorm:"column:icon;type:varchar(128);comment:图标" json:"icon"` // 图标 + PermissionKey *string `gorm:"column:permission_key;type:varchar(64);comment:权限关键字" json:"permission_key"` // 权限关键字 + Order *int64 `gorm:"column:order;type:int(11);comment:排序" json:"order"` // 排序 + CreatedBy *string `gorm:"column:created_by;type:varchar(32);comment:创建人" json:"created_by"` // 创建人 + CreatedTime *time.Time `gorm:"column:created_time;type:datetime;default:CURRENT_TIMESTAMP;autoCreateTime;comment:创建时间" json:"created_time"` // 创建时间 + UpdateBy *string `gorm:"column:update_by;type:varchar(32);comment:更新人" json:"update_by"` // 更新人 + UpdateTime *time.Time `gorm:"column:update_time;type:datetime;default:CURRENT_TIMESTAMP;autoUpdateTime;comment:更新时间" json:"update_time"` // 更新时间 + Deleted *int64 `gorm:"column:deleted;type:int(11);comment:是否删除" json:"deleted"` // 是否删除 + Remark *string `gorm:"column:remark;type:varchar(255);comment:备注 描述" json:"remark"` // 备注 描述 +} + +// TableName ScaAuthPermission's table name +func (*ScaAuthPermission) TableName() string { + return TableNameScaAuthPermission +} diff --git a/model/sca_auth_role.gen.go b/model/sca_auth_role.gen.go new file mode 100644 index 0000000..3b5be7c --- /dev/null +++ b/model/sca_auth_role.gen.go @@ -0,0 +1,28 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package model + +import ( + "time" +) + +const TableNameScaAuthRole = "sca_auth_role" + +// ScaAuthRole 角色表 +type ScaAuthRole struct { + ID int64 `gorm:"column:id;type:bigint(20);primaryKey;comment:主键ID" json:"id"` // 主键ID + RoleName string `gorm:"column:role_name;type:varchar(32);not null;comment:角色名称" json:"role_name"` // 角色名称 + RoleKey string `gorm:"column:role_key;type:varchar(64);not null;comment:角色关键字" json:"role_key"` // 角色关键字 + CreatedBy *string `gorm:"column:created_by;type:varchar(32);comment:创建人" json:"created_by"` // 创建人 + CreatedTime *time.Time `gorm:"column:created_time;type:datetime;default:CURRENT_TIMESTAMP;autoCreateTime;comment:创建时间" json:"created_time"` // 创建时间 + UpdateBy *string `gorm:"column:update_by;type:varchar(32);comment:更新人" json:"update_by"` // 更新人 + UpdateTime *time.Time `gorm:"column:update_time;type:datetime;default:CURRENT_TIMESTAMP;autoUpdateTime;comment:更新时间" json:"update_time"` // 更新时间 + Deleted *int64 `gorm:"column:deleted;type:int(11);comment:是否删除 0 未删除 1已删除" json:"deleted"` // 是否删除 0 未删除 1已删除 +} + +// TableName ScaAuthRole's table name +func (*ScaAuthRole) TableName() string { + return TableNameScaAuthRole +} diff --git a/model/sca_auth_role_permission.gen.go b/model/sca_auth_role_permission.gen.go new file mode 100644 index 0000000..d677ff7 --- /dev/null +++ b/model/sca_auth_role_permission.gen.go @@ -0,0 +1,28 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package model + +import ( + "time" +) + +const TableNameScaAuthRolePermission = "sca_auth_role_permission" + +// ScaAuthRolePermission 角色-权限映射表 +type ScaAuthRolePermission struct { + ID int64 `gorm:"column:id;type:bigint(20);primaryKey;comment:主键ID" json:"id"` // 主键ID + RoleID int64 `gorm:"column:role_id;type:bigint(20);not null;comment:角色ID" json:"role_id"` // 角色ID + PermissionID int64 `gorm:"column:permission_id;type:bigint(20);not null;comment:权限ID" json:"permission_id"` // 权限ID + CreatedBy *string `gorm:"column:created_by;type:varchar(32);comment:创建人" json:"created_by"` // 创建人 + CreatedTime *time.Time `gorm:"column:created_time;type:datetime;default:CURRENT_TIMESTAMP;autoCreateTime;comment:创建时间" json:"created_time"` // 创建时间 + UpdateBy *string `gorm:"column:update_by;type:varchar(32);comment:更新人" json:"update_by"` // 更新人 + UpdateTime *time.Time `gorm:"column:update_time;type:datetime;default:CURRENT_TIMESTAMP;autoUpdateTime;comment:更新时间" json:"update_time"` // 更新时间 + Deleted *int64 `gorm:"column:deleted;type:int(11);comment:是否删除" json:"deleted"` // 是否删除 +} + +// TableName ScaAuthRolePermission's table name +func (*ScaAuthRolePermission) TableName() string { + return TableNameScaAuthRolePermission +} diff --git a/model/sca_auth_user.gen.go b/model/sca_auth_user.gen.go new file mode 100644 index 0000000..14442f7 --- /dev/null +++ b/model/sca_auth_user.gen.go @@ -0,0 +1,40 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package model + +import ( + "time" +) + +const TableNameScaAuthUser = "sca_auth_user" + +// ScaAuthUser 用户表 +type ScaAuthUser struct { + ID int64 `gorm:"column:id;type:bigint(255);primaryKey;autoIncrement:true;comment:自增ID" json:"id"` // 自增ID + UUID *string `gorm:"column:uuid;type:varchar(255);comment:唯一ID" json:"uuid"` // 唯一ID + Username *string `gorm:"column:username;type:varchar(32);comment:用户名" json:"username"` // 用户名 + Nickname *string `gorm:"column:nickname;type:varchar(32);comment:昵称" json:"nickname"` // 昵称 + Email *string `gorm:"column:email;type:varchar(32);comment:邮箱" json:"email"` // 邮箱 + Phone *string `gorm:"column:phone;type:varchar(32);comment:电话" json:"phone"` // 电话 + Password *string `gorm:"column:password;type:varchar(64);comment:密码" json:"password"` // 密码 + Gender *string `gorm:"column:gender;type:varchar(32);comment:性别" json:"gender"` // 性别 + Avatar *string `gorm:"column:avatar;type:varchar(255);comment:头像" json:"avatar"` // 头像 + Status *int64 `gorm:"column:status;type:tinyint(4);comment:状态 0 正常 1 封禁" json:"status"` // 状态 0 正常 1 封禁 + Introduce *string `gorm:"column:introduce;type:varchar(255);comment:介绍" json:"introduce"` // 介绍 + ExtJSON *string `gorm:"column:ext_json;type:varchar(255);comment:额外字段" json:"ext_json"` // 额外字段 + CreatedBy *string `gorm:"column:created_by;type:varchar(32);comment:创建人" json:"created_by"` // 创建人 + CreatedTime *time.Time `gorm:"column:created_time;type:datetime;default:CURRENT_TIMESTAMP;autoCreateTime;comment:创建时间" json:"created_time"` // 创建时间 + UpdateBy *string `gorm:"column:update_by;type:varchar(32);comment:更新人" json:"update_by"` // 更新人 + UpdateTime *time.Time `gorm:"column:update_time;type:datetime;default:CURRENT_TIMESTAMP;autoUpdateTime;comment:更新时间" json:"update_time"` // 更新时间 + Deleted *int64 `gorm:"column:deleted;type:int(11);comment:是否删除 0 未删除 1 已删除" json:"deleted"` // 是否删除 0 未删除 1 已删除 + Blog *string `gorm:"column:blog;type:varchar(255);comment:博客" json:"blog"` // 博客 + Location *string `gorm:"column:location;type:varchar(255);comment:地址" json:"location"` // 地址 + Company *string `gorm:"column:company;type:varchar(255);comment:公司" json:"company"` // 公司 +} + +// TableName ScaAuthUser's table name +func (*ScaAuthUser) TableName() string { + return TableNameScaAuthUser +} diff --git a/model/sca_auth_user_device.gen.go b/model/sca_auth_user_device.gen.go new file mode 100644 index 0000000..bcdf1df --- /dev/null +++ b/model/sca_auth_user_device.gen.go @@ -0,0 +1,34 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package model + +import ( + "time" +) + +const TableNameScaAuthUserDevice = "sca_auth_user_device" + +// ScaAuthUserDevice 用户设备信息 +type ScaAuthUserDevice struct { + ID int64 `gorm:"column:id;type:bigint(20);primaryKey;comment:主键ID" json:"id"` // 主键ID + UserID *int64 `gorm:"column:user_id;type:bigint(20);comment:用户ID" json:"user_id"` // 用户ID + IP *string `gorm:"column:ip;type:varchar(255);comment:登录IP" json:"ip"` // 登录IP + Location *string `gorm:"column:location;type:varchar(255);comment:地址" json:"location"` // 地址 + Agent *string `gorm:"column:agent;type:varchar(255);comment:设备信息" json:"agent"` // 设备信息 + ExtJSON *string `gorm:"column:ext_json;type:varchar(255);comment:额外字段" json:"ext_json"` // 额外字段 + CreatedBy *string `gorm:"column:created_by;type:varchar(32);comment:创建人" json:"created_by"` // 创建人 + CreatedTime *time.Time `gorm:"column:created_time;type:datetime;default:CURRENT_TIMESTAMP;autoCreateTime;comment:创建时间" json:"created_time"` // 创建时间 + UpdateBy *string `gorm:"column:update_by;type:varchar(32);comment:更新人" json:"update_by"` // 更新人 + UpdateTime *time.Time `gorm:"column:update_time;type:datetime;default:CURRENT_TIMESTAMP;autoUpdateTime;comment:更新时间" json:"update_time"` // 更新时间 + Deleted *int64 `gorm:"column:deleted;type:int(11);comment:是否删除" json:"deleted"` // 是否删除 + Browser *string `gorm:"column:browser;type:varchar(255);comment:浏览器" json:"browser"` // 浏览器 + OperatingSystem *string `gorm:"column:operating_system;type:varchar(255);comment:操作系统" json:"operating_system"` // 操作系统 + BrowserVersion *string `gorm:"column:browser_version;type:varchar(255);comment:浏览器版本" json:"browser_version"` // 浏览器版本 +} + +// TableName ScaAuthUserDevice's table name +func (*ScaAuthUserDevice) TableName() string { + return TableNameScaAuthUserDevice +} diff --git a/model/sca_auth_user_role.gen.go b/model/sca_auth_user_role.gen.go new file mode 100644 index 0000000..5453311 --- /dev/null +++ b/model/sca_auth_user_role.gen.go @@ -0,0 +1,28 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package model + +import ( + "time" +) + +const TableNameScaAuthUserRole = "sca_auth_user_role" + +// ScaAuthUserRole 用户-角色映射表 +type ScaAuthUserRole struct { + ID int64 `gorm:"column:id;type:bigint(20);primaryKey;comment:主键ID" json:"id"` // 主键ID + UserID int64 `gorm:"column:user_id;type:bigint(20);not null;comment:用户ID" json:"user_id"` // 用户ID + RoleID int64 `gorm:"column:role_id;type:bigint(20);not null;comment:角色ID" json:"role_id"` // 角色ID + CreatedBy *string `gorm:"column:created_by;type:varchar(32);comment:创建人" json:"created_by"` // 创建人 + CreatedTime *time.Time `gorm:"column:created_time;type:datetime;default:CURRENT_TIMESTAMP;autoCreateTime;comment:创建时间" json:"created_time"` // 创建时间 + UpdateBy *string `gorm:"column:update_by;type:varchar(32);comment:更新人" json:"update_by"` // 更新人 + UpdateTime *time.Time `gorm:"column:update_time;type:datetime;default:CURRENT_TIMESTAMP;autoUpdateTime;comment:更新时间" json:"update_time"` // 更新时间 + Deleted *int64 `gorm:"column:deleted;type:int(11);comment:是否删除" json:"deleted"` // 是否删除 +} + +// TableName ScaAuthUserRole's table name +func (*ScaAuthUserRole) TableName() string { + return TableNameScaAuthUserRole +} diff --git a/model/sca_auth_user_social.gen.go b/model/sca_auth_user_social.gen.go new file mode 100644 index 0000000..e09f941 --- /dev/null +++ b/model/sca_auth_user_social.gen.go @@ -0,0 +1,46 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package model + +import ( + "time" +) + +const TableNameScaAuthUserSocial = "sca_auth_user_social" + +// ScaAuthUserSocial 社会用户信息表 +type ScaAuthUserSocial struct { + ID int64 `gorm:"column:id;type:bigint(20);primaryKey;comment:主键ID" json:"id"` // 主键ID + UserID int64 `gorm:"column:user_id;type:bigint(20);not null;comment:用户ID" json:"user_id"` // 用户ID + UUID *string `gorm:"column:uuid;type:varchar(255);comment:第三方系统的唯一ID" json:"uuid"` // 第三方系统的唯一ID + Source *string `gorm:"column:source;type:varchar(255);comment:第三方用户来源" json:"source"` // 第三方用户来源 + AccessToken *string `gorm:"column:access_token;type:varchar(255);comment:用户的授权令牌" json:"access_token"` // 用户的授权令牌 + ExpireIn *int64 `gorm:"column:expire_in;type:int(11);comment:第三方用户的授权令牌的有效期" json:"expire_in"` // 第三方用户的授权令牌的有效期 + RefreshToken *string `gorm:"column:refresh_token;type:varchar(255);comment:刷新令牌" json:"refresh_token"` // 刷新令牌 + OpenID *string `gorm:"column:open_id;type:varchar(255);comment:第三方用户的 open id" json:"open_id"` // 第三方用户的 open id + UID *string `gorm:"column:uid;type:varchar(255);comment:第三方用户的 ID" json:"uid"` // 第三方用户的 ID + AccessCode *string `gorm:"column:access_code;type:varchar(255);comment:个别平台的授权信息" json:"access_code"` // 个别平台的授权信息 + UnionID *string `gorm:"column:union_id;type:varchar(255);comment:第三方用户的 union id" json:"union_id"` // 第三方用户的 union id + Scope *string `gorm:"column:scope;type:varchar(255);comment:第三方用户授予的权限" json:"scope"` // 第三方用户授予的权限 + TokenType *string `gorm:"column:token_type;type:varchar(255);comment:个别平台的授权信息" json:"token_type"` // 个别平台的授权信息 + IDToken *string `gorm:"column:id_token;type:varchar(255);comment:id token" json:"id_token"` // id token + MacAlgorithm *string `gorm:"column:mac_algorithm;type:varchar(255);comment:小米平台用户的附带属性" json:"mac_algorithm"` // 小米平台用户的附带属性 + MacKey *string `gorm:"column:mac_key;type:varchar(255);comment:小米平台用户的附带属性" json:"mac_key"` // 小米平台用户的附带属性 + Code *string `gorm:"column:code;type:varchar(255);comment:用户的授权code" json:"code"` // 用户的授权code + OauthToken *string `gorm:"column:oauth_token;type:varchar(255);comment:Twitter平台用户的附带属性" json:"oauth_token"` // Twitter平台用户的附带属性 + OauthTokenSecret *string `gorm:"column:oauth_token_secret;type:varchar(255);comment:Twitter平台用户的附带属性" json:"oauth_token_secret"` // Twitter平台用户的附带属性 + Status *string `gorm:"column:status;type:varchar(255);comment:状态 0正常 1 封禁" json:"status"` // 状态 0正常 1 封禁 + ExtJSON *string `gorm:"column:ext_json;type:varchar(255);comment:额外字段" json:"ext_json"` // 额外字段 + CreatedBy *string `gorm:"column:created_by;type:varchar(32);comment:创建人" json:"created_by"` // 创建人 + CreatedTime *time.Time `gorm:"column:created_time;type:datetime;default:CURRENT_TIMESTAMP;autoCreateTime;comment:创建时间" json:"created_time"` // 创建时间 + UpdateBy *string `gorm:"column:update_by;type:varchar(32);comment:更新人" json:"update_by"` // 更新人 + UpdateTime *time.Time `gorm:"column:update_time;type:datetime;default:CURRENT_TIMESTAMP;autoUpdateTime;comment:更新时间" json:"update_time"` // 更新时间 + Deleted *int64 `gorm:"column:deleted;type:int(11);comment:是否删除" json:"deleted"` // 是否删除 +} + +// TableName ScaAuthUserSocial's table name +func (*ScaAuthUserSocial) TableName() string { + return TableNameScaAuthUserSocial +} diff --git a/router/modules/auth_user_router.go b/router/modules/auth_user_router.go index 4c86475..0fefbf7 100644 --- a/router/modules/auth_user_router.go +++ b/router/modules/auth_user_router.go @@ -2,12 +2,12 @@ package modules import ( "github.com/gin-gonic/gin" - "schisandra-cloud-album/common/result" + "schisandra-cloud-album/api" ) +var authApi = api.Api.AuthApi + func AuthRouter(router *gin.RouterGroup) { group := router.Group("auth") - group.GET("/user", func(c *gin.Context) { - result.FailWithCode(result.SystemError, c) - }) + group.GET("/user/List", authApi.GetUserList) } diff --git a/router/modules/swagger_router.go b/router/modules/swagger_router.go new file mode 100644 index 0000000..58d53ca --- /dev/null +++ b/router/modules/swagger_router.go @@ -0,0 +1,13 @@ +package modules + +import ( + "github.com/gin-gonic/gin" + swaggerFiles "github.com/swaggo/files" + ginSwagger "github.com/swaggo/gin-swagger" + "schisandra-cloud-album/docs" +) + +func SwaggerRouter(router *gin.Engine) { + docs.SwaggerInfo.BasePath = "" + router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) +} diff --git a/router/router.go b/router/router.go index f810215..f6c0c6d 100644 --- a/router/router.go +++ b/router/router.go @@ -8,8 +8,14 @@ import ( func InitRouter() *gin.Engine { gin.SetMode(global.CONFIG.System.Env) - Router := gin.Default() - PublicGroup := Router.Group("api") - modules.AuthRouter(PublicGroup) - return Router + router := gin.Default() + err := router.SetTrustedProxies([]string{"127.0.0.1"}) + if err != nil { + global.LOG.Error(err) + return nil + } + PublicGroup := router.Group("api") + modules.SwaggerRouter(router) // 注册swagger路由 + modules.AuthRouter(PublicGroup) // 注册鉴权路由 + return router } diff --git a/service/auth_service/auth_service.go b/service/auth_service/auth_service.go new file mode 100644 index 0000000..b82baf4 --- /dev/null +++ b/service/auth_service/auth_service.go @@ -0,0 +1,12 @@ +package auth_service + +import ( + "schisandra-cloud-album/global" + "schisandra-cloud-album/model" +) + +func (AuthService) GetUserList() []*model.ScaAuthUser { + data := make([]*model.ScaAuthUser, 0) + global.DB.Find(&data) + return data +} diff --git a/service/auth_service/enter.go b/service/auth_service/enter.go new file mode 100644 index 0000000..11b5d34 --- /dev/null +++ b/service/auth_service/enter.go @@ -0,0 +1,3 @@ +package auth_service + +type AuthService struct{} diff --git a/service/service.go b/service/service.go new file mode 100644 index 0000000..6c9e083 --- /dev/null +++ b/service/service.go @@ -0,0 +1,13 @@ +package service + +import ( + "schisandra-cloud-album/service/auth_service" +) + +// Services 统一导出的service +type Services struct { + AuthService auth_service.AuthService +} + +// Service new函数实例化,实例化完成后会返回结构体地指针类型 +var Service = new(Services)