feat(1.0): 初始化项目

This commit is contained in:
summer 2025-10-16 13:28:24 +08:00
parent 0ff31aa6a1
commit 7c060c216a
127 changed files with 24951 additions and 0 deletions

3
.gitignore vendored
View File

@ -25,3 +25,6 @@ go.work.sum
# env file
.env
*.idea
resources/*

View File

@ -1,2 +1,17 @@
# mini-chat
## 接口文档
- 接口文档http://127.0.0.1:9991/swagger/index.html
- 心跳检测http://127.0.0.1:9991/system/health
## 服务地址
- https://mini-chat.1024tool.vip/swagger/index.html
## 打包命令
### MAC
```
$ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -ldflags '-w -s' -trimpath -o miniChat
```

39
cmd/gormgen/README.md Normal file
View File

@ -0,0 +1,39 @@
## 自动生成数据库模型和常见的 CRUD 操作
### Usage
```shell
go run cmd/gormgen/main.go -h
Usage of ./cmd/gormgen/main.go:
-dsn string
consult[https://gorm.io/docs/connecting_to_the_database.html]
-tables string
enter the required data table or leave it blank
```
#### -dsn
用于连接数据库的DSN reference: https://gorm.io/docs/connecting_to_the_database.html
#### -tables
指定要生成的表名称,默认所有表。
eg :
```shell
--tables="orders" # generate from `orders`
--tables="orders,users" # generate from `orders` and `users`
--tables="" # generate from all tables
```
## 示例
```shell
# 根目录下执行
go run cmd/gormgen/main.go -dsn "root:api2api..@tcp(sh-cynosdbmysql-grp-88th45wy.sql.tencentcdb.com:28555)/mini_chat?charset=utf8mb4&parseTime=True&loc=Local" -tables "log_operation,log_request,admin,app_keyword,app_keyword_reply,app_user,app_message_log,mini_program"
```

105
cmd/gormgen/main.go Normal file
View File

@ -0,0 +1,105 @@
package main
import (
"flag"
"log"
"os"
"strings"
"gorm.io/driver/mysql"
"gorm.io/driver/sqlite"
"gorm.io/gen"
"gorm.io/gorm"
"gorm.io/gorm/schema"
)
func main() {
dsn := flag.String("dsn", "", "consult[https://gorm.io/docs/connecting_to_the_database.html]")
db := flag.String("db", "", "input mysql|sqlite")
tables := flag.String("tables", "", "enter the required data table or leave it blank")
flag.Parse()
if *dsn == "" {
log.Fatal("dsn cannot be empty, please provide a valid dsn value.")
}
if *db == "" {
*db = "mysql"
}
// 初始化 GORM 数据库连接
var gormDb *gorm.DB
var err error
var daoPath string
var modelPath string
switch *db {
case "mysql":
gormDb, err = gorm.Open(mysql.Open(*dsn), &gorm.Config{
NamingStrategy: schema.NamingStrategy{
SingularTable: true,
},
})
daoPath = "/internal/repository/mysql/dao"
modelPath = "/internal/repository/mysql/model"
case "sqlite":
gormDb, err = gorm.Open(sqlite.Open(*dsn), &gorm.Config{
NamingStrategy: schema.NamingStrategy{
SingularTable: true,
},
})
daoPath = "/internal/repository/sqlite/dao"
modelPath = "/internal/repository/sqlite/model"
default:
log.Fatalf("Unsupported database type: %s. Supported types: mysql, sqlite", *db)
}
if err != nil {
log.Fatalf("failed to connect database: %s", err.Error())
}
// 获取当前工作目录
wd, err := os.Getwd()
if err != nil {
log.Fatalf("Error getting working directory:%s", err.Error())
}
// 初始化代码生成器
g := gen.NewGenerator(gen.Config{
OutPath: wd + daoPath, // 指定生成代码的输出目录
ModelPkgPath: wd + modelPath, // 指定模型文件存放的包路径
Mode: gen.WithoutContext | gen.WithDefaultQuery,
})
// 使用已连接的数据库
g.UseDB(gormDb)
// 生成表的模型
tableMaps := strings.Split(*tables, ",")
if len(tableMaps) == 0 || *tables == "" {
g.ApplyBasic(
g.GenerateAllTable()...,
)
} else {
tableList := make([]string, 0, len(tableMaps))
for _, tableName := range tableMaps {
_tableName := strings.TrimSpace(string(tableName)) // trim leading and trailing space in tableName
if _tableName == "" { // skip empty tableName
continue
}
tableList = append(tableList, _tableName)
}
// Execute some data table tasks
models := make([]interface{}, len(tableList))
for i, tableName := range tableList {
models[i] = g.GenerateModel(tableName)
}
g.ApplyBasic(models...)
}
// 生成代码
g.Execute()
}

28
cmd/handlergen/README.md Normal file
View File

@ -0,0 +1,28 @@
## 自动生成数据库模型和常见的 CRUD 操作
### Usage
```shell
go run cmd/handlergen/main.go -h
Usage of ./cmd/handlergen/main.go:
-table string
enter the required data table
```
#### -table
指定要生成的表名称。
eg :
```shell
--tables="admin" # generate from `admin`
```
## 示例
```shell
# 根目录下执行
go run cmd/handlergen/main.go -table "customer"
```

View File

@ -0,0 +1,265 @@
package {{.PackageName}}
import (
"net/http"
"strconv"
"mini-chat/internal/code"
"mini-chat/internal/pkg/core"
"WeChatService/internal/pkg/logger"
"mini-chat/internal/repository/mysql"
"mini-chat/internal/repository/mysql/dao"
"mini-chat/internal/repository/mysql/model"
"go.uber.org/zap"
"gorm.io/gorm"
)
type handler struct {
logger logger.CustomLoggerLogger
writeDB *dao.Query
readDB *dao.Query
}
type genResultInfo struct {
RowsAffected int64 `json:"rows_affected"`
Error error `json:"error"`
}
func New(logger logger.CustomLogger, db mysql.Repo) *handler {
return &handler{
logger: logger,
writeDB: dao.Use(db.GetDbW()),
readDB: dao.Use(db.GetDbR()),
}
}
// Create 新增数据
// @Summary 新增数据
// @Description 新增数据
// @Tags API.{{.VariableName}}
// @Accept json
// @Produce json
// @Param RequestBody body model.{{.StructName}} true "请求参数"
// @Success 200 {object} model.{{.StructName}}
// @Failure 400 {object} code.Failure
// @Router /api/{{.VariableName}} [post]
func (h *handler) Create() core.HandlerFunc {
return func(ctx core.Context) {
var createData model.{{.StructName}}
if err := ctx.ShouldBindJSON(&createData); err != nil {
ctx.AbortWithError(core.Error(
http.StatusBadRequest,
code.ParamBindError,
err.Error()),
)
return
}
if err := h.writeDB.{{.StructName}}.WithContext(ctx.RequestContext()).Create(&createData); err != nil {
ctx.AbortWithError(core.Error(
http.StatusBadRequest,
code.ServerError,
err.Error()),
)
return
}
ctx.Payload(createData)
}
}
// List 获取列表数据
// @Summary 获取列表数据
// @Description 获取列表数据
// @Tags API.{{.VariableName}}
// @Accept json
// @Produce json
// @Success 200 {object} []model.{{.StructName}}
// @Failure 400 {object} code.Failure
// @Router /api/{{.VariableName}}s [get]
func (h *handler) List() core.HandlerFunc {
return func(ctx core.Context) {
list, err := h.readDB.{{.StructName}}.WithContext(ctx.RequestContext()).Find()
if err != nil {
ctx.AbortWithError(core.Error(
http.StatusBadRequest,
code.ServerError,
err.Error()),
)
return
}
ctx.Payload(list)
}
}
// GetByID 根据 ID 获取数据
// @Summary 根据 ID 获取数据
// @Description 根据 ID 获取数据
// @Tags API.{{.VariableName}}
// @Accept json
// @Produce json
// @Param id path string true "ID"
// @Success 200 {object} model.{{.StructName}}
// @Failure 400 {object} code.Failure
// @Router /api/{{.VariableName}}/{id} [get]
func (h *handler) GetByID() core.HandlerFunc {
return func(ctx core.Context) {
id, err := strconv.Atoi(ctx.Param("id"))
if err != nil {
ctx.AbortWithError(core.Error(
http.StatusBadRequest,
code.ParamBindError,
err.Error()),
)
return
}
info, err := h.readDB.{{.StructName}}.WithContext(ctx.RequestContext()).Where(h.readDB.{{.StructName}}.ID.Eq(int32(id))).First()
if err != nil {
if err == gorm.ErrRecordNotFound {
ctx.AbortWithError(core.Error(
http.StatusBadRequest,
code.ServerError,
"record not found"),
)
} else {
ctx.AbortWithError(core.Error(
http.StatusBadRequest,
code.ServerError,
err.Error()),
)
}
return
}
ctx.Payload(info)
}
}
// DeleteByID 根据 ID 删除数据
// @Summary 根据 ID 删除数据
// @Description 根据 ID 删除数据
// @Tags API.{{.VariableName}}
// @Accept json
// @Produce json
// @Param id path string true "ID"
// @Success 200 {object} genResultInfo
// @Failure 400 {object} code.Failure
// @Router /api/{{.VariableName}}/{id} [delete]
func (h *handler) DeleteByID() core.HandlerFunc {
return func(ctx core.Context) {
id, err := strconv.Atoi(ctx.Param("id"))
if err != nil {
ctx.AbortWithError(core.Error(
http.StatusBadRequest,
code.ParamBindError,
err.Error()),
)
return
}
info, err := h.readDB.{{.StructName}}.WithContext(ctx.RequestContext()).Where(h.readDB.{{.StructName}}.ID.Eq(int32(id))).First()
if err != nil {
if err == gorm.ErrRecordNotFound {
ctx.AbortWithError(core.Error(
http.StatusBadRequest,
code.ServerError,
"record not found"),
)
} else {
ctx.AbortWithError(core.Error(
http.StatusBadRequest,
code.ServerError,
err.Error()),
)
}
return
}
result, err := h.writeDB.{{.StructName}}.Delete(info)
if err != nil {
ctx.AbortWithError(core.Error(
http.StatusBadRequest,
code.ServerError,
err.Error()),
)
}
resultInfo := new(genResultInfo)
resultInfo.RowsAffected = result.RowsAffected
resultInfo.Error = result.Error
ctx.Payload(resultInfo)
}
}
// UpdateByID 根据 ID 更新数据
// @Summary 根据 ID 更新数据
// @Description 根据 ID 更新数据
// @Tags API.{{.VariableName}}
// @Accept json
// @Produce json
// @Param id path string true "ID"
// @Param RequestBody body model.{{.StructName}} true "请求参数"
// @Success 200 {object} genResultInfo
// @Failure 400 {object} code.Failure
// @Router /api/{{.VariableName}}/{id} [put]
func (h *handler) UpdateByID() core.HandlerFunc {
return func(ctx core.Context) {
id, err := strconv.Atoi(ctx.Param("id"))
if err != nil {
ctx.AbortWithError(core.Error(
http.StatusBadRequest,
code.ParamBindError,
err.Error()),
)
return
}
var updateData map[string]interface{}
if err := ctx.ShouldBindJSON(&updateData); err != nil {
ctx.AbortWithError(core.Error(
http.StatusBadRequest,
code.ServerError,
err.Error()),
)
return
}
info, err := h.readDB.{{.StructName}}.WithContext(ctx.RequestContext()).Where(h.readDB.{{.StructName}}.ID.Eq(int32(id))).First()
if err != nil {
if err == gorm.ErrRecordNotFound {
ctx.AbortWithError(core.Error(
http.StatusBadRequest,
code.ServerError,
"record not found"),
)
} else {
ctx.AbortWithError(core.Error(
http.StatusBadRequest,
code.ServerError,
err.Error()),
)
}
return
}
result, err := h.writeDB.{{.StructName}}.WithContext(ctx.RequestContext()).Where(h.writeDB.{{.StructName}}.ID.Eq(info.ID)).Updates(updateData)
if err != nil {
ctx.AbortWithError(core.Error(
http.StatusBadRequest,
code.ServerError,
err.Error()),
)
return
}
resultInfo := new(genResultInfo)
resultInfo.RowsAffected = result.RowsAffected
resultInfo.Error = result.Error
ctx.Payload(resultInfo)
}
}

90
cmd/handlergen/main.go Normal file
View File

@ -0,0 +1,90 @@
package main
import (
"flag"
"fmt"
"log"
"os"
"path/filepath"
"strings"
"text/template"
)
type TemplateData struct {
PackageName string
VariableName string
StructName string
}
func main() {
table := flag.String("table", "", "enter the required data table")
flag.Parse()
tableName := *table
if tableName == "" {
log.Fatal("table cannot be empty, please provide a valid table name.")
}
// 获取当前工作目录
wd, err := os.Getwd()
if err != nil {
log.Fatalf("Error getting working directory:%s", err.Error())
}
// 模板文件路径
tmplPath := fmt.Sprintf("%s/cmd/handlergen/handler_template.go.tpl", wd)
tmpl, err := template.ParseFiles(tmplPath)
if err != nil {
log.Fatal(err)
}
log.Printf("Template file parsed: %s", tmplPath)
// 替换的变量
data := TemplateData{
PackageName: tableName,
VariableName: tableName,
StructName: toCamelCase(tableName),
}
// 生成文件的目录和文件名
outputDir := fmt.Sprintf("%s/internal/api/%s", wd, tableName)
outputFile := filepath.Join(outputDir, fmt.Sprintf("%s.gen.go", tableName))
// 创建目录
err = os.MkdirAll(outputDir, os.ModePerm)
if err != nil {
log.Fatal(err)
}
// 创建文件
file, err := os.Create(outputFile)
if err != nil {
log.Fatal(err)
}
defer file.Close()
log.Printf("File created: %s", outputFile)
// 执行模板并生成文件
err = tmpl.Execute(file, data)
if err != nil {
log.Fatal(err)
}
log.Println("Template execution completed successfully.")
}
// 将字符串转为驼峰式命名
func toCamelCase(s string) string {
// 用下划线分割字符串
parts := strings.Split(s, "_")
// 对每个部分首字母大写
for i := 0; i < len(parts); i++ {
parts[i] = strings.Title(parts[i])
}
// 拼接所有部分
return strings.Join(parts, "")
}

38
cmd/mfmt/README.md Normal file
View File

@ -0,0 +1,38 @@
## 代码格式化工具:`mfmt`
### 概述
`mfmt` 是一个高效的代码格式化工具,旨在帮助开发者按照既定规则格式化 Go 语言代码。它特别关注于 import 语句的分组排序和代码风格的统一。
### 功能特点
1. **Import 语句分组排序**
- **标准库**:自动将属于 Go 标准库的包归为一组。
- **本地模块**:将当前模块名(从 `go.mod` 文件中的 `module` 声明获取)为前缀的包归为一组。
- **第三方包**:将不属于上述两类的包归为一组。
2. **文件和目录跳过规则**
- 忽略以点(`.`)开头的文件或目录。
- 忽略非 `.go` 后缀的文件。
- 忽略 `vendor` 目录。
- 忽略文件名以 `.pb.go``gen.go` 结尾的文件。
3. **代码格式化**
- 使用 `format.Source` 对文件内容进行格式化,确保代码符合 Go 的格式标准。
### 应用场景
- **代码质量检查**:自动检查代码格式,提升代码质量。
- **项目规范管理**:自动化项目代码规范,减少人工干预。
- **团队协作**:在团队中保持代码风格的一致性,特别是在 import 组织和注释规范化方面。
### 使用方法
在项目的根目录下执行以下命令:
```shell
# 在项目根目录下运行
go run mfmt/main.go
```
这将对项目中的 Go 代码文件进行格式化,按照上述规则重新组织 import 语句,并确保代码风格统一。

206
cmd/mfmt/main.go Normal file
View File

@ -0,0 +1,206 @@
package main
import (
"bufio"
"bytes"
"crypto/sha256"
"fmt"
"go/ast"
"go/format"
"go/parser"
"go/token"
"io/ioutil"
"log"
"os"
"path/filepath"
"strings"
"mini-chat/internal/pkg/errors"
"go.uber.org/zap"
"golang.org/x/tools/go/packages"
)
var stdlib = make(map[string]bool)
func init() {
pkgs, err := packages.Load(nil, "std")
if err != nil {
log.Fatal("get go stdlib err", zap.Error(err))
}
for _, pkg := range pkgs {
if !strings.HasPrefix(pkg.ID, "vendor") {
stdlib[pkg.ID] = true
}
}
}
var module string
func init() {
file, err := os.Open("./go.mod")
if err != nil {
log.Fatal("no go.mod file found", zap.Error(err))
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := strings.TrimSpace(scanner.Text())
if strings.HasPrefix(line, "module ") {
module = strings.TrimSpace(line[7:])
break
}
}
if module == "" {
log.Fatal("go.mod illegal")
}
}
func main() {
wd, err := os.Getwd()
if err != nil {
log.Fatalf("Error getting working directory:%s", err.Error())
}
err = filepath.Walk(wd, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if info.IsDir() ||
strings.HasPrefix(path, ".") ||
strings.HasPrefix(path, "vendor") ||
strings.HasSuffix(path, ".pb.go") ||
strings.HasSuffix(path, "gen.go") ||
filepath.Ext(path) != ".go" {
return nil
}
raw, err := ioutil.ReadFile(path)
if err != nil {
return errors.Wrapf(err, "read file %s err", path)
}
digest0 := sha256.Sum256(raw)
if raw, err = format.Source(raw); err != nil {
return errors.Wrapf(err, "format file %s err", path)
}
file, err := parser.ParseFile(token.NewFileSet(), "", raw, 0)
if err != nil {
return errors.Wrapf(err, "parse file %s err", path)
}
var first, last int
var imports []*ast.ImportSpec
comments := make(map[string]string)
ast.Inspect(file, func(n ast.Node) bool {
switch spec := n.(type) {
case *ast.ImportSpec:
if first == 0 {
first = int(spec.Pos())
}
last = int(spec.End())
imports = append(imports, spec)
k := last - 1
for ; k < len(raw); k++ {
if raw[k] == '\r' || raw[k] == '\n' {
break
}
}
comment := string(raw[last-1 : k])
if index := strings.Index(comment, "//"); index != -1 {
comments[spec.Path.Value] = strings.TrimSpace(comment[index+2:])
}
}
return true
})
if imports != nil {
buf := bytes.NewBuffer(nil)
buf.Write(raw[:first-2])
buf.WriteString(sort(imports, comments))
buf.Write(raw[last-1:])
if raw, err = format.Source(buf.Bytes()); err != nil {
return errors.Wrapf(err, "double format file %s err", path)
}
}
digest1 := sha256.Sum256(raw)
if !bytes.Equal(digest0[:], digest1[:]) {
fmt.Println(path)
}
if err = ioutil.WriteFile(path, raw, info.Mode()); err != nil {
return errors.Wrapf(err, "write file %s err", path)
}
return nil
})
if err != nil {
log.Fatal("scan project err", zap.Error(err))
}
}
func sort(imports []*ast.ImportSpec, comments map[string]string) string {
system := bytes.NewBuffer(nil)
group := bytes.NewBuffer(nil)
others := bytes.NewBuffer(nil)
for _, pkg := range imports {
value := strings.Trim(pkg.Path.Value, `"`)
switch {
case stdlib[value]:
if pkg.Name != nil {
system.WriteString(pkg.Name.String())
system.WriteString(" ")
}
system.WriteString(pkg.Path.Value)
if comment, ok := comments[pkg.Path.Value]; ok {
system.WriteString(" ")
system.WriteString("// ")
system.WriteString(comment)
}
system.WriteString("\n")
case strings.HasPrefix(value, module):
if pkg.Name != nil {
group.WriteString(pkg.Name.String())
group.WriteString(" ")
}
group.WriteString(pkg.Path.Value)
if comment, ok := comments[pkg.Path.Value]; ok {
group.WriteString(" ")
group.WriteString("// ")
group.WriteString(comment)
}
group.WriteString("\n")
default:
if pkg.Name != nil {
others.WriteString(pkg.Name.String())
others.WriteString(" ")
}
others.WriteString(pkg.Path.Value)
if comment, ok := comments[pkg.Path.Value]; ok {
others.WriteString(" ")
others.WriteString("// ")
others.WriteString(comment)
}
others.WriteString("\n")
}
}
return fmt.Sprintf("%s\n%s\n%s", system.String(), group.String(), others.String())
}

85
configs/configs.go Normal file
View File

@ -0,0 +1,85 @@
package configs
import (
"bytes"
_ "embed"
"io"
"mini-chat/internal/pkg/env"
"github.com/spf13/viper"
)
var config = new(Config)
type Config struct {
MySQL struct {
Read struct {
Addr string `toml:"addr"`
User string `toml:"user"`
Pass string `toml:"pass"`
Name string `toml:"name"`
} `toml:"read"`
Write struct {
Addr string `toml:"addr"`
User string `toml:"user"`
Pass string `toml:"pass"`
Name string `toml:"name"`
} `toml:"write"`
} `toml:"mysql"`
JWT struct {
AdminSecret string `toml:"admin_secret"`
PatientSecret string `toml:"patient_secret"`
DoctorSecret string `toml:"doctor_secret"`
} `toml:"jwt"`
Language struct {
Local string `toml:"local"`
} `toml:"language"`
}
var (
//go:embed dev_configs.toml
devConfigs []byte
//go:embed fat_configs.toml
fatConfigs []byte
//go:embed uat_configs.toml
uatConfigs []byte
//go:embed pro_configs.toml
proConfigs []byte
)
func init() {
var r io.Reader
switch env.Active().Value() {
case "dev":
r = bytes.NewReader(devConfigs)
case "fat":
r = bytes.NewReader(fatConfigs)
case "uat":
r = bytes.NewReader(uatConfigs)
case "pro":
r = bytes.NewReader(proConfigs)
default:
r = bytes.NewReader(fatConfigs)
}
viper.SetConfigType("toml")
if err := viper.ReadConfig(r); err != nil {
panic(err)
}
if err := viper.Unmarshal(config); err != nil {
panic(err)
}
}
func Get() Config {
return *config
}

55
configs/constants.go Normal file
View File

@ -0,0 +1,55 @@
package configs
import (
"log"
"os"
"path/filepath"
"strings"
)
const (
// ProjectName 项目名称
ProjectName = "mini-chat"
// ProjectPort 项目端口
ProjectPort = ":9991"
// ProjectAccessLogFile 项目访问日志存放文件
ProjectAccessLogFile = "./logs/" + ProjectName + "-access.log"
// ZhCN 简体中文 - 中国
ZhCN = "zh-cn"
// EnUS 英文 - 美国
EnUS = "en-us"
// CustomerProjectNameZh 客户项目中文名称
CustomerProjectNameZh = "微聊"
// CustomerProjectNameEn 客户项目英文名称
CustomerProjectNameEn = "Mini Chat"
// CustomerProjectVersion 客户项目版本
CustomerProjectVersion = "Release-2025101601"
)
// GetResourcesFilePath 获取资源文件路径
func GetResourcesFilePath() string {
return filepath.Join(getProjectPath(), "resources")
}
// getProjectPath 获取项目路径
func getProjectPath() string {
executablePath, err := os.Executable()
if err != nil {
log.Println("Error getting executable path:", err)
return ""
}
// 检查路径是否含有临时目录特征,这里仅为示例,实际情况可能需要更复杂的判断
if strings.Contains(executablePath, "/tmp/") || strings.Contains(executablePath, "var/folders/") {
return ""
} else {
return filepath.Dir(executablePath)
}
}

0
configs/dev_configs.toml Normal file
View File

19
configs/fat_configs.toml Normal file
View File

@ -0,0 +1,19 @@
[language]
local = 'zh-cn'
[mysql.read]
addr = 'sh-cynosdbmysql-grp-88th45wy.sql.tencentcdb.com:28555'
name = 'mini_chat'
pass = 'api2api..'
user = 'root'
[mysql.write]
addr = 'sh-cynosdbmysql-grp-88th45wy.sql.tencentcdb.com:28555'
name = 'mini_chat'
pass = 'api2api..'
user = 'root'
[jwt]
admin_secret = "m9ycX9RTPyuYTWw9FrMm"
patient_secret = "p0yxX0RTPyuYTWw0FrPp"
doctor_secret = "d8ycC8RTPyuYTWw8FrDd"

2
configs/pro_configs.toml Normal file
View File

@ -0,0 +1,2 @@

2
configs/uat_configs.toml Normal file
View File

@ -0,0 +1,2 @@

3791
docs/docs.go Normal file

File diff suppressed because it is too large Load Diff

3765
docs/swagger.json Normal file

File diff suppressed because it is too large Load Diff

2588
docs/swagger.yaml Normal file

File diff suppressed because it is too large Load Diff

110
go.mod Normal file
View File

@ -0,0 +1,110 @@
module mini-chat
go 1.19
require (
github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.7
github.com/alibabacloud-go/openapi-util v0.1.1
github.com/alibabacloud-go/tea v1.3.9
github.com/alibabacloud-go/tea-utils/v2 v2.0.7
github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible
github.com/aliyun/credentials-go v1.4.6
github.com/bwmarrin/snowflake v0.3.0
github.com/bytedance/sonic v1.13.2
github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be
github.com/fatih/color v1.14.1
github.com/gin-contrib/pprof v1.4.0
github.com/gin-gonic/gin v1.9.1
github.com/go-playground/locales v0.14.1
github.com/go-playground/universal-translator v0.18.1
github.com/go-playground/validator/v10 v10.15.0
github.com/go-resty/resty/v2 v2.10.0
github.com/golang-jwt/jwt/v5 v5.2.0
github.com/jakecoffman/cron v0.0.0-20190106200828-7e2009c226a5
github.com/pkg/errors v0.9.1
github.com/prometheus/client_golang v1.17.0
github.com/rs/cors/wrapper/gin v0.0.0-20231013084403-73f81b45a644
github.com/spf13/cast v1.5.1
github.com/spf13/viper v1.17.0
github.com/swaggo/files v1.0.1
github.com/swaggo/gin-swagger v1.6.0
github.com/swaggo/swag v1.16.2
github.com/tealeg/xlsx v1.0.5
go.uber.org/multierr v1.10.0
go.uber.org/zap v1.26.0
golang.org/x/crypto v0.27.0
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d
gopkg.in/natefinch/lumberjack.v2 v2.2.1
gorm.io/driver/mysql v1.5.2
gorm.io/driver/sqlite v1.4.3
gorm.io/gen v0.3.26
gorm.io/gorm v1.25.9
gorm.io/plugin/dbresolver v1.5.0
)
require (
github.com/KyleBanks/depth v1.2.1 // indirect
github.com/PuerkitoBio/purell v1.1.1 // indirect
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.5 // indirect
github.com/alibabacloud-go/debug v1.0.1 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/bytedance/sonic/loader v0.2.4 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/clbanning/mxj/v2 v2.7.0 // indirect
github.com/cloudwego/base64x v0.1.5 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.2 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/go-openapi/jsonpointer v0.19.5 // indirect
github.com/go-openapi/jsonreference v0.19.6 // indirect
github.com/go-openapi/spec v0.20.4 // indirect
github.com/go-openapi/swag v0.19.15 // indirect
github.com/go-sql-driver/mysql v1.7.0 // indirect
github.com/goccy/go-json v0.10.2 // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/hashicorp/hcl v1.0.0 // 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.5 // indirect
github.com/leodido/go-urn v1.2.4 // indirect
github.com/magiconair/properties v1.8.7 // indirect
github.com/mailru/easyjson v0.7.6 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.19 // indirect
github.com/mattn/go-sqlite3 v1.14.15 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml/v2 v2.1.0 // indirect
github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 // indirect
github.com/prometheus/common v0.44.0 // indirect
github.com/prometheus/procfs v0.11.1 // indirect
github.com/rs/cors v1.8.1 // indirect
github.com/sagikazarmark/locafero v0.3.0 // indirect
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
github.com/sourcegraph/conc v0.3.0 // indirect
github.com/spf13/afero v1.10.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/subosito/gotenv v1.6.0 // indirect
github.com/tjfoc/gmsm v1.4.1 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.2.11 // indirect
golang.org/x/arch v0.4.0 // indirect
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect
golang.org/x/mod v0.17.0 // indirect
golang.org/x/net v0.29.0 // indirect
golang.org/x/sync v0.8.0 // indirect
golang.org/x/sys v0.25.0 // indirect
golang.org/x/text v0.18.0 // indirect
golang.org/x/time v0.3.0 // indirect
google.golang.org/protobuf v1.31.0 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
gorm.io/datatypes v1.1.1-0.20230130040222-c43177d3cf8c // indirect
gorm.io/hints v1.1.0 // indirect
)

845
go.sum Normal file
View File

@ -0,0 +1,845 @@
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=
cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=
cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY=
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
github.com/alibabacloud-go/alibabacloud-gateway-pop v0.0.6 h1:eIf+iGJxdU4U9ypaUfbtOWCsZSbTb8AUHvyPrxu6mAA=
github.com/alibabacloud-go/alibabacloud-gateway-pop v0.0.6/go.mod h1:4EUIoxs/do24zMOGGqYVWgw0s9NtiylnJglOeEB5UJo=
github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4/go.mod h1:sCavSAvdzOjul4cEqeVtvlSaSScfNsTQ+46HwlTL1hc=
github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.5 h1:zE8vH9C7JiZLNJJQ5OwjU9mSi4T9ef9u3BURT6LCLC8=
github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.5/go.mod h1:tWnyE9AjF8J8qqLk645oUmVUnFybApTQWklQmi5tY6g=
github.com/alibabacloud-go/darabonba-array v0.1.0 h1:vR8s7b1fWAQIjEjWnuF0JiKsCvclSRTfDzZHTYqfufY=
github.com/alibabacloud-go/darabonba-array v0.1.0/go.mod h1:BLKxr0brnggqOJPqT09DFJ8g3fsDshapUD3C3aOEFaI=
github.com/alibabacloud-go/darabonba-encode-util v0.0.2 h1:1uJGrbsGEVqWcWxrS9MyC2NG0Ax+GpOM5gtupki31XE=
github.com/alibabacloud-go/darabonba-encode-util v0.0.2/go.mod h1:JiW9higWHYXm7F4PKuMgEUETNZasrDM6vqVr/Can7H8=
github.com/alibabacloud-go/darabonba-map v0.0.2 h1:qvPnGB4+dJbJIxOOfawxzF3hzMnIpjmafa0qOTp6udc=
github.com/alibabacloud-go/darabonba-map v0.0.2/go.mod h1:28AJaX8FOE/ym8OUFWga+MtEzBunJwQGceGQlvaPGPc=
github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.7 h1:ASXSBga98QrGMxbIThCD6jAti09gedLfvry6yJtsoBE=
github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.7/go.mod h1:TBpgqm3XofZz2LCYjZhektGPU7ArEgascyzbm4SjFo4=
github.com/alibabacloud-go/darabonba-signature-util v0.0.7 h1:UzCnKvsjPFzApvODDNEYqBHMFt1w98wC7FOo0InLyxg=
github.com/alibabacloud-go/darabonba-signature-util v0.0.7/go.mod h1:oUzCYV2fcCH797xKdL6BDH8ADIHlzrtKVjeRtunBNTQ=
github.com/alibabacloud-go/darabonba-string v1.0.2 h1:E714wms5ibdzCqGeYJ9JCFywE5nDyvIXIIQbZVFkkqo=
github.com/alibabacloud-go/darabonba-string v1.0.2/go.mod h1:93cTfV3vuPhhEwGGpKKqhVW4jLe7tDpo3LUM0i0g6mA=
github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68/go.mod h1:6pb/Qy8c+lqua8cFpEy7g39NRRqOWc3rOwAy8m5Y2BY=
github.com/alibabacloud-go/debug v1.0.0/go.mod h1:8gfgZCCAC3+SCzjWtY053FrOcd4/qlH6IHTI4QyICOc=
github.com/alibabacloud-go/debug v1.0.1 h1:MsW9SmUtbb1Fnt3ieC6NNZi6aEwrXfDksD4QA6GSbPg=
github.com/alibabacloud-go/debug v1.0.1/go.mod h1:8gfgZCCAC3+SCzjWtY053FrOcd4/qlH6IHTI4QyICOc=
github.com/alibabacloud-go/endpoint-util v1.1.0 h1:r/4D3VSw888XGaeNpP994zDUaxdgTSHBbVfZlzf6b5Q=
github.com/alibabacloud-go/endpoint-util v1.1.0/go.mod h1:O5FuCALmCKs2Ff7JFJMudHs0I5EBgecXXxZRyswlEjE=
github.com/alibabacloud-go/openapi-util v0.1.0/go.mod h1:sQuElr4ywwFRlCCberQwKRFhRzIyG4QTP/P4y1CJ6Ws=
github.com/alibabacloud-go/openapi-util v0.1.1 h1:ujGErJjG8ncRW6XtBBMphzHTvCxn4DjrVw4m04HsS28=
github.com/alibabacloud-go/openapi-util v0.1.1/go.mod h1:/UehBSE2cf1gYT43GV4E+RxTdLRzURImCYY0aRmlXpw=
github.com/alibabacloud-go/tea v1.1.0/go.mod h1:IkGyUSX4Ba1V+k4pCtJUc6jDpZLFph9QMy2VUPTwukg=
github.com/alibabacloud-go/tea v1.1.7/go.mod h1:/tmnEaQMyb4Ky1/5D+SE1BAsa5zj/KeGOFfwYm3N/p4=
github.com/alibabacloud-go/tea v1.1.8/go.mod h1:/tmnEaQMyb4Ky1/5D+SE1BAsa5zj/KeGOFfwYm3N/p4=
github.com/alibabacloud-go/tea v1.1.11/go.mod h1:/tmnEaQMyb4Ky1/5D+SE1BAsa5zj/KeGOFfwYm3N/p4=
github.com/alibabacloud-go/tea v1.1.17/go.mod h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy6cujmKFUq98A=
github.com/alibabacloud-go/tea v1.1.20/go.mod h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy6cujmKFUq98A=
github.com/alibabacloud-go/tea v1.2.2/go.mod h1:CF3vOzEMAG+bR4WOql8gc2G9H3EkH3ZLAQdpmpXMgwk=
github.com/alibabacloud-go/tea v1.3.8/go.mod h1:A560v/JTQ1n5zklt2BEpurJzZTI8TUT+Psg2drWlxRg=
github.com/alibabacloud-go/tea v1.3.9 h1:bjgt1bvdY780vz/17iWNNtbXl4A77HWntWMeaUF3So0=
github.com/alibabacloud-go/tea v1.3.9/go.mod h1:A560v/JTQ1n5zklt2BEpurJzZTI8TUT+Psg2drWlxRg=
github.com/alibabacloud-go/tea-utils v1.3.1/go.mod h1:EI/o33aBfj3hETm4RLiAxF/ThQdSngxrpF8rKUDJjPE=
github.com/alibabacloud-go/tea-utils/v2 v2.0.5/go.mod h1:dL6vbUT35E4F4bFTHL845eUloqaerYBYPsdWR2/jhe4=
github.com/alibabacloud-go/tea-utils/v2 v2.0.6/go.mod h1:qxn986l+q33J5VkialKMqT/TTs3E+U9MJpd001iWQ9I=
github.com/alibabacloud-go/tea-utils/v2 v2.0.7 h1:WDx5qW3Xa5ZgJ1c8NfqJkF6w+AU5wB8835UdhPr6Ax0=
github.com/alibabacloud-go/tea-utils/v2 v2.0.7/go.mod h1:qxn986l+q33J5VkialKMqT/TTs3E+U9MJpd001iWQ9I=
github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible h1:8psS8a+wKfiLt1iVDX79F7Y6wUM49Lcha2FMXt4UM8g=
github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
github.com/aliyun/credentials-go v1.1.2/go.mod h1:ozcZaMR5kLM7pwtCMEpVmQ242suV6qTJya2bDq4X1Tw=
github.com/aliyun/credentials-go v1.3.1/go.mod h1:8jKYhQuDawt8x2+fusqa1Y6mPxemTsBEN04dgcAcYz0=
github.com/aliyun/credentials-go v1.3.6/go.mod h1:1LxUuX7L5YrZUWzBrRyk0SwSdH4OmPrib8NVePL3fxM=
github.com/aliyun/credentials-go v1.4.5/go.mod h1:Jm6d+xIgwJVLVWT561vy67ZRP4lPTQxMbEYRuT2Ti1U=
github.com/aliyun/credentials-go v1.4.6 h1:CG8rc/nxCNKfXbZWpWDzI9GjF4Tuu3Es14qT8Y0ClOk=
github.com/aliyun/credentials-go v1.4.6/go.mod h1:Jm6d+xIgwJVLVWT561vy67ZRP4lPTQxMbEYRuT2Ti1U=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0=
github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE=
github.com/bytedance/sonic v1.13.2 h1:8/H1FempDZqC4VqjptGo14QQlJx8VdZJegxs6wwfqpQ=
github.com/bytedance/sonic v1.13.2/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=
github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
github.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=
github.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME=
github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=
github.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be h1:J5BL2kskAlV9ckgEsNQXscjIaLiOYiZ75d4e94E6dcQ=
github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be/go.mod h1:mk5IQ+Y0ZeO87b858TlA645sVcEcbiX6YqP98kt+7+w=
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/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w=
github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg=
github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY=
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU=
github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA=
github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4=
github.com/gin-contrib/pprof v1.4.0 h1:XxiBSf5jWZ5i16lNOPbMTVdgHBdhfGRD5PZ1LWazzvg=
github.com/gin-contrib/pprof v1.4.0/go.mod h1:RrehPJasUVBPK6yTUwOl8/NP6i0vbUgmxtis+Z5KE90=
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.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk=
github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg=
github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=
github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs=
github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns=
github.com/go-openapi/spec v0.20.4 h1:O8hJrt0UMnhHcluhIdUgCLRWyM2x7QkBXRvOs7m+O1M=
github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I=
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM=
github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs=
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA=
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos=
github.com/go-playground/validator/v10 v10.15.0 h1:nDU5XeOKtB3GEa+uB7GNYwhVKsgjAR7VgKoNB6ryXfw=
github.com/go-playground/validator/v10 v10.15.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU=
github.com/go-resty/resty/v2 v2.10.0 h1:Qla4W/+TMmv0fOeeRqzEpXPLfTUnR5HZ1+lGs+CkiCo=
github.com/go-resty/resty/v2 v2.10.0/go.mod h1:iiP/OpA0CkcL3IGt1O0+/SIItFUbkkyw5BGXiVdTu+A=
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
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/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw=
github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA=
github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8=
github.com/jackc/pgconn v1.13.0 h1:3L1XMNV2Zvca/8BYhzcRFS70Lr0WlDg16Di6SFGAbys=
github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE=
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
github.com/jackc/pgproto3/v2 v2.3.1 h1:nwj7qwf0S+Q7ISFfBndqeLwSwxs+4DPsbRFjECT1Y4Y=
github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg=
github.com/jackc/pgtype v1.12.0 h1:Dlq8Qvcch7kiehm8wPGIW0W3KsCCHJnRacKW0UM8n5w=
github.com/jackc/pgx/v4 v4.17.2 h1:0Ut0rpeKwvIVbMQ1KbMBU4h6wxehBI535LK6Flheh8E=
github.com/jakecoffman/cron v0.0.0-20190106200828-7e2009c226a5 h1:kCvm3G3u+eTRbjfLPyfsfznJtraYEfZer/UvQ6CaQhI=
github.com/jakecoffman/cron v0.0.0-20190106200828-7e2009c226a5/go.mod h1:6DM2KNNK69jRu0lAHmYK9LYxmqpNjYHOaNp/ZxttD4U=
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
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.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg=
github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
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.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q=
github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=
github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA=
github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
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.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
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/mattn/go-sqlite3 v1.14.8/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
github.com/mattn/go-sqlite3 v1.14.15 h1:vfoHhTN1af61xCRSWzFIWzx2YskyMTwHLrExkBOjvxI=
github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
github.com/microsoft/go-mssqldb v0.17.0 h1:Fto83dMZPnYv1Zwx5vHHxpNraeEaUlQ/hhHLgZiaenE=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo=
github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4=
github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q=
github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 h1:v7DLqVdK4VrYkVD5diGdl4sxJurKJEMnODWRJlxV9oM=
github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU=
github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY=
github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY=
github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI=
github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
github.com/rs/cors v1.8.1 h1:OrP+y5H+5Md29ACTA9imbALaKHwOSUZkcizaG0LT5ow=
github.com/rs/cors v1.8.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU=
github.com/rs/cors/wrapper/gin v0.0.0-20231013084403-73f81b45a644 h1:BBwREPixt0iE77C9z7DOenoeh5OGFrzyL1cWOp5oQTs=
github.com/rs/cors/wrapper/gin v0.0.0-20231013084403-73f81b45a644/go.mod h1:gmu40DuK3SLdKUzGOUofS3UDZwyeOUy6ZjPPuaALatw=
github.com/sagikazarmark/locafero v0.3.0 h1:zT7VEGWC2DTflmccN/5T1etyKvxSxpHsjb9cJvm4SvQ=
github.com/sagikazarmark/locafero v0.3.0/go.mod h1:w+v7UsPNFwzF1cHuOajOOzoq4U7v/ig1mpRjqV+Bu1U=
github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/assertions v1.1.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY=
github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ=
github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA=
github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/viper v1.17.0 h1:I5txKw7MJasPL/BrfkbA0Jyo/oELqVmux4pR/UxOMfI=
github.com/spf13/viper v1.17.0/go.mod h1:BmMMMLQXSbcHK6KAOiFLz0l5JHrU89OdIRHvsk0+yVI=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
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.2 h1:28Pp+8DkQoV+HLzLx8RGJZXNGKbFqnuvSbAAtoxiY04=
github.com/swaggo/swag v1.16.2/go.mod h1:6YzXnDcpr0767iOejs318CwYkCQqyGer6BizOg03f+E=
github.com/tealeg/xlsx v1.0.5 h1:+f8oFmvY8Gw1iUXzPk+kz+4GpbDZPK1FhPiQRd+ypgE=
github.com/tealeg/xlsx v1.0.5/go.mod h1:btRS8dz54TDnvKNosuAqxrM1QgN1udgk9O34bDCnORM=
github.com/tjfoc/gmsm v1.3.2/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w=
github.com/tjfoc/gmsm v1.4.1 h1:aMe1GlZb+0bLjn+cKTPEvvn9oUEBlJitaZiiBwsbgho=
github.com/tjfoc/gmsm v1.4.1/go.mod h1:j4INPkHWMrhJb38G+J6W4Tw0AbuN8Thu3PbdVYhVcTE=
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 v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M=
github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY=
github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU=
github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.30/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=
go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=
go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=
go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=
golang.org/x/arch v0.4.0 h1:A8WCeEWhLwPBKNbFi5Wv5UTCBx5zzubnXDlMOFAzFMc=
golang.org/x/arch v0.4.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM=
golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A=
golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g=
golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE=
golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo=
golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/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.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200509044756-6aff5f38e54f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/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-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/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-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/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.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
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/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/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.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224=
golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200509030707-2212a7e161a5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg=
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=
google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=
google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/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/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/ini.v1 v1.56.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
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.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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=
gorm.io/datatypes v1.1.1-0.20230130040222-c43177d3cf8c h1:jWdr7cHgl8c/ua5vYbR2WhSp+NQmzhsj0xoY3foTzW8=
gorm.io/datatypes v1.1.1-0.20230130040222-c43177d3cf8c/go.mod h1:SH2K9R+2RMjuX1CkCONrPwoe9JzVv2hkQvEu4bXGojE=
gorm.io/driver/mysql v1.4.3/go.mod h1:sSIebwZAVPiT+27jK9HIwvsqOGKx3YMPmrA3mBJR10c=
gorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=
gorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=
gorm.io/driver/postgres v1.4.5 h1:mTeXTTtHAgnS9PgmhN2YeUbazYpLhUI1doLnw42XUZc=
gorm.io/driver/sqlite v1.1.6/go.mod h1:W8LmC/6UvVbHKah0+QOC7Ja66EaZXHwUTjgXY8YNWX8=
gorm.io/driver/sqlite v1.4.3 h1:HBBcZSDnWi5BW3B3rwvVTc510KGkBkexlOg0QrmLUuU=
gorm.io/driver/sqlite v1.4.3/go.mod h1:0Aq3iPO+v9ZKbcdiz8gLWRw5VOPcBOPUQJFLq5e2ecI=
gorm.io/driver/sqlserver v1.4.1 h1:t4r4r6Jam5E6ejqP7N82qAJIJAht27EGT41HyPfXRw0=
gorm.io/gen v0.3.26 h1:sFf1j7vNStimPRRAtH4zz5NiHM+1dr6eA9aaRdplyhY=
gorm.io/gen v0.3.26/go.mod h1:a5lq5y3w4g5LMxBcw0wnO6tYUCdNutWODq5LrIt75LE=
gorm.io/gorm v1.21.15/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0=
gorm.io/gorm v1.22.2/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0=
gorm.io/gorm v1.23.8/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=
gorm.io/gorm v1.24.0/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA=
gorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
gorm.io/gorm v1.25.2/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
gorm.io/gorm v1.25.9 h1:wct0gxZIELDk8+ZqF/MVnHLkA1rvYlBWUMv2EdsK1g8=
gorm.io/gorm v1.25.9/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
gorm.io/hints v1.1.0 h1:Lp4z3rxREufSdxn4qmkK3TLDltrM10FLTHiuqwDPvXw=
gorm.io/hints v1.1.0/go.mod h1:lKQ0JjySsPBj3uslFzY3JhYDtqEwzm+G1hv8rWujB6Y=
gorm.io/plugin/dbresolver v1.5.0 h1:XVHLxh775eP0CqVh3vcfJtYqja3uFl5Wr3cKlY8jgDY=
gorm.io/plugin/dbresolver v1.5.0/go.mod h1:l4Cn87EHLEYuqUncpEeTC2tTJQkjngPSD+lo8hIvcT0=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=

11
internal/alert/alert.go Normal file
View File

@ -0,0 +1,11 @@
package alert
import (
"mini-chat/internal/proposal"
)
func NotifyHandler() func(msg *proposal.AlertMessage) {
return func(msg *proposal.AlertMessage) {
}
}

View File

@ -0,0 +1,21 @@
package admin
import (
"mini-chat/internal/pkg/logger"
"mini-chat/internal/repository/mysql"
"mini-chat/internal/repository/mysql/dao"
)
type handler struct {
logger logger.CustomLogger
writeDB *dao.Query
readDB *dao.Query
}
func New(logger logger.CustomLogger, db mysql.Repo) *handler {
return &handler{
logger: logger,
writeDB: dao.Use(db.GetDbW()),
readDB: dao.Use(db.GetDbR()),
}
}

View File

@ -0,0 +1,125 @@
package admin
import (
"fmt"
"net/http"
"time"
"mini-chat/configs"
"mini-chat/internal/code"
"mini-chat/internal/pkg/core"
"mini-chat/internal/pkg/jwtoken"
"mini-chat/internal/pkg/utils"
"mini-chat/internal/pkg/validation"
"mini-chat/internal/proposal"
"gorm.io/gorm"
)
type loginRequest struct {
Username string `json:"username" binding:"required"` // 用户名
Password string `json:"password" binding:"required"` // 密码 (MD5加密后的密码)
}
type loginResponse struct {
Token string `json:"token"` // 登录成功后颁发的 Token
}
// Login 管理员登录
// @Summary 管理员登录
// @Description 管理员登录
// @Tags 管理端.登录
// @Accept json
// @Produce json
// @Param RequestBody body loginRequest true "请求参数"
// @Success 200 {object} loginResponse
// @Failure 400 {object} code.Failure
// @Router /admin/login [post]
func (h *handler) Login() core.HandlerFunc {
return func(ctx core.Context) {
req := new(loginRequest)
res := new(loginResponse)
if err := ctx.ShouldBindJSON(req); err != nil {
ctx.AbortWithError(core.Error(
http.StatusBadRequest,
code.ParamBindError,
validation.Error(err)),
)
return
}
// 验证用户是否存在
info, err := h.readDB.Admin.WithContext(ctx.RequestContext()).Where(h.readDB.Admin.Username.Eq(req.Username)).First()
if err != nil && err != gorm.ErrRecordNotFound {
ctx.AbortWithError(core.Error(
http.StatusBadRequest,
code.AdminLoginError,
fmt.Sprintf("%s: %s", code.Text(code.AdminLoginError), err.Error())),
)
return
}
if err == gorm.ErrRecordNotFound {
ctx.AbortWithError(core.Error(
http.StatusBadRequest,
code.AdminLoginError,
fmt.Sprintf("%s: %s", code.Text(code.AdminLoginError), "账号不存在,请联系管理员。")),
)
return
}
// 验证登录状态
if info.LoginStatus != 1 {
ctx.AbortWithError(core.Error(
http.StatusBadRequest,
code.AdminLoginError,
fmt.Sprintf("%s账号已被禁用", code.Text(code.AdminLoginError))),
)
return
}
// 验证密码
if !utils.VerifyAdminHashedPassword(info.Password, req.Password) {
ctx.AbortWithError(core.Error(
http.StatusBadRequest,
code.AdminLoginError,
fmt.Sprintf("%s用户名或密码错误请联系管理员。", code.Text(code.AdminLoginError))),
)
return
}
// 设置 Session 信息
sessionUserInfo := proposal.SessionUserInfo{
Id: info.ID,
UserName: info.Username,
NickName: info.Nickname,
Platform: "管理端",
}
// 设置载荷数据、有效期,生成 JWT Token String
tokenString, err := jwtoken.New(configs.Get().JWT.AdminSecret).Sign(sessionUserInfo, 3*24*time.Hour)
if err != nil {
ctx.AbortWithError(core.Error(
http.StatusBadRequest,
code.AdminLoginError,
fmt.Sprintf("%stoken 生成失败(%s)", code.Text(code.AdminLoginError), err.Error())),
)
return
}
info.LastLoginTime = time.Now()
info.LastLoginIP = utils.GetIP(ctx.Request())
info.LastLoginHash = utils.MD5(tokenString)
if err := h.writeDB.Admin.WithContext(ctx.RequestContext()).Save(info); err != nil {
ctx.AbortWithError(core.Error(
http.StatusBadRequest,
code.AdminLoginError,
fmt.Sprintf("%s%s", code.Text(code.AdminLoginError), err.Error())),
)
return
}
res.Token = tokenString
ctx.Payload(res)
}
}

13
internal/code/README.md Normal file
View File

@ -0,0 +1,13 @@
## 错误码规则
- 错误码需在 `code` 包中进行定义。
#### 错误码为 5 位数
| 1 | 01 | 01 |
| :------ | :------ | :------ |
| 服务级错误码 | 模块级错误码 | 具体错误码 |
- 服务级错误码1 位数进行表示,比如 1 为系统级错误2 为普通错误,通常是由用户非法操作引起。
- 模块级错误码2 位数进行表示,比如 01 为用户模块02 为订单模块。
- 具体的错误码2 位数进行表示,比如 01 为手机号不合法02 为验证码输入错误。

34
internal/code/code.go Normal file
View File

@ -0,0 +1,34 @@
package code
import (
_ "embed"
"mini-chat/configs"
)
//go:embed code.go
var ByteCodeFile []byte
// Failure 错误时返回结构
type Failure struct {
Code int `json:"code"` // 业务码
Message string `json:"message"` // 描述信息
}
const (
ServerError = 10101
ParamBindError = 10102
JWTAuthVerifyError = 10103
AdminLoginError = 20101
)
func Text(code int) string {
lang := configs.Get().Language.Local
if lang == configs.ZhCN {
return zhCNText[code]
}
return zhCNText[code]
}

9
internal/code/zh-cn.go Normal file
View File

@ -0,0 +1,9 @@
package code
var zhCNText = map[int]string{
ServerError: "内部服务器错误",
ParamBindError: "参数错误",
JWTAuthVerifyError: "JWT 授权验证错误",
AdminLoginError: "登录失败",
}

97
internal/cron/cron.go Normal file
View File

@ -0,0 +1,97 @@
package cron
import (
"context"
"sync"
"mini-chat/internal/pkg/errors"
"mini-chat/internal/pkg/logger"
"mini-chat/internal/repository/mysql"
"mini-chat/internal/repository/mysql/model"
"github.com/jakecoffman/cron"
)
var _ Server = (*server)(nil)
type taskCount struct {
wg sync.WaitGroup
exit chan struct{}
}
func (tc *taskCount) i() {}
func (tc *taskCount) Add() {
tc.wg.Add(1)
}
func (tc *taskCount) Done() {
tc.wg.Done()
}
func (tc *taskCount) Exit() {
tc.wg.Done()
<-tc.exit
}
func (tc *taskCount) Wait() {
tc.Add()
tc.wg.Wait()
close(tc.exit)
}
type server struct {
logger logger.CustomLogger
db mysql.Repo
cron *cron.Cron
taskCount *taskCount
taskContext map[string]context.CancelFunc // 存储任务的取消上下文
mu sync.Mutex // 保护 taskContext 的互斥
}
type Server interface {
i()
// Start 启动 cron 服务
Start()
// Stop 停止 cron 服务
Stop()
// AddTask 增加定时任务
AddTask(task *model.PatientMedicineTask)
// AddJob 增加定时任务执行的工作内容
AddJob(task *model.PatientMedicineTask, execUser string) cron.FuncJob
// StopJob 停止定时任务
StopJob(taskCode string)
// RemoveTask 删除定时任务
RemoveTask(taskCode string)
Entries() []*cron.Entry
}
func New(logger logger.CustomLogger, db mysql.Repo) (Server, error) {
if logger == nil {
return nil, errors.New("logger required")
}
return &server{
logger: logger,
cron: cron.New(),
db: db,
taskCount: &taskCount{
wg: sync.WaitGroup{},
exit: make(chan struct{}),
},
taskContext: make(map[string]context.CancelFunc),
}, nil
}
func (s *server) i() {}
func (s *server) Entries() []*cron.Entry {
return s.cron.Entries()
}

View File

@ -0,0 +1,35 @@
package cron
import (
"context"
"fmt"
"mini-chat/internal/repository/mysql/model"
"github.com/jakecoffman/cron"
)
func (s *server) AddJob(task *model.PatientMedicineTask, execUser string) cron.FuncJob {
_, cancel := context.WithCancel(context.Background())
s.mu.Lock()
s.taskContext[task.Code] = cancel
s.mu.Unlock()
return func() {
s.taskCount.Add()
defer func() {
s.taskCount.Done()
s.mu.Lock()
delete(s.taskContext, task.Code) // 清理任务上下文
s.mu.Unlock()
if err := recover(); err != nil {
s.logger.Error(fmt.Sprintf("[定时任务] 任务编码:%s, 执行异常: %+v", task.Code, err))
}
}()
// 执行任务
}
}

View File

@ -0,0 +1,21 @@
package cron
import (
"fmt"
"strings"
"mini-chat/internal/repository/mysql/model"
)
func (s *server) AddTask(task *model.PatientMedicineTask) {
defer func() {
if err := recover(); err != nil {
s.logger.Error(fmt.Sprintf("[定时任务] 任务编号: %s, 添加异常: %+v", task.Code, err))
}
}()
spec := "0 " + strings.TrimSpace(task.Spec)
name := fmt.Sprintf("cron_task_%s", task.Code)
s.cron.AddFunc(spec, s.AddJob(task, "定时任务"), name)
}

View File

@ -0,0 +1,7 @@
package cron
import "fmt"
func (s *server) RemoveTask(taskCode string) {
s.cron.RemoveJob(fmt.Sprintf("cron_task_%s", taskCode))
}

View File

@ -0,0 +1,14 @@
package cron
func (s *server) Start() {
s.cron.Start()
go s.taskCount.Wait()
// 初始化任务
s.initTask()
}
// initTask 初始化任务
func (s *server) initTask() {
}

View File

@ -0,0 +1,6 @@
package cron
func (s *server) Stop() {
s.cron.Stop()
s.taskCount.Exit()
}

View File

@ -0,0 +1,17 @@
package cron
import (
"fmt"
)
func (s *server) StopJob(taskCode string) {
s.mu.Lock()
cancel, ok := s.taskContext[taskCode]
s.mu.Unlock()
if ok {
cancel() // 调取消函数停止任务
} else {
s.logger.Info(fmt.Sprintf("任务未找到: %s", taskCode))
}
}

View File

@ -0,0 +1,38 @@
package dblogger
import (
"fmt"
"log"
"time"
"mini-chat/internal/proposal"
"mini-chat/internal/repository/mysql"
"mini-chat/internal/repository/mysql/dao"
"mini-chat/internal/repository/mysql/model"
"github.com/spf13/cast"
)
func LoggerHandler(db mysql.Repo) func(msg *proposal.RequestLoggerMessage) {
return func(msg *proposal.RequestLoggerMessage) {
logData := new(model.LogRequest)
logData.Tid = msg.Tid
logData.Username = msg.Username
logData.Host = msg.HOST
logData.Path = msg.Path
logData.Method = msg.Method
logData.HTTPCode = int32(msg.HTTPCode)
logData.BusinessCode = int32(msg.BusinessCode)
logData.CostMilliseconds = float64(cast.ToFloat32(fmt.Sprintf("%.2f", msg.CostSeconds*1000)))
logData.IsSuccess = -1
if msg.IsSuccess == true {
logData.IsSuccess = 1
}
logData.Content = msg.Content
logData.CreatedAt = time.Now()
if err := dao.Use(db.GetDbW()).LogRequest.Create(logData); err != nil {
log.Println(fmt.Sprintf("日志写入失败: %s", err.Error()))
}
}
}

View File

@ -0,0 +1,19 @@
package metrics
import (
"mini-chat/internal/proposal"
)
// RecordHandler 指标处理
func RecordHandler() func(msg *proposal.MetricsMessage) {
return func(msg *proposal.MetricsMessage) {
RecordMetrics(
msg.Method,
msg.Path,
msg.IsSuccess,
msg.HTTPCode,
msg.BusinessCode,
msg.CostSeconds,
)
}
}

View File

@ -0,0 +1,59 @@
package metrics
import (
"github.com/prometheus/client_golang/prometheus"
"github.com/spf13/cast"
)
const (
namespace = "custom_namespace"
subsystem = "gin_api_mono"
)
// metricsRequestsTotal metrics for request total 计数器Counter
var metricsRequestsTotal = prometheus.NewCounterVec(
prometheus.CounterOpts{
Namespace: namespace,
Subsystem: subsystem,
Name: "requests_total",
Help: "request(ms) total",
},
[]string{"method", "path"},
)
// metricsRequestsCost metrics for requests cost 累积直方图Histogram
var metricsRequestsCost = prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Namespace: namespace,
Subsystem: subsystem,
Name: "requests_cost",
Help: "request(ms) cost milliseconds",
},
[]string{"method", "path", "success", "http_code", "business_code", "cost_milliseconds"},
)
// 根据需要,可定制其他指标,操作如下:
// 1. 定义需要的指标
// 2. init() 中注册
// 3. RecordMetrics() 中传值
func init() {
prometheus.MustRegister(metricsRequestsTotal, metricsRequestsCost)
}
// RecordMetrics 记录指标
func RecordMetrics(method, path string, success bool, httpCode, businessCode int, costSeconds float64) {
metricsRequestsTotal.With(prometheus.Labels{
"method": method,
"path": path,
}).Inc()
metricsRequestsCost.With(prometheus.Labels{
"method": method,
"path": path,
"success": cast.ToString(success),
"http_code": cast.ToString(httpCode),
"business_code": cast.ToString(businessCode),
"cost_milliseconds": cast.ToString(costSeconds * 1000),
}).Observe(costSeconds)
}

View File

@ -0,0 +1,47 @@
//go:build darwin
// +build darwin
package color
import (
"fmt"
"math/rand"
"strconv"
)
var _ = RandomColor()
// RandomColor generates a random color.
func RandomColor() string {
return fmt.Sprintf("#%s", strconv.FormatInt(int64(rand.Intn(16777216)), 16))
}
// Yellow ...
func Yellow(msg string) string {
return fmt.Sprintf("\x1b[33m%s\x1b[0m", msg)
}
// Red ...
func Red(msg string) string {
return fmt.Sprintf("\x1b[31m%s\x1b[0m", msg)
}
// Redf ...
func Redf(msg string, arg interface{}) string {
return fmt.Sprintf("\x1b[31m%s\x1b[0m %+v\n", msg, arg)
}
// Blue ...
func Blue(msg string) string {
return fmt.Sprintf("\x1b[34m%s\x1b[0m", msg)
}
// Green ...
func Green(msg string) string {
return fmt.Sprintf("\x1b[32m%s\x1b[0m", msg)
}
// Greenf ...
func Greenf(msg string, arg interface{}) string {
return fmt.Sprintf("\x1b[32m%s\x1b[0m %+v\n", msg, arg)
}

View File

@ -0,0 +1,47 @@
//go:build linux
// +build linux
package color
import (
"fmt"
"math/rand"
"strconv"
)
var _ = RandomColor()
// RandomColor generates a random color.
func RandomColor() string {
return fmt.Sprintf("#%s", strconv.FormatInt(int64(rand.Intn(16777216)), 16))
}
// Yellow ...
func Yellow(msg string) string {
return fmt.Sprintf("\x1b[33m%s\x1b[0m", msg)
}
// Red ...
func Red(msg string) string {
return fmt.Sprintf("\x1b[31m%s\x1b[0m", msg)
}
// Redf ...
func Redf(msg string, arg interface{}) string {
return fmt.Sprintf("\x1b[31m%s\x1b[0m %+v\n", msg, arg)
}
// Blue ...
func Blue(msg string) string {
return fmt.Sprintf("\x1b[34m%s\x1b[0m", msg)
}
// Green ...
func Green(msg string) string {
return fmt.Sprintf("\x1b[32m%s\x1b[0m", msg)
}
// Greenf ...
func Greenf(msg string, arg interface{}) string {
return fmt.Sprintf("\x1b[32m%s\x1b[0m %+v\n", msg, arg)
}

View File

@ -0,0 +1,47 @@
//go:build windows
// +build windows
package color
import (
"fmt"
"math/rand"
"strconv"
)
var _ = RandomColor()
// RandomColor generates a random color.
func RandomColor() string {
return fmt.Sprintf("#%s", strconv.FormatInt(int64(rand.Intn(16777216)), 16))
}
// Yellow ...
func Yellow(msg string) string {
return fmt.Sprintf("%s", msg)
}
// Red ...
func Red(msg string) string {
return fmt.Sprintf("%s", msg)
}
// Redf ...
func Redf(msg string, arg interface{}) string {
return fmt.Sprintf("%s %+v\n", msg, arg)
}
// Blue ...
func Blue(msg string) string {
return fmt.Sprintf("%s", msg)
}
// Green ...
func Green(msg string) string {
return fmt.Sprintf("%s", msg)
}
// Greenf ...
func Greenf(msg string, arg interface{}) string {
return fmt.Sprintf("%s %+v\n", msg, arg)
}

View File

@ -0,0 +1,462 @@
package core
import (
"bytes"
stdctx "context"
"fmt"
"io/ioutil"
"mime/multipart"
"net/http"
"net/url"
"path"
"strings"
"sync"
"mini-chat/internal/pkg/logger"
"mini-chat/internal/pkg/trace"
"mini-chat/internal/proposal"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
)
type HandlerFunc func(c Context)
type Trace = trace.T
const (
_Alias = "_alias_"
_TraceName = "_trace_"
_LoggerName = "_logger_"
_BodyName = "_body_"
_PayloadName = "_payload_"
_SessionUserInfo = "_session_user_info"
_AbortErrorName = "_abort_error_"
_IsRecordMetrics = "_is_record_metrics_"
)
var contextPool = &sync.Pool{
New: func() interface{} {
return new(context)
},
}
func newContext(ctx *gin.Context) Context {
context := contextPool.Get().(*context)
context.ctx = ctx
return context
}
func releaseContext(ctx Context) {
c := ctx.(*context)
c.ctx = nil
contextPool.Put(c)
}
var _ Context = (*context)(nil)
type Context interface {
init()
// ShouldBindQuery 反序列化 querystring
// tag: `form:"xxx"` (注:不要写成 query)
ShouldBindQuery(obj interface{}) error
// ShouldBindPostForm 反序列化 postform (querystring会被忽略)
// tag: `form:"xxx"`
ShouldBindPostForm(obj interface{}) error
// ShouldBindForm 同时反序列化 querystring 和 postform;
// 当 querystring 和 postform 存在相同字段时postform 优先使用。
// tag: `form:"xxx"`
ShouldBindForm(obj interface{}) error
// ShouldBindJSON 反序列化 postjson
// tag: `json:"xxx"`
ShouldBindJSON(obj interface{}) error
// ShouldBindXML 反序列化 xml
// tag: `xml:"xxx"`
ShouldBindXML(obj interface{}) error
// ShouldBindURI 反序列化 path 参数(如路由路径为 /user/:name)
// tag: `uri:"xxx"`
ShouldBindURI(obj interface{}) error
// Redirect 重定向
Redirect(code int, location string)
// Trace 获取 Trace 对象
Trace() Trace
setTrace(trace Trace)
disableTrace()
// Logger 获取 Logger 对象
Logger() logger.CustomLogger
setLogger(logger logger.CustomLogger)
// Payload 正确返回
Payload(payload interface{})
getPayload() interface{}
// File 文件下载
File(filePath string)
// HTML 返回界面
HTML(name string, obj interface{})
// String 返回字符串
String(str string)
// XML 返回 XML
XML(obj interface{})
// ExcelData 返回二进制数据
ExcelData(filename string, byteData []byte)
// FormFile 通过表单上传文件
FormFile(name string) (*multipart.FileHeader, error)
// SaveUploadedFile 将表单文件上传到本地
SaveUploadedFile(file *multipart.FileHeader, dst string) error
// AbortWithError 错误返回
AbortWithError(err BusinessError)
abortError() BusinessError
// Header 获取 Header 对象
Header() http.Header
// GetHeader 获取 Header
GetHeader(key string) string
// SetHeader 设置 Header
SetHeader(key, value string)
// SessionUserInfo 当前用户信息
SessionUserInfo() proposal.SessionUserInfo
setSessionUserInfo(info proposal.SessionUserInfo)
// Alias 设置路由别名 for metrics path
Alias() string
setAlias(path string)
// disableRecordMetrics 设置禁止记录指标
disableRecordMetrics()
ableRecordMetrics()
isRecordMetrics() bool
// RequestInputParams 获取所有参数
RequestInputParams() url.Values
// RequestPostFormParams 获取 PostForm 参数
RequestPostFormParams() url.Values
// RequestPathParams 获取路由参数的值
RequestPathParams(key string) string
// Request 获取 Request 对象
Request() *http.Request
// RawData 获取 Request.Body
RawData() []byte
// Method 获取 Request.Method
Method() string
// Host 获取 Request.Host
Host() string
// Path 获取 请求的路径 Request.URL.Path (不附带 querystring)
Path() string
// URI 获取 unescape 后的 Request.URL.RequestURI()
URI() string
// RequestContext 获取请求的 context (当 client 关闭后,会自动 canceled)
RequestContext() StdContext
// ResponseWriter 获取 ResponseWriter 对象
ResponseWriter() gin.ResponseWriter
// Param 获取 URL 参数
Param(key string) string
}
type context struct {
ctx *gin.Context
}
type StdContext struct {
stdctx.Context
Trace
logger.CustomLogger
}
func (c *context) init() {
body, err := c.ctx.GetRawData()
if err != nil {
panic(err)
}
c.ctx.Set(_BodyName, body) // cache body是为了trace使用
c.ctx.Request.Body = ioutil.NopCloser(bytes.NewBuffer(body)) // re-construct req body
}
// ShouldBindQuery 反序列化querystring
// tag: `form:"xxx"` (注不要写成query)
func (c *context) ShouldBindQuery(obj interface{}) error {
return c.ctx.ShouldBindWith(obj, binding.Query)
}
// ShouldBindPostForm 反序列化 postform (querystring 会被忽略)
// tag: `form:"xxx"`
func (c *context) ShouldBindPostForm(obj interface{}) error {
return c.ctx.ShouldBindWith(obj, binding.FormPost)
}
// ShouldBindForm 同时反序列化querystring和postform;
// 当querystring和postform存在相同字段时postform优先使用。
// tag: `form:"xxx"`
func (c *context) ShouldBindForm(obj interface{}) error {
return c.ctx.ShouldBindWith(obj, binding.Form)
}
// ShouldBindJSON 反序列化postjson
// tag: `json:"xxx"`
func (c *context) ShouldBindJSON(obj interface{}) error {
return c.ctx.ShouldBindWith(obj, binding.JSON)
}
// ShouldBindXML 反序列化xml
// tag: `xml:"xxx"`
func (c *context) ShouldBindXML(obj interface{}) error {
return c.ctx.ShouldBindWith(obj, binding.XML)
}
// ShouldBindURI 反序列化path参数(如路由路径为 /user/:name)
// tag: `uri:"xxx"`
func (c *context) ShouldBindURI(obj interface{}) error {
return c.ctx.ShouldBindUri(obj)
}
// Redirect 重定向
func (c *context) Redirect(code int, location string) {
c.ctx.Redirect(code, location)
}
func (c *context) Trace() Trace {
t, ok := c.ctx.Get(_TraceName)
if !ok || t == nil {
return nil
}
return t.(Trace)
}
func (c *context) setTrace(trace Trace) {
c.ctx.Set(_TraceName, trace)
}
func (c *context) disableTrace() {
c.setTrace(nil)
}
func (c *context) Logger() logger.CustomLogger {
getLogger, ok := c.ctx.Get(_LoggerName)
if !ok {
return nil
}
return getLogger.(logger.CustomLogger)
}
func (c *context) setLogger(logger logger.CustomLogger) {
c.ctx.Set(_LoggerName, logger)
}
func (c *context) getPayload() interface{} {
if payload, ok := c.ctx.Get(_PayloadName); ok != false {
return payload
}
return nil
}
func (c *context) Payload(payload interface{}) {
c.ctx.Set(_PayloadName, payload)
}
func (c *context) File(filePath string) {
c.ctx.Writer.Header().Add("Content-Disposition", fmt.Sprintf("attachment; filename=%s", path.Base(filePath)))
c.ctx.Writer.Header().Add("Content-Type", "application/octet-stream")
c.ctx.File(filePath)
}
func (c *context) HTML(name string, obj interface{}) {
c.ctx.HTML(200, name+".html", obj)
}
func (c *context) String(str string) {
c.ctx.String(200, str)
}
func (c *context) XML(obj interface{}) {
c.ctx.XML(200, obj)
}
func (c *context) ExcelData(fileName string, data []byte) {
c.ctx.Writer.Header().Add("Content-Disposition", fmt.Sprintf("attachment; filename*=UTF-8''%s", url.QueryEscape(fileName)))
c.ctx.Writer.Header().Add("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
c.ctx.Data(http.StatusOK, "application/vnd.ms-excel", data)
}
func (c *context) FormFile(name string) (*multipart.FileHeader, error) {
return c.ctx.FormFile(name)
}
func (c *context) SaveUploadedFile(file *multipart.FileHeader, dst string) error {
return c.ctx.SaveUploadedFile(file, dst)
}
func (c *context) Header() http.Header {
header := c.ctx.Request.Header
clone := make(http.Header, len(header))
for k, v := range header {
value := make([]string, len(v))
copy(value, v)
clone[k] = value
}
return clone
}
func (c *context) GetHeader(key string) string {
return c.ctx.GetHeader(key)
}
func (c *context) SetHeader(key, value string) {
c.ctx.Header(key, value)
}
func (c *context) SessionUserInfo() proposal.SessionUserInfo {
val, ok := c.ctx.Get(_SessionUserInfo)
if !ok {
return proposal.SessionUserInfo{}
}
return val.(proposal.SessionUserInfo)
}
func (c *context) setSessionUserInfo(info proposal.SessionUserInfo) {
c.ctx.Set(_SessionUserInfo, info)
}
func (c *context) AbortWithError(err BusinessError) {
if err != nil {
httpCode := err.HTTPCode()
if httpCode == 0 {
httpCode = http.StatusInternalServerError
}
c.ctx.AbortWithStatus(httpCode)
c.ctx.Set(_AbortErrorName, err)
}
}
func (c *context) abortError() BusinessError {
err, _ := c.ctx.Get(_AbortErrorName)
return err.(BusinessError)
}
func (c *context) Alias() string {
path, ok := c.ctx.Get(_Alias)
if !ok {
return ""
}
return path.(string)
}
func (c *context) setAlias(path string) {
if path = strings.TrimSpace(path); path != "" {
c.ctx.Set(_Alias, path)
}
}
func (c *context) isRecordMetrics() bool {
isRecordMetrics, ok := c.ctx.Get(_IsRecordMetrics)
if !ok {
return false
}
return isRecordMetrics.(bool)
}
func (c *context) ableRecordMetrics() {
c.ctx.Set(_IsRecordMetrics, true)
}
func (c *context) disableRecordMetrics() {
c.ctx.Set(_IsRecordMetrics, false)
}
// RequestInputParams 获取所有参数
func (c *context) RequestInputParams() url.Values {
_ = c.ctx.Request.ParseForm()
return c.ctx.Request.Form
}
// RequestPostFormParams 获取 PostForm 参数
func (c *context) RequestPostFormParams() url.Values {
_ = c.ctx.Request.ParseForm()
return c.ctx.Request.PostForm
}
// RequestPathParams 获取路由参数的值
func (c *context) RequestPathParams(key string) string {
return c.ctx.Param(key)
}
// Request 获取 Request
func (c *context) Request() *http.Request {
return c.ctx.Request
}
func (c *context) RawData() []byte {
body, ok := c.ctx.Get(_BodyName)
if !ok {
return nil
}
return body.([]byte)
}
// Method 请求的method
func (c *context) Method() string {
return c.ctx.Request.Method
}
// Host 请求的host
func (c *context) Host() string {
return c.ctx.Request.Host
}
// Path 请求的路径(不附带querystring)
func (c *context) Path() string {
return c.ctx.Request.URL.Path
}
// URI unescape后的uri
func (c *context) URI() string {
uri, _ := url.QueryUnescape(c.ctx.Request.URL.RequestURI())
return uri
}
// RequestContext (包装 Trace + Logger) 获取请求的 context (当client关闭后会自动canceled)
func (c *context) RequestContext() StdContext {
return StdContext{
c.ctx.Request.Context(),
c.Trace(),
c.Logger(),
}
}
// ResponseWriter 获取 ResponseWriter
func (c *context) ResponseWriter() gin.ResponseWriter {
return c.ctx.Writer
}
// Param 获取 URL 参数
func (c *context) Param(key string) string {
return c.ctx.Param(key)
}

549
internal/pkg/core/core.go Normal file
View File

@ -0,0 +1,549 @@
package core
import (
"encoding/json"
"fmt"
"net/http"
"net/url"
"runtime/debug"
"time"
"mini-chat/configs"
_ "mini-chat/docs"
"mini-chat/internal/code"
"mini-chat/internal/pkg/cors"
"mini-chat/internal/pkg/env"
"mini-chat/internal/pkg/errors"
"mini-chat/internal/pkg/logger"
"mini-chat/internal/pkg/startup"
"mini-chat/internal/pkg/timeutil"
"mini-chat/internal/pkg/trace"
"mini-chat/internal/proposal"
"github.com/gin-contrib/pprof"
"github.com/gin-gonic/gin"
"github.com/prometheus/client_golang/prometheus/promhttp"
swaggerFiles "github.com/swaggo/files"
ginSwagger "github.com/swaggo/gin-swagger"
"go.uber.org/multierr"
"go.uber.org/zap"
)
type Option func(*option)
type option struct {
enablePProf bool
enableSwagger bool
enablePrometheus bool
enableCors bool
alertNotify proposal.AlertHandler
recordHandler proposal.RecordHandler
requestLoggerHandler proposal.RequestLoggerHandler
}
// WithEnablePProf 启用 pprof
func WithEnablePProf() Option {
return func(opt *option) {
opt.enablePProf = true
}
}
// WithEnableSwagger 启用 swagger
func WithEnableSwagger() Option {
return func(opt *option) {
opt.enableSwagger = true
}
}
// WithEnablePrometheus 启用 prometheus
func WithEnablePrometheus(recordHandler proposal.RecordHandler) Option {
return func(opt *option) {
opt.enablePrometheus = true
opt.recordHandler = recordHandler
}
}
// WithAlertNotify 设置告警通知
func WithAlertNotify(alertHandler proposal.AlertHandler) Option {
return func(opt *option) {
opt.alertNotify = alertHandler
}
}
// WithRequestLogger 设置请求日志
func WithRequestLogger(loggerHandler proposal.RequestLoggerHandler) Option {
return func(opt *option) {
opt.requestLoggerHandler = loggerHandler
}
}
// WithEnableCors 设置支持跨域
func WithEnableCors() Option {
return func(opt *option) {
opt.enableCors = true
}
}
// DisableTraceLog 禁止记录日志
func DisableTraceLog(ctx Context) {
ctx.disableTrace()
}
// DisableRecordMetrics 禁止记录指标
func DisableRecordMetrics(ctx Context) {
ctx.disableRecordMetrics()
}
// AliasForRecordMetrics 对请求路径起个别名,用于记录指标。
// 如Get /user/:username 这样的路径,因为 username 会有非常多的情况,这样记录指标非常不友好。
func AliasForRecordMetrics(path string) HandlerFunc {
return func(ctx Context) {
ctx.setAlias(path)
}
}
// WrapAuthHandler 用来处理 Auth 的入口
func WrapAuthHandler(handler func(Context) (sessionUserInfo proposal.SessionUserInfo, err BusinessError)) HandlerFunc {
return func(ctx Context) {
sessionUserInfo, err := handler(ctx)
if err != nil {
ctx.AbortWithError(err)
return
}
ctx.setSessionUserInfo(sessionUserInfo)
}
}
// RouterGroup 包装gin的RouterGroup
type RouterGroup interface {
Group(string, ...HandlerFunc) RouterGroup
IRoutes
}
var _ IRoutes = (*router)(nil)
// IRoutes 包装gin的IRoutes
type IRoutes interface {
Any(string, ...HandlerFunc)
GET(string, ...HandlerFunc)
POST(string, ...HandlerFunc)
DELETE(string, ...HandlerFunc)
PATCH(string, ...HandlerFunc)
PUT(string, ...HandlerFunc)
OPTIONS(string, ...HandlerFunc)
HEAD(string, ...HandlerFunc)
}
type router struct {
group *gin.RouterGroup
}
func (r *router) Group(relativePath string, handlers ...HandlerFunc) RouterGroup {
group := r.group.Group(relativePath, wrapHandlers(handlers...)...)
return &router{group: group}
}
func (r *router) Any(relativePath string, handlers ...HandlerFunc) {
r.group.Any(relativePath, wrapHandlers(handlers...)...)
}
func (r *router) GET(relativePath string, handlers ...HandlerFunc) {
r.group.GET(relativePath, wrapHandlers(handlers...)...)
}
func (r *router) POST(relativePath string, handlers ...HandlerFunc) {
r.group.POST(relativePath, wrapHandlers(handlers...)...)
}
func (r *router) DELETE(relativePath string, handlers ...HandlerFunc) {
r.group.DELETE(relativePath, wrapHandlers(handlers...)...)
}
func (r *router) PATCH(relativePath string, handlers ...HandlerFunc) {
r.group.PATCH(relativePath, wrapHandlers(handlers...)...)
}
func (r *router) PUT(relativePath string, handlers ...HandlerFunc) {
r.group.PUT(relativePath, wrapHandlers(handlers...)...)
}
func (r *router) OPTIONS(relativePath string, handlers ...HandlerFunc) {
r.group.OPTIONS(relativePath, wrapHandlers(handlers...)...)
}
func (r *router) HEAD(relativePath string, handlers ...HandlerFunc) {
r.group.HEAD(relativePath, wrapHandlers(handlers...)...)
}
func wrapHandlers(handlers ...HandlerFunc) []gin.HandlerFunc {
funcs := make([]gin.HandlerFunc, len(handlers))
for i, handler := range handlers {
handler := handler
funcs[i] = func(c *gin.Context) {
ctx := newContext(c)
defer releaseContext(ctx)
handler(ctx)
}
}
return funcs
}
var _ Mux = (*mux)(nil)
// Mux http mux
type Mux interface {
ServeHTTP(w http.ResponseWriter, req *http.Request)
Group(relativePath string, handlers ...HandlerFunc) RouterGroup
Routes() gin.RoutesInfo
}
type mux struct {
engine *gin.Engine
}
func (m *mux) ServeHTTP(w http.ResponseWriter, req *http.Request) {
m.engine.ServeHTTP(w, req)
}
func (m *mux) Group(relativePath string, handlers ...HandlerFunc) RouterGroup {
return &router{
group: m.engine.Group(relativePath, wrapHandlers(handlers...)...),
}
}
func (m *mux) Routes() gin.RoutesInfo {
return m.engine.Routes()
}
func New(logger logger.CustomLogger, options ...Option) (Mux, error) {
if logger == nil {
return nil, errors.New("logger required")
}
gin.SetMode(gin.ReleaseMode)
mux := &mux{
engine: gin.New(),
}
// 启动信息
startup.PrintInfo()
mux.engine.StaticFS("resources", gin.Dir(configs.GetResourcesFilePath(), true))
// withoutTracePaths 这些请求,默认不记录日志
withoutTracePaths := map[string]bool{
"/metrics": true,
"/debug/pprof/": true,
"/debug/pprof/cmdline": true,
"/debug/pprof/profile": true,
"/debug/pprof/symbol": true,
"/debug/pprof/trace": true,
"/debug/pprof/allocs": true,
"/debug/pprof/block": true,
"/debug/pprof/goroutine": true,
"/debug/pprof/heap": true,
"/debug/pprof/mutex": true,
"/debug/pprof/threadcreate": true,
"/favicon.ico": true,
"/system/health": true,
}
opt := new(option)
for _, f := range options {
f(opt)
}
if opt.enablePProf {
if !env.Active().IsPro() {
pprof.Register(mux.engine) // register pprof to gin
}
}
if opt.enableSwagger {
if !env.Active().IsPro() {
mux.engine.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) // register swagger
}
}
if opt.enablePrometheus {
mux.engine.GET("/metrics", gin.WrapH(promhttp.Handler())) // register prometheus
}
if opt.enableCors {
mux.engine.Use(cors.New())
}
// recover 两次,防止 recover 过程中时发生 panic
mux.engine.Use(func(ctx *gin.Context) {
defer func() {
if err := recover(); err != nil {
logger.Error("got panic", zap.String("panic", fmt.Sprintf("%+v", err)), zap.String("stack", string(debug.Stack())))
}
}()
ctx.Next()
})
mux.engine.Use(func(ctx *gin.Context) {
if ctx.Writer.Status() == http.StatusNotFound {
return
}
ts := time.Now()
context := newContext(ctx)
defer releaseContext(context)
context.init()
context.setLogger(logger)
context.ableRecordMetrics()
if !withoutTracePaths[ctx.Request.URL.Path] {
if traceId := context.GetHeader(trace.Header); traceId != "" {
context.setTrace(trace.New(traceId))
} else {
context.setTrace(trace.New(""))
}
}
defer func() {
var (
response interface{}
businessCode int
businessCodeMsg string
abortErr error
traceId string
)
if ct := context.Trace(); ct != nil {
context.SetHeader(trace.Header, ct.ID())
traceId = ct.ID()
}
session := context.SessionUserInfo()
panicStackInfo := ""
panicError := ""
// region 发生 Panic 异常发送告警提醒
if err := recover(); err != nil {
panicStackInfo = string(debug.Stack())
panicError = fmt.Sprintf("%+v", err)
// logger.Error("got panic", zap.String("panic", fmt.Sprintf("%+v", err)), zap.String("stack", stackInfo))
context.AbortWithError(Error(
http.StatusInternalServerError,
code.ServerError,
code.Text(code.ServerError)),
)
UID := session.UserName
if alertHandler := opt.alertNotify; alertHandler != nil {
alertHandler(&proposal.AlertMessage{
ProjectName: configs.ProjectName,
Env: env.Active().Value(),
TraceID: traceId,
UID: UID,
HOST: context.Host(),
URI: context.URI(),
Method: context.Method(),
ErrorMessage: err,
ErrorStack: panicStackInfo,
Time: time.Now().Format(timeutil.CSTLayout),
})
}
}
// endregion
// region 发生错误,进行返回
if ctx.IsAborted() {
for i := range ctx.Errors {
multierr.AppendInto(&abortErr, ctx.Errors[i])
}
UID := session.UserName
if err := context.abortError(); err != nil { // customer err
// 判断是否需要发送告警通知
if err.IsAlert() {
if alertHandler := opt.alertNotify; alertHandler != nil {
alertHandler(&proposal.AlertMessage{
ProjectName: configs.ProjectName,
Env: env.Active().Value(),
TraceID: traceId,
UID: UID,
HOST: context.Host(),
URI: context.URI(),
Method: context.Method(),
ErrorMessage: err.Message(),
ErrorStack: fmt.Sprintf("%+v", err.StackError()),
Time: time.Now().Format(timeutil.CSTLayout),
})
}
}
multierr.AppendInto(&abortErr, err.StackError())
businessCode = err.BusinessCode()
businessCodeMsg = err.Message()
response = &code.Failure{
Code: businessCode,
Message: businessCodeMsg,
}
ctx.JSON(err.HTTPCode(), response)
}
}
// endregion
// region 正确返回
response = context.getPayload()
if response != nil {
//tokenString := ctx.GetHeader("Authorization")
//if tokenString != "" {
// refreshTokenString, err := jwtoken.New(configs.Get().JWT.Secret).Refresh(tokenString)
// if err == nil {
// context.SetHeader("X-Authorization", refreshTokenString)
// }
//}
ctx.JSON(http.StatusOK, response)
}
// endregion
// region 记录指标
if opt.recordHandler != nil && context.isRecordMetrics() {
path := context.Path()
if alias := context.Alias(); alias != "" {
path = alias
}
opt.recordHandler(&proposal.MetricsMessage{
HOST: context.Host(),
Path: path,
Method: context.Method(),
HTTPCode: ctx.Writer.Status(),
BusinessCode: businessCode,
CostSeconds: time.Since(ts).Seconds(),
IsSuccess: !ctx.IsAborted() && (ctx.Writer.Status() == http.StatusOK),
})
}
// endregion
// region 记录日志
var t *trace.Trace
if x := context.Trace(); x != nil {
t = x.(*trace.Trace)
} else {
return
}
decodedURL, _ := url.QueryUnescape(ctx.Request.URL.RequestURI())
// ctx.Request.Header精简 Header 参数
traceHeader := map[string]string{
"Content-Type": ctx.GetHeader("Content-Type"),
}
t.WithRequest(&trace.Request{
TTL: "un-limit",
Method: ctx.Request.Method,
DecodedURL: decodedURL,
Header: traceHeader,
Body: string(context.RawData()),
})
var responseBody interface{}
if response != nil {
responseBody = response
}
t.WithResponse(&trace.Response{
Header: ctx.Writer.Header(),
HttpCode: ctx.Writer.Status(),
HttpCodeMsg: http.StatusText(ctx.Writer.Status()),
BusinessCode: businessCode,
BusinessCodeMsg: businessCodeMsg,
Body: responseBody,
CostSeconds: time.Since(ts).Seconds(),
})
if panicStackInfo != "" && panicError != "" {
t.AppendDebug(&trace.Debug{
Stack: panicStackInfo,
Value: []any{panicError},
})
}
t.Success = !ctx.IsAborted() && (ctx.Writer.Status() == http.StatusOK)
t.CostSeconds = time.Since(ts).Seconds()
//logger.Info("trace-log",
// zap.Any("method", ctx.Request.Method),
// zap.Any("path", decodedURL),
// zap.Any("http_code", ctx.Writer.Status()),
// zap.Any("business_code", businessCode),
// zap.Any("success", t.Success),
// zap.Any("cost_seconds", t.CostSeconds),
// zap.Any("trace_id", t.Identifier),
// zap.Any("trace_info", t),
// zap.Error(abortErr),
//)
traceInfo := ""
if traceJsonData, err := json.Marshal(t); err == nil {
traceInfo = string(traceJsonData)
}
// region 记录接口的访问日志
if opt.requestLoggerHandler != nil {
opt.requestLoggerHandler(&proposal.RequestLoggerMessage{
Tid: traceId,
Username: session.UserName,
HOST: context.Host(),
Path: decodedURL,
Method: ctx.Request.Method,
HTTPCode: ctx.Writer.Status(),
BusinessCode: businessCode,
CostSeconds: t.CostSeconds,
IsSuccess: t.Success,
Content: traceInfo,
})
}
// endregion
// endregion
}()
ctx.Next()
})
mux.engine.NoMethod(wrapHandlers(DisableTraceLog)...)
mux.engine.NoRoute(wrapHandlers(DisableTraceLog)...)
system := mux.Group("/system")
{
// 健康检查
system.GET("/health", func(ctx Context) {
resp := &struct {
Time string `json:"time"`
Environment string `json:"environment"`
Host string `json:"host"`
Status string `json:"status"`
}{
Time: timeutil.CSTLayoutString(),
Environment: env.Active().Value(),
Host: ctx.Host(),
Status: "ok",
}
ctx.Payload(resp)
})
}
return mux, nil
}

View File

@ -0,0 +1,82 @@
package core
import (
"mini-chat/internal/pkg/errors"
)
var _ BusinessError = (*businessError)(nil)
type BusinessError interface {
// i 为了避免被其他包实现
i()
// WithError 设置错误信息
WithError(err error) BusinessError
// WithAlert 设置告警通知
WithAlert() BusinessError
// BusinessCode 获取业务码
BusinessCode() int
// HTTPCode 获取 HTTP 状态码
HTTPCode() int
// Message 获取错误描述
Message() string
// StackError 获取带堆栈的错误信息
StackError() error
// IsAlert 是否开启告警通知
IsAlert() bool
}
type businessError struct {
httpCode int // HTTP 状态码
businessCode int // 业务码
message string // 错误描述
stackError error // 含有堆栈信息的错误
isAlert bool // 是否告警通知
}
func Error(httpCode, businessCode int, message string) BusinessError {
return &businessError{
httpCode: httpCode,
businessCode: businessCode,
message: message,
isAlert: false,
}
}
func (e *businessError) i() {}
func (e *businessError) WithError(err error) BusinessError {
e.stackError = errors.WithStack(err)
return e
}
func (e *businessError) WithAlert() BusinessError {
e.isAlert = true
return e
}
func (e *businessError) HTTPCode() int {
return e.httpCode
}
func (e *businessError) BusinessCode() int {
return e.businessCode
}
func (e *businessError) Message() string {
return e.message
}
func (e *businessError) StackError() error {
return e.stackError
}
func (e *businessError) IsAlert() bool {
return e.isAlert
}

39
internal/pkg/cors/cors.go Normal file
View File

@ -0,0 +1,39 @@
package cors
import (
"net/http"
"github.com/gin-gonic/gin"
ginCors "github.com/rs/cors/wrapper/gin"
)
func New() gin.HandlerFunc {
return ginCors.New(ginCors.Options{
// AllowedOrigins 允许的来源(域名),可以是一个具体的域名或使用通配符 "*" 表示允许所有来源。
// []string{"http://example.com", "http://another-domain.com"},
AllowedOrigins: []string{"*"},
// AllowedMethods 允许的 HTTP 方法,例如 "GET"、"POST"、"PUT" 等。
AllowedMethods: []string{
http.MethodGet,
http.MethodPost,
http.MethodPut,
http.MethodPatch,
http.MethodDelete,
http.MethodHead,
http.MethodOptions,
},
// AllowedHeaders 允许的请求标头,例如 "Authorization"、"Content-Type" 等。
AllowedHeaders: []string{"*"},
// MaxAge 预检请求的最大缓存时间(秒),用于减少预检请求的频率。
MaxAge: 86400,
// AllowCredentials 是否允许携带身份凭证(如 Cookie
AllowCredentials: true,
// OptionsPassthrough 是否将 OPTIONS 请求传递给下一个处理函数,设置为 true 可以在 Gin 的路由中使用 OPTIONS 请求处理函数。
OptionsPassthrough: true,
})
}

View File

@ -0,0 +1,72 @@
package cryptoaes
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"crypto/rand"
"encoding/base64"
)
// Encrypt 加密算法
func Encrypt(key, plaintext string) (string, error) {
keyByte := []byte(key)
plaintextByte := []byte(plaintext)
// 创建一个 AES 块
block, err := aes.NewCipher(keyByte)
if err != nil {
return "", err
}
// 对明文进行填充
padding := aes.BlockSize - (len(plaintext) % aes.BlockSize)
padText := append(plaintextByte, bytes.Repeat([]byte{byte(padding)}, padding)...)
ciphertext := make([]byte, aes.BlockSize+len(padText))
// 生成随机的 IV
iv := ciphertext[:aes.BlockSize]
if _, err := rand.Read(iv); err != nil {
return "", err
}
// 解密数据
mode := cipher.NewCBCEncrypter(block, iv)
mode.CryptBlocks(ciphertext[aes.BlockSize:], padText)
return base64.StdEncoding.EncodeToString(ciphertext), nil
}
// Decrypt 解密算法
func Decrypt(key, ciphertext string) (string, error) {
ciphertextByte, err := base64.StdEncoding.DecodeString(ciphertext)
if err != nil {
return "", err
}
// 创建一个 AES 块
block, err := aes.NewCipher([]byte(key))
if err != nil {
panic(err)
}
// 提取 IV
iv := ciphertextByte[:aes.BlockSize]
// 提取密文
ciphertextByteWithoutIV := ciphertextByte[aes.BlockSize:]
// 创建一个 CBC 模式的 AES 解密器
mode := cipher.NewCBCDecrypter(block, iv)
// 解密数据
decrypted := make([]byte, len(ciphertextByteWithoutIV))
mode.CryptBlocks(decrypted, ciphertextByteWithoutIV)
// 去除填充字节
padding := int(decrypted[len(decrypted)-1])
decrypted = decrypted[:len(decrypted)-padding]
return string(decrypted), nil
}

View File

@ -0,0 +1,15 @@
package cryptoaes
import "testing"
const (
key = "m52psEZHSn4!&hbs"
)
func TestEncrypt2(t *testing.T) {
t.Log(Encrypt(key, "mini-chat"))
}
func TestDecrypt(t *testing.T) {
t.Log(Decrypt(key, "qAyQtb9bkvbDFW47H5DGDVwTjw399k13xM2ceBg/OGc="))
}

View File

@ -0,0 +1,92 @@
package cryptorsa
import (
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/base64"
"encoding/pem"
"fmt"
)
// GenerateKey 生成一个 2048 位的 RSA 密钥对
func GenerateKey() {
// 生成一个 2048 位的 RSA 密钥对
privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
panic(err)
}
// 获取私钥的字节表示
privateKeyBytes := x509.MarshalPKCS1PrivateKey(privateKey)
// 将私钥字节放入 PEM 块中
privateKeyPEM := &pem.Block{
Type: "RSA PRIVATE KEY",
Bytes: privateKeyBytes,
}
// 将 PEM 块编码为字符串
privateKeyStr := string(pem.EncodeToMemory(privateKeyPEM))
// 获取公钥的字节表示
publicKeyBytes, err := x509.MarshalPKIXPublicKey(&privateKey.PublicKey)
if err != nil {
panic(err)
}
// 将公钥字节放入 PEM 块中
publicKeyPEM := &pem.Block{
Type: "PUBLIC KEY",
Bytes: publicKeyBytes,
}
// 将 PEM 块编码为字符串
publicKeyStr := string(pem.EncodeToMemory(publicKeyPEM))
fmt.Println(fmt.Sprintf("RSA 公钥:\n%s", publicKeyStr))
fmt.Println(fmt.Sprintf("RSA 私钥:\n%s", privateKeyStr))
fmt.Println("你可以将这些字符串保存到文件中或传递给其他程序使用,记得妥善保管私钥,避免泄露!")
}
// PublicKeyEncrypt 公钥加密
func PublicKeyEncrypt(publicKey, plaintext string) (string, error) {
// pem 解码
block, _ := pem.Decode([]byte(publicKey))
// x509 解码
publicKeyInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
if err != nil {
return "", err
}
//对明文进行加密
ciphertext, err := rsa.EncryptPKCS1v15(rand.Reader, publicKeyInterface.(*rsa.PublicKey), []byte(plaintext))
if err != nil {
return "", err
}
//返回密文
return base64.URLEncoding.EncodeToString(ciphertext), nil
}
// PrivateKeyDecrypt 私钥解密
func PrivateKeyDecrypt(privateKey, ciphertext string) (string, error) {
// pem 解码
block, _ := pem.Decode([]byte(privateKey))
// X509 解码
rsaPrivateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
return "", err
}
ciphertextBytes, err := base64.URLEncoding.DecodeString(ciphertext)
//对密文进行解密
plaintext, _ := rsa.DecryptPKCS1v15(rand.Reader, rsaPrivateKey, ciphertextBytes)
//返回明文
return string(plaintext), nil
}

View File

@ -0,0 +1,53 @@
package cryptorsa
import "testing"
const (
publicKey = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtoO/YB9GpcdIspc10Esy
MSKfBVspAnHsBOiyLmzlHXYfHdOf04aC+rDLC8UTbxm3/VGLTef+b7N9a6BQskjX
aMoMceKlWihdmvJPD+6ybEpSjcGXj8aaDEjJjiJhLnk1zJ5d+J9OQd5xgRSFtEFy
+OiWEhkqlwMxjFNIY0xXD0iHlnLyrAaB4Jlwp2uIwq6MCzVAJnzF/+8cov6YXfVQ
YwITDthHGG1KviPQlx5a9Nvjx/jEn1pN8OzcJKI3CRpCEuAP+80xts3nXBFUC5nT
ouHfTxyriV4r4XEO+N7H3QTBuIZ7Wr8XRFtJQcFAgye2eNJtfYMpYKb+wjqVAbR6
qwIDAQAB
-----END PUBLIC KEY-----`
privateKey = `-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAtoO/YB9GpcdIspc10EsyMSKfBVspAnHsBOiyLmzlHXYfHdOf
04aC+rDLC8UTbxm3/VGLTef+b7N9a6BQskjXaMoMceKlWihdmvJPD+6ybEpSjcGX
j8aaDEjJjiJhLnk1zJ5d+J9OQd5xgRSFtEFy+OiWEhkqlwMxjFNIY0xXD0iHlnLy
rAaB4Jlwp2uIwq6MCzVAJnzF/+8cov6YXfVQYwITDthHGG1KviPQlx5a9Nvjx/jE
n1pN8OzcJKI3CRpCEuAP+80xts3nXBFUC5nTouHfTxyriV4r4XEO+N7H3QTBuIZ7
Wr8XRFtJQcFAgye2eNJtfYMpYKb+wjqVAbR6qwIDAQABAoIBADF0VYDYOK5m513s
9xnvpjQGK4yp/Ny6vbc+zjkiLJrlDN1qIF6Sjh8blIkl53QtRduQIu0DNcBSpGNr
VzJX5nZweRrKzP82/NYlXiL1DMenA+OBV24P5GH7vxGSYz7SfS9qog/iKrRSb/MH
+oqzSVIEw9U3mIC+zsg1MOInJ1fuXAy/rZUKL3Aw5WBwQ8+I7F1bYEn21k5TSgw4
nnt5o+gK/ooMqLL3eB/CJs3T8RqoHkL5nxt1aVZYCdF7rglMLWpANWneNU3hEteN
5AvBuo+NOt230/bqK3SkqOofVPJjLiyhoMqPGDUGuC76dGm8KfQojovFpz/tSxGU
BVsUh/ECgYEA0a9t4Yzf/aJthVneZMO5vcSCfIHgLEdSAAnFMHGkNBbtgKSfbshM
7nE8vatihkcU7McuZeULFKX/db4rfRahGvuMlH8k5Wzvr+LqcrZQnR27d25+cQiD
P0p3NRyX6KIYuBcKvarP2hthjN7FwzQ7EF9xQ4OZHHHswkgvd493KU0CgYEA3tP3
OQPSLQU5MCncxW36Xy6gk4gjYvPIcOG6ME3/hlE6cupOQaRXrG+VadItgJEofZNR
GePZWMflAe1ntja3N8dZ8hJ5bdGpYsx+rf0BYz/BFXYwWqPxHpoHz+bw797NPKMv
8yOjqLOzvjUZ8ecIvFpUsseZczwa3fPfP3smd9cCgYEAxOP3R40iXmUAdfDW9MMc
S+aTqBnDx5AInWSPNlffGdJVnS/3TOzj4BmQMYEWeIOSUGsPVDpn1zGv2H2DFGgF
SvLdJCrnGE7cGcn231P2CjH678BfFgAqTWm82bBJq/VZRLLOMR6NIX4IcWBVTmBi
/ZLBJeYSBTWsXRmvCJM8DxkCgYBVUuccrujhEln2pmECPH2dytX0CDI8psq+5sCL
1KIexaXS8QNsQUjNH6Ef9zozO+I8S5fHiSblxw1a8pQ/Aq6frjcz6X0T3y+0REfR
ycqpPXVrCWm0m4gtxp9tLapev3rpWDd5K9F0PPN7xwubRHNk5FYAa0vIA2DqUoLO
5RIy2wKBgQCtyXWbcdG3Acrz90PmZzGIcAHIje+5a9mvOQTZaa7yBxn5RU+jZWqg
dzRc2cWCabOJX/skT2vKwAzGPaJN3tRhwLxLnVnSv5mrnoMq/0FG2fJ4kSjXcjwt
/vAm3+3D5KKCAqO/3Umdg2U64h+8jzMO7DtwCYJro2VWNytmgwsL/g==
-----END RSA PRIVATE KEY-----`
)
func TestPublicKeyEncrypt(t *testing.T) {
plaintext := "mini-chat"
t.Log(PublicKeyEncrypt(publicKey, plaintext))
}
func TestPrivateKeyDecrypt(t *testing.T) {
ciphertext := "bpPQp-PI-9HFjtro8Iowv7RNhY1todIhmjFkmmwjIana5RIp6ZkfkjN7_auZp_5Xo9htF_1kJ7L4cE4ixDT8l0R4u3ZGvfYJ3lP7d-De7rk_vvrEdetGEh-VGAhp3iHRgypV8CErt0JNCXcCEM_Bk87K5FLThFoU997c9IYdS6vO1WGcLsd_qzqWGxolNrSJt_oWrX4BEwu8PtVomSHbV7oG3XBRFcitzx6Ye9SjFrouUks5snzj9_2FqLoNE6dRRBPvyR0Iz753dE3CqgxUDjBhQftXPufx6r5XU1EJ4DcZDk6ZRAplOo_bgqTa91cfKhddIfdyg9nxcovmoxxyKg=="
t.Log(PrivateKeyDecrypt(privateKey, ciphertext))
}

View File

@ -0,0 +1,40 @@
package debug
import (
"runtime"
"strconv"
"mini-chat/internal/pkg/core"
"mini-chat/internal/pkg/trace"
)
type debug struct {
ctx core.StdContext
}
func WithContext(ctx core.StdContext) *debug {
return &debug{
ctx: ctx,
}
}
func (d *debug) Logger(value ...any) {
debugInfo := new(trace.Debug)
defer func() {
if d.ctx.Trace != nil {
debugInfo.Stack = fileWithLineNum()
debugInfo.Value = value
d.ctx.Trace.AppendDebug(debugInfo)
}
}()
}
func fileWithLineNum() string {
_, file, line, ok := runtime.Caller(3)
if ok {
return file + ":" + strconv.FormatInt(int64(line), 10)
}
return ""
}

77
internal/pkg/env/env.go vendored Normal file
View File

@ -0,0 +1,77 @@
package env
import (
"flag"
"fmt"
"strings"
)
var (
active Environment
dev Environment = &environment{value: "dev"}
fat Environment = &environment{value: "fat"}
uat Environment = &environment{value: "uat"}
pro Environment = &environment{value: "pro"}
)
var _ Environment = (*environment)(nil)
// Environment 环境配置
type Environment interface {
Value() string
IsDev() bool
IsFat() bool
IsUat() bool
IsPro() bool
t()
}
type environment struct {
value string
}
func (e *environment) Value() string {
return e.value
}
func (e *environment) IsDev() bool {
return e.value == "dev"
}
func (e *environment) IsFat() bool {
return e.value == "fat"
}
func (e *environment) IsUat() bool {
return e.value == "uat"
}
func (e *environment) IsPro() bool {
return e.value == "pro"
}
func (e *environment) t() {}
func init() {
env := flag.String("env", "", "请输入运行环境:\n dev:开发环境\n fat:测试环境\n uat:预上线环境\n pro:正式环境\n")
flag.Parse()
switch strings.ToLower(strings.TrimSpace(*env)) {
case "dev":
active = dev
case "fat":
active = fat
case "uat":
active = uat
case "pro":
active = pro
default:
active = fat
fmt.Println("Warning: '-env' cannot be found, or it is illegal. The default 'fat' will be used.")
}
}
// Active 当前配置的env
func Active() Environment {
return active
}

100
internal/pkg/errors/err.go Normal file
View File

@ -0,0 +1,100 @@
package errors
import (
"fmt"
"io"
"runtime"
"github.com/pkg/errors"
)
func callers() []uintptr {
var pcs [32]uintptr
l := runtime.Callers(3, pcs[:])
return pcs[:l]
}
// Error a error with caller stack information
type Error interface {
error
t()
}
var _ Error = (*item)(nil)
var _ fmt.Formatter = (*item)(nil)
type item struct {
msg string
stack []uintptr
}
func (i *item) Error() string {
return i.msg
}
func (i *item) t() {}
// Format used by go.uber.org/zap in Verbose
func (i *item) Format(s fmt.State, verb rune) {
io.WriteString(s, i.msg)
io.WriteString(s, "\n")
for _, pc := range i.stack {
fmt.Fprintf(s, "%+v\n", errors.Frame(pc))
}
}
// New create a new error
func New(msg string) Error {
return &item{msg: msg, stack: callers()}
}
// Errorf create a new error
func Errorf(format string, args ...interface{}) Error {
return &item{msg: fmt.Sprintf(format, args...), stack: callers()}
}
// Wrap with some extra message into err
func Wrap(err error, msg string) Error {
if err == nil {
return nil
}
e, ok := err.(*item)
if !ok {
return &item{msg: fmt.Sprintf("%s; %s", msg, err.Error()), stack: callers()}
}
e.msg = fmt.Sprintf("%s; %s", msg, e.msg)
return e
}
// Wrapf with some extra message into err
func Wrapf(err error, format string, args ...interface{}) Error {
if err == nil {
return nil
}
msg := fmt.Sprintf(format, args...)
e, ok := err.(*item)
if !ok {
return &item{msg: fmt.Sprintf("%s; %s", msg, err.Error()), stack: callers()}
}
e.msg = fmt.Sprintf("%s; %s", msg, e.msg)
return e
}
// WithStack add caller stack information
func WithStack(err error) Error {
if err == nil {
return nil
}
if e, ok := err.(*item); ok {
return e
}
return &item{msg: err.Error(), stack: callers()}
}

View File

@ -0,0 +1,34 @@
package errors
import (
"errors"
"testing"
"go.uber.org/zap"
)
func TestErr(t *testing.T) {
logger, _ := zap.NewProduction()
logger.Info("errorf", zap.Error(Errorf("%s %d", "127.0.0.1", 80)))
err := New("a dummy err")
logger.Info("new", zap.Error(err))
err = Wrap(err, "ping timeout err")
logger.Info("wrap", zap.Error(err))
err = Wrapf(err, "ip: %s port: %d", "localhost", 80)
logger.Info("wrapf", zap.Error(err))
err = WithStack(err)
logger.Info("withstack", zap.Error(err))
logger.Info("wrap std", zap.Error(Wrap(errors.New("std err"), "some err occurs")))
logger.Info("wrapf std", zap.Error(Wrapf(errors.New("std err"), "ip: %s port: %d", "localhost", 80)))
logger.Info("withstack std", zap.Error(WithStack(errors.New("std err"))))
t.Logf("%+v", New("a dummy error"))
}

View File

@ -0,0 +1,110 @@
package httpclient
import (
"mini-chat/internal/pkg/core"
"mini-chat/internal/pkg/trace"
"github.com/bytedance/sonic"
"github.com/go-resty/resty/v2"
)
type customInterceptor struct {
ctx core.StdContext
}
func (i *customInterceptor) OnResponse(client *resty.Client, response *resty.Response) error {
requestInfo := map[string]interface{}{
"request-id": i.ctx.Trace.ID(),
"url": response.Request.URL,
"method": response.Request.Method,
"header": response.Request.Header,
"path_params": response.Request.PathParams,
"body": response.Request.Body,
"request_time": response.Request.Time.Format("2006-01-02 15:04:05"),
"ti-DNSLookup": response.Request.TraceInfo().DNSLookup,
"ti-ConnTime": response.Request.TraceInfo().ConnTime.String(),
"ti-TCPConnTime": response.Request.TraceInfo().TCPConnTime.String(),
"ti-TLSHandshake": response.Request.TraceInfo().TLSHandshake.String(),
"ti-ServerTime": response.Request.TraceInfo().ServerTime.String(),
"ti-IsConnReused": response.Request.TraceInfo().IsConnReused,
"ti-IsConnWasIdle": response.Request.TraceInfo().IsConnWasIdle,
"ti-ConnIdleTime": response.Request.TraceInfo().ConnIdleTime.String(),
"ti-RequestAttempt": response.Request.TraceInfo().RequestAttempt,
"ti-RemoteAddr": response.Request.TraceInfo().RemoteAddr.String(),
}
responseInfo := map[string]interface{}{
"status_code": response.StatusCode(),
"status": response.Status(),
"proto": response.Proto(),
"header": response.Header(),
"total_time": response.Request.TraceInfo().TotalTime.String(),
"received_at": response.ReceivedAt().Format("2006-01-02 15:04:05"),
"body": string(response.Body()),
}
httpLog := new(trace.HttpLog)
httpLog.Request = requestInfo
httpLog.Response = responseInfo
httpLog.CostSeconds = response.Time().Seconds()
i.ctx.Trace.AppendThirdPartyRequests(httpLog)
return nil
}
func (i *customInterceptor) OnError(request *resty.Request, err error) {
requestInfo := map[string]interface{}{
"request-id": i.ctx.Trace.ID(),
"url": request.URL,
"method": request.Method,
"header": request.Header,
"path_params": request.PathParams,
"body": request.Body,
"request_time": request.Time.Format("2006-01-02 15:04:05"),
}
responseInfo := map[string]interface{}{
"error": err.Error(),
}
httpLog := new(trace.HttpLog)
httpLog.Request = requestInfo
httpLog.Response = responseInfo
httpLog.CostSeconds = request.TraceInfo().TotalTime.Seconds()
i.ctx.Trace.AppendThirdPartyRequests(httpLog)
}
func GetHttpClientWithContext(ctx core.StdContext) *resty.Client {
client := resty.New().
EnableTrace().
SetJSONUnmarshaler(func(data []byte, v interface{}) error {
// 配置 Sonic 宽松模式
return sonic.Config{
ValidateString: false,
}.Froze().Unmarshal(data, v)
})
interceptor := &customInterceptor{
ctx: ctx,
}
client.OnAfterResponse(interceptor.OnResponse)
client.OnError(interceptor.OnError)
return client
}
func GetHttpClient() *resty.Client {
return resty.New().
EnableTrace().
SetJSONUnmarshaler(func(data []byte, v interface{}) error {
// 配置 Sonic 宽松模式
return sonic.Config{
ValidateString: false,
}.Froze().Unmarshal(data, v)
})
}

View File

@ -0,0 +1,14 @@
package idgen
import (
"github.com/bwmarrin/snowflake"
)
func GenerateUniqueID() string {
node, err := snowflake.NewNode(1)
if err != nil {
panic(err)
}
return node.Generate().String()
}

View File

@ -0,0 +1,7 @@
package idgen
import "testing"
func TestGenerateUniqueID(t *testing.T) {
t.Log(GenerateUniqueID())
}

View File

@ -0,0 +1,10 @@
package jsonutil
import "github.com/bytedance/sonic"
// 配置 Sonic 宽松模式
var jsonKit = sonic.Config{ValidateString: false}.Froze()
func Unmarshal(data []byte, v any) error {
return jsonKit.Unmarshal(data, v)
}

View File

@ -0,0 +1,80 @@
package jwtoken
import (
"time"
"mini-chat/internal/proposal"
"github.com/golang-jwt/jwt/v5"
)
var _ Token = (*token)(nil)
type Token interface {
i()
Sign(jwtInfo proposal.SessionUserInfo, expireDuration time.Duration) (tokenString string, err error)
Parse(tokenString string) (*claims, error)
Refresh(tokenString string) (refreshTokenString string, err error)
}
type token struct {
secret string
}
type claims struct {
proposal.SessionUserInfo
jwt.RegisteredClaims
}
func New(secret string) Token {
return &token{
secret: secret,
}
}
func (t *token) i() {}
func (t *token) Sign(sessionUserInfo proposal.SessionUserInfo, expireDuration time.Duration) (tokenString string, err error) {
claims := claims{
sessionUserInfo,
jwt.RegisteredClaims{
NotBefore: jwt.NewNumericDate(time.Now()),
IssuedAt: jwt.NewNumericDate(time.Now()),
ExpiresAt: jwt.NewNumericDate(time.Now().Add(expireDuration)),
},
}
tokenString, err = jwt.NewWithClaims(jwt.SigningMethodHS256, claims).SignedString([]byte(t.secret))
return
}
func (t *token) Parse(tokenString string) (*claims, error) {
tokenClaims, err := jwt.ParseWithClaims(tokenString, &claims{}, func(token *jwt.Token) (interface{}, error) {
return []byte(t.secret), nil
})
if tokenClaims != nil {
if claims, ok := tokenClaims.Claims.(*claims); ok && tokenClaims.Valid {
return claims, nil
}
}
return nil, err
}
func (t *token) Refresh(tokenString string) (refreshTokenString string, err error) {
tokenClaims, err := jwt.ParseWithClaims(tokenString, &claims{}, func(token *jwt.Token) (interface{}, error) {
return []byte(t.secret), nil
})
if tokenClaims != nil {
if claims, ok := tokenClaims.Claims.(*claims); ok && tokenClaims.Valid {
claims.IssuedAt = jwt.NewNumericDate(time.Now())
claims.ExpiresAt = jwt.NewNumericDate(time.Now().Add(time.Hour * 24))
refreshTokenString, err = jwt.NewWithClaims(jwt.SigningMethodHS256, claims).SignedString([]byte(t.secret))
return
}
}
return refreshTokenString, err
}

View File

@ -0,0 +1,40 @@
package jwtoken
import (
"fmt"
"testing"
"time"
"mini-chat/internal/proposal"
)
const secret = "i1ydX9RtHyuJTrw7frcu"
func TestSign(t *testing.T) {
sessionUserInfo := proposal.SessionUserInfo{
Id: 1001,
UserName: "mini-chat",
NickName: "mono",
}
tokenString, err := New(secret).Sign(sessionUserInfo, 24*time.Hour)
fmt.Println(tokenString, err)
if err != nil {
t.Error("sign error", err)
return
}
t.Log(tokenString)
}
func TestParse(t *testing.T) {
tokenString := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MTAwMSwidXNlcm5hbWUiOiJnaW4tYXBpLW1vbm8iLCJuaWNrbmFtZSI6Im1vbm8iLCJleHAiOjE3MDQ3ODY3NDcsIm5iZiI6MTcwNDcwMDM0NywiaWF0IjoxNzA0NzAwMzQ3fQ.22pCSb-aSv4BvaYnw3anryMrCpAY2I7zidkCZseWxcQ"
jwtInfo, err := New(secret).Parse(tokenString)
if err != nil {
t.Error("parse error", err)
return
}
t.Log(jwtInfo)
}

View File

@ -0,0 +1,394 @@
package logger
import (
"bytes"
"encoding/json"
"fmt"
"io"
"log"
"os"
"path/filepath"
"time"
"mini-chat/internal/repository/mysql/dao"
"mini-chat/internal/repository/mysql/model"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
)
const (
// DefaultLevel the default log level
DefaultLevel = zapcore.InfoLevel
// DefaultTimeLayout the default time layout;
DefaultTimeLayout = time.RFC3339
)
// Option custom setup config
type Option func(*option)
type option struct {
level zapcore.Level
fields map[string]string
file io.Writer
timeLayout string
outputInConsole bool
}
// WithDebugLevel only greater than 'level' will output
func WithDebugLevel() Option {
return func(opt *option) {
opt.level = zapcore.DebugLevel
}
}
// WithInfoLevel only greater than 'level' will output
func WithInfoLevel() Option {
return func(opt *option) {
opt.level = zapcore.InfoLevel
}
}
// WithWarnLevel only greater than 'level' will output
func WithWarnLevel() Option {
return func(opt *option) {
opt.level = zapcore.WarnLevel
}
}
// WithErrorLevel only greater than 'level' will output
func WithErrorLevel() Option {
return func(opt *option) {
opt.level = zapcore.ErrorLevel
}
}
// WithField add some field(s) to log
func WithField(key, value string) Option {
return func(opt *option) {
opt.fields[key] = value
}
}
// WithFileP write log to some file
func WithFileP(file string) Option {
dir := filepath.Dir(file)
if err := os.MkdirAll(dir, 0766); err != nil {
panic(err)
}
f, err := os.OpenFile(file, os.O_CREATE|os.O_APPEND|os.O_RDWR, 0766)
if err != nil {
panic(err)
}
return func(opt *option) {
opt.file = zapcore.Lock(f)
}
}
// WithFileRotationP write log to some file with rotation
func WithFileRotationP(file string) Option {
dir := filepath.Dir(file)
if err := os.MkdirAll(dir, 0766); err != nil {
panic(err)
}
return func(opt *option) {
opt.file = &lumberjack.Logger{ // concurrent-safed
Filename: file, // 文件路径
MaxSize: 128, // 单个文件最大尺寸,默认单位 M
MaxBackups: 300, // 最多保留 300 个备份
MaxAge: 30, // 最大时间,默认单位 day
LocalTime: true, // 使用本地时间
Compress: true, // 是否压缩 disabled by default
}
}
}
// WithTimeLayout custom time format
func WithTimeLayout(timeLayout string) Option {
return func(opt *option) {
opt.timeLayout = timeLayout
}
}
// WithOutputInConsole write log to os.Stdout or os.Stderr
func WithOutputInConsole() Option {
return func(opt *option) {
opt.outputInConsole = true
}
}
// NewJSONLogger return a json-encoder zap logger,
func NewJSONLogger(opts ...Option) (*zap.Logger, error) {
opt := &option{level: DefaultLevel, fields: make(map[string]string)}
for _, f := range opts {
f(opt)
}
timeLayout := DefaultTimeLayout
if opt.timeLayout != "" {
timeLayout = opt.timeLayout
}
// similar to zap.NewProductionEncoderConfig()
encoderConfig := zapcore.EncoderConfig{
TimeKey: "time",
LevelKey: "level",
NameKey: "logger", // used by logger.Named(key); optional; useless
CallerKey: "caller",
MessageKey: "msg",
StacktraceKey: "stacktrace", // use by zap.AddStacktrace; optional; useless
LineEnding: zapcore.DefaultLineEnding,
EncodeLevel: zapcore.LowercaseLevelEncoder, // 小写编码器
EncodeTime: func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
enc.AppendString(t.Format(timeLayout))
},
EncodeDuration: zapcore.MillisDurationEncoder,
EncodeCaller: zapcore.ShortCallerEncoder, // 全路径编码器
}
jsonEncoder := zapcore.NewJSONEncoder(encoderConfig)
// lowPriority usd by info\debug\warn
lowPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl >= opt.level && lvl < zapcore.ErrorLevel
})
// highPriority usd by error\panic\fatal
highPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl >= opt.level && lvl >= zapcore.ErrorLevel
})
stdout := zapcore.Lock(os.Stdout) // lock for concurrent safe
stderr := zapcore.Lock(os.Stderr) // lock for concurrent safe
core := zapcore.NewTee()
if opt.outputInConsole {
core = zapcore.NewTee(
zapcore.NewCore(jsonEncoder,
zapcore.NewMultiWriteSyncer(stdout),
lowPriority,
),
zapcore.NewCore(jsonEncoder,
zapcore.NewMultiWriteSyncer(stderr),
highPriority,
),
)
}
if opt.file != nil {
core = zapcore.NewTee(core,
zapcore.NewCore(jsonEncoder,
zapcore.AddSync(opt.file),
zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl >= opt.level
}),
),
)
}
logger := zap.New(core,
zap.AddCaller(),
zap.ErrorOutput(stderr),
)
for key, value := range opt.fields {
logger = logger.WithOptions(zap.Fields(zapcore.Field{Key: key, Type: zapcore.StringType, String: value}))
}
return logger, nil
}
// CustomLogger 自定义日志记录器
type customLogger struct {
db *dao.Query
logger *zap.Logger
}
var _ CustomLogger = (*customLogger)(nil)
type CustomLogger interface {
i()
Info(msg string, fields ...zap.Field)
Debug(msg string, fields ...zap.Field)
Warn(msg string, fields ...zap.Field)
Error(msg string, fields ...zap.Field)
Fatal(msg string, fields ...zap.Field)
Sync() error
}
// NewCustomLogger 创建自定义日志记录器
func NewCustomLogger(db *dao.Query, opts ...Option) (CustomLogger, error) {
logger, err := NewJSONLogger(opts...)
if err != nil {
return nil, err
}
return &customLogger{
db: db,
logger: logger,
}, nil
}
func (c *customLogger) i() {
}
// fieldsToJSON 将 zap.Field 转换为 JSON 字符串
func (c *customLogger) fieldsToJSON(msg string, fields []zap.Field) (string, error) {
// 创建一个 buffer 来存储编码后的 JSON
buffer := &bytes.Buffer{}
// 创建一个 zapcore.Encoder 对象
encoderConfig := zap.NewProductionEncoderConfig()
encoder := zapcore.NewJSONEncoder(encoderConfig)
// 创建一个 zapcore.Core 对象
core := zapcore.NewCore(encoder, zapcore.AddSync(buffer), zap.InfoLevel)
// 创建一个 zap.Logger 对象
tempLogger := zap.New(core)
// 使用 tempLogger 记录一条日志,只包含 fields
tempLogger.Info(msg, fields...)
// 获取编码后的 JSON 字符串
jsonStr := buffer.String()
// 去掉最后的换行符
if len(jsonStr) > 0 && jsonStr[len(jsonStr)-1] == '\n' {
jsonStr = jsonStr[:len(jsonStr)-1]
}
// 解析 JSON 字符串以确保格式正确
var parsedJSON map[string]interface{}
err := json.Unmarshal([]byte(jsonStr), &parsedJSON)
if err != nil {
return "", err
}
// 重新编码为 JSON 字符串
jsonBytes, err := json.Marshal(parsedJSON)
if err != nil {
return "", err
}
return string(jsonBytes), nil
}
// fieldsJsonToDB 将 zap.Field 转换为数据库记录
func (c *customLogger) fieldsJsonToDB(level, msg string, fields []zap.Field) {
content := ""
jsonFields, err := c.fieldsToJSON(msg, fields)
if err != nil {
c.logger.Error("Failed to convert zap fields to JSON", zap.Error(err))
} else {
content = jsonFields
}
if c.db != nil {
if err := c.db.LogOperation.Create(&model.LogOperation{
Level: level,
Msg: msg,
Content: content,
CreatedAt: time.Now(),
}); err != nil {
log.Println(fmt.Sprintf("Failed to create log operation record: %s", err.Error()))
}
} else {
log.Println(level, msg, content)
}
}
// Info 重写 Info 方法
func (c *customLogger) Info(msg string, fields ...zap.Field) {
c.logger.Info(msg, fields...)
c.fieldsJsonToDB("info", msg, fields)
}
// Debug 调用底层 Debug 方法
func (c *customLogger) Debug(msg string, fields ...zap.Field) {
c.logger.Debug(msg, fields...)
c.fieldsJsonToDB("debug", msg, fields)
}
// Warn 调用底层 Warn 方法
func (c *customLogger) Warn(msg string, fields ...zap.Field) {
c.logger.Warn(msg, fields...)
c.fieldsJsonToDB("warn", msg, fields)
}
// Error 调用底层 Error 方法
func (c *customLogger) Error(msg string, fields ...zap.Field) {
c.logger.Error(msg, fields...)
c.fieldsJsonToDB("error", msg, fields)
}
// Fatal 调用底层 Fatal 方法
func (c *customLogger) Fatal(msg string, fields ...zap.Field) {
c.logger.Fatal(msg, fields...)
c.fieldsJsonToDB("fatal", msg, fields)
}
// Sync 调用底层 Sync 方法
func (c *customLogger) Sync() error {
return c.logger.Sync()
}
// With 调用底层 With 方法
//func (c *customLogger) With(db mysql.Repo, fields ...zap.Field) *customLogger {
// return &customLogger{db: db, logger: c.logger.With(fields...)}
//}
var _ Meta = (*meta)(nil)
// Meta key-value
type Meta interface {
Key() string
Value() interface{}
meta()
}
type meta struct {
key string
value interface{}
}
func (m *meta) Key() string {
return m.key
}
func (m *meta) Value() interface{} {
return m.value
}
func (m *meta) meta() {}
// NewMeta create meat
func NewMeta(key string, value interface{}) Meta {
return &meta{key: key, value: value}
}
// WrapMeta wrap meta to zap fields
func WrapMeta(err error, metas ...Meta) (fields []zap.Field) {
capacity := len(metas) + 1 // namespace meta
if err != nil {
capacity++
}
fields = make([]zap.Field, 0, capacity)
if err != nil {
fields = append(fields, zap.Error(err))
}
fields = append(fields, zap.Namespace("meta"))
for _, meta := range metas {
fields = append(fields, zap.Any(meta.Key(), meta.Value()))
}
return
}

View File

@ -0,0 +1,60 @@
package logger
import (
"testing"
"mini-chat/internal/pkg/timeutil"
"github.com/pkg/errors"
"go.uber.org/zap"
)
func TestJSONLogger(t *testing.T) {
logger, err := NewJSONLogger(
WithField("defined_key", "defined_value"),
WithTimeLayout(timeutil.CSTLayout),
WithOutputInConsole(),
)
if err != nil {
t.Fatal(err)
}
defer logger.Sync()
err = errors.New("pkg error")
logger.Error("err occurs", WrapMeta(nil, NewMeta("para1", "value1"), NewMeta("para2", "value2"))...)
logger.Error("err occurs", WrapMeta(err, NewMeta("para1", "value1"), NewMeta("para2", "value2"))...)
}
func TestCustomLogger(t *testing.T) {
logger, err := NewCustomLogger(nil,
WithField("defined_key", "defined_value"),
WithTimeLayout(timeutil.CSTLayout),
//WithOutputInConsole(),
)
if err != nil {
t.Fatal(err)
}
defer logger.Sync()
err = errors.New("pkg error")
logger.Info("none err")
logger.Info("with err", zap.Error(err))
logger.Info("err occurs", WrapMeta(nil, NewMeta("para1", "value1"), NewMeta("para2", "value2"))...)
logger.Info("err occurs", WrapMeta(err, NewMeta("para1", "value1"), NewMeta("para2", "value2"))...)
}
func BenchmarkJsonLogger(b *testing.B) {
b.ResetTimer()
logger, err := NewJSONLogger(
WithField("defined_key", "defined_value"),
)
if err != nil {
b.Fatal(err)
}
defer logger.Sync()
}

View File

@ -0,0 +1,18 @@
package shutdown
import (
"os"
"os/signal"
"syscall"
)
// Close 监听signal并停止
func Close(handler func()) {
ctx := make(chan os.Signal, 1)
signal.Notify(ctx, syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP, syscall.SIGQUIT)
<-ctx
signal.Stop(ctx)
handler()
}

View File

@ -0,0 +1,58 @@
package startup
import (
"fmt"
"runtime"
"time"
"mini-chat/configs"
"mini-chat/internal/pkg/env"
"github.com/common-nighthawk/go-figure"
"github.com/fatih/color"
)
type status struct {
CustomerProjectNameZh string `json:"customer_project_name_zh"`
CustomerProjectNameEn string `json:"customer_project_name_en"`
CustomerProjectVersion string `json:"customer_project_version"`
ProjectPort string `json:"project_port"`
ProjectEnv string `json:"project_env"`
RuntimeVersion string `json:"runtime_version"`
Now string `json:"now"`
}
func PrintInfo() {
// 创建 ASCII 艺术标题
fmt.Println()
myFigure := figure.NewColorFigure(configs.CustomerProjectNameEn, "", "green", true)
myFigure.Print()
// 项目信息
green := color.New(color.FgGreen).Add(color.Bold)
green.Printf("▌ 客户项目: %s\n", configs.CustomerProjectNameZh)
green.Printf("▌ 项目版本: %s\n", configs.CustomerProjectVersion)
green.Printf("▌ 启动时间: %s\n", time.Now().Format("2006-01-02 15:04:05"))
green.Printf("▌ 运行环境: %s %s\n", runtime.GOOS, runtime.Version())
green.Printf("▌ 服务端口: [%s]\n", configs.ProjectPort)
green.Printf("▌ 服务配置: [%s]\n", env.Active().Value())
// 服务状态
fmt.Println()
yellow := color.New(color.FgYellow).Add(color.Bold)
yellow.Printf("▌ 数据库连接: ✔ 已建立\n")
fmt.Println()
}
func Info() *status {
return &status{
CustomerProjectNameZh: configs.CustomerProjectNameZh,
CustomerProjectNameEn: configs.CustomerProjectNameEn,
CustomerProjectVersion: configs.CustomerProjectVersion,
ProjectPort: configs.ProjectPort,
ProjectEnv: env.Active().Value(),
RuntimeVersion: fmt.Sprintf("%s %s", runtime.GOOS, runtime.Version()),
Now: time.Now().Format("2006-01-02 15:04:05"),
}
}

View File

@ -0,0 +1,101 @@
package timeutil
import (
"fmt"
"math"
"net/http"
"time"
)
var (
cst *time.Location
)
// CSTLayout China Standard Time Layout
const CSTLayout = "2006-01-02 15:04:05"
func init() {
var err error
if cst, err = time.LoadLocation("Asia/Shanghai"); err != nil {
panic(err)
}
// 默认设置为中国时区
time.Local = cst
}
// RFC3339ToCSTLayout convert rfc3339 value to china standard time layout
// 2020-11-08T08:18:46+08:00 => 2020-11-08 08:18:46
func RFC3339ToCSTLayout(value string) (string, error) {
ts, err := time.Parse(time.RFC3339, value)
if err != nil {
return "", err
}
return ts.In(cst).Format(CSTLayout), nil
}
// CSTLayoutString 格式化时间
// 返回 "2006-01-02 15:04:05" 格式的时间
func CSTLayoutString() string {
ts := time.Now()
return ts.In(cst).Format(CSTLayout)
}
// ParseCSTInLocation 格式化时间
func ParseCSTInLocation(date string) (time.Time, error) {
return time.ParseInLocation(CSTLayout, date, cst)
}
// ParseHMInLocation 格式化时间
func ParseHMInLocation(date string) (time.Time, error) {
return time.ParseInLocation("15:04", date, cst)
}
// CSTLayoutStringToUnix 返回 unix 时间戳
// 2020-01-24 21:11:11 => 1579871471
func CSTLayoutStringToUnix(cstLayoutString string) (int64, error) {
stamp, err := time.ParseInLocation(CSTLayout, cstLayoutString, cst)
if err != nil {
return 0, err
}
return stamp.Unix(), nil
}
// GMTLayoutString 格式化时间
// 返回 "Mon, 02 Jan 2006 15:04:05 GMT" 格式的时间
func GMTLayoutString() string {
return time.Now().In(cst).Format(http.TimeFormat)
}
// ParseGMTInLocation 格式化时间
func ParseGMTInLocation(date string) (time.Time, error) {
return time.ParseInLocation(http.TimeFormat, date, cst)
}
// SubInLocation 计算时间差
func SubInLocation(ts time.Time) float64 {
return math.Abs(time.Now().In(cst).Sub(ts).Seconds())
}
// FriendlyTime 返回一个友好的时间格式
func FriendlyTime(t time.Time) string {
now := time.Now()
diff := now.Sub(t)
// 计算差异的分钟数
minutes := int(diff.Minutes())
switch {
case minutes < 1:
return "刚刚"
case minutes < 60:
return fmt.Sprintf("%d分钟前", minutes)
case minutes < 1440: // 一天的分钟数
hours := minutes / 60
return fmt.Sprintf("%d小时前", hours)
default:
// 如果超过一天,可以返回更详细的日期格式
return t.Format("2006-01-02 15:04")
}
}

View File

@ -0,0 +1,19 @@
package timeutil
import "testing"
func TestRFC3339ToCSTLayout(t *testing.T) {
t.Log(RFC3339ToCSTLayout("2020-11-08T08:18:46+08:00"))
}
func TestCSTLayoutString(t *testing.T) {
t.Log(CSTLayoutString())
}
func TestCSTLayoutStringToUnix(t *testing.T) {
t.Log(CSTLayoutStringToUnix("2020-01-24 21:11:11"))
}
func TestGMTLayoutString(t *testing.T) {
t.Log(GMTLayoutString())
}

View File

@ -0,0 +1,6 @@
package trace
type Debug struct {
Stack string `json:"stack"` // 文件地址和行号
Value []any `json:"value"` // 值
}

View File

@ -0,0 +1,7 @@
package trace
type HttpLog struct {
Request map[string]interface{} `json:"request"` // 请求信息
Response map[string]interface{} `json:"response"` // 响应信息
CostSeconds float64 `json:"cost_seconds"` // 执行时间(单位秒)
}

View File

@ -0,0 +1,9 @@
package trace
type Mongo struct {
Time string `json:"time"` // 时间格式2006-01-02 15:04:05
Database string `json:"database"` // 数据库名称
Command string `json:"command"` // 命令
Reply string `json:"reply"` // 响应
CostSeconds float64 `json:"cost_seconds"` // 执行时间(单位秒)
}

View File

@ -0,0 +1,8 @@
package trace
type Redis struct {
Time string `json:"time"` // 时间格式2006-01-02 15:04:05
Stack string `json:"stack"` // 文件地址和行号
Cmd interface{} `json:"cmd"` // 操作
CostSeconds float64 `json:"cost_seconds"` // 执行时间(单位秒)
}

View File

@ -0,0 +1,9 @@
package trace
type SQL struct {
Time string `json:"time"` // 时间格式2006-01-02 15:04:05
Stack string `json:"stack"` // 文件地址和行号
SQL string `json:"sql"` // SQL 语句
Rows int64 `json:"rows_affected"` // 影响行数
CostSeconds float64 `json:"cost_seconds"` // 执行时长(单位秒)
}

152
internal/pkg/trace/trace.go Normal file
View File

@ -0,0 +1,152 @@
package trace
import (
"sync"
"mini-chat/internal/pkg/idgen"
)
const Header = "TRACE-ID"
var _ T = (*Trace)(nil)
type T interface {
i()
ID() string
WithRequest(req *Request) *Trace
WithResponse(resp *Response) *Trace
AppendThirdPartyRequests(http *HttpLog) *Trace
AppendSQL(sql *SQL) *Trace
AppendDebug(debug *Debug) *Trace
AppendRedis(redis *Redis) *Trace
AppendMongo(mongo *Mongo) *Trace
}
// Trace 记录的参数
type Trace struct {
mux sync.Mutex
Identifier string `json:"trace_id"` // 链路ID
Request *Request `json:"request"` // 请求信息
Response *Response `json:"response"` // 返回信息
ThirdPartyRequests []*HttpLog `json:"third_party_requests"` // 调用第三方接口的信息
Debugs []*Debug `json:"debugs"` // 调试信息
SQLs []*SQL `json:"sqls"` // 执行的 SQL 信息
Redis []*Redis `json:"redis"` // 执行的 Redis 信息
Mongos []*Mongo `json:"mongos"` // 执行的 Mongo 信息
Success bool `json:"success"` // 请求结果 true or false
CostSeconds float64 `json:"cost_seconds"` // 执行时长(单位秒)
}
// Request 请求信息
type Request struct {
TTL string `json:"ttl"` // 请求超时时间
Method string `json:"method"` // 请求方式
DecodedURL string `json:"decoded_url"` // 请求地址
Header interface{} `json:"header"` // 请求 Header 信息
Body interface{} `json:"body"` // 请求 Body 信息
}
// Response 响应信息
type Response struct {
Header interface{} `json:"header"` // Header 信息
Body interface{} `json:"body"` // Body 信息
BusinessCode int `json:"business_code,omitempty"` // 业务码
BusinessCodeMsg string `json:"business_code_msg,omitempty"` // 提示信息
HttpCode int `json:"http_code"` // HTTP 状态码
HttpCodeMsg string `json:"http_code_msg"` // HTTP 状态码信息
CostSeconds float64 `json:"cost_seconds"` // 执行时间(单位秒)
}
func New(id string) *Trace {
if id == "" {
id = idgen.GenerateUniqueID()
}
return &Trace{
Identifier: id,
}
}
func (t *Trace) i() {}
// ID 唯一标识符
func (t *Trace) ID() string {
return t.Identifier
}
// WithRequest 设置 request 信息
func (t *Trace) WithRequest(req *Request) *Trace {
t.Request = req
return t
}
// WithResponse 设置 response 信息
func (t *Trace) WithResponse(resp *Response) *Trace {
t.Response = resp
return t
}
// AppendThirdPartyRequests 追加 HTTP 三方请求日志
func (t *Trace) AppendThirdPartyRequests(http *HttpLog) *Trace {
if http == nil {
return t
}
t.mux.Lock()
defer t.mux.Unlock()
t.ThirdPartyRequests = append(t.ThirdPartyRequests, http)
return t
}
// AppendDebug 追加 debug 日志
func (t *Trace) AppendDebug(debug *Debug) *Trace {
if debug == nil {
return t
}
t.mux.Lock()
defer t.mux.Unlock()
t.Debugs = append(t.Debugs, debug)
return t
}
// AppendSQL 追加 SQL 执行日志
func (t *Trace) AppendSQL(sql *SQL) *Trace {
if sql == nil {
return t
}
t.mux.Lock()
defer t.mux.Unlock()
t.SQLs = append(t.SQLs, sql)
return t
}
// AppendRedis 追加 Redis 执行日志
func (t *Trace) AppendRedis(redis *Redis) *Trace {
if redis == nil {
return t
}
t.mux.Lock()
defer t.mux.Unlock()
t.Redis = append(t.Redis, redis)
return t
}
// AppendMongo 追加 Mongo 执行日志
func (t *Trace) AppendMongo(mongo *Mongo) *Trace {
if mongo == nil {
return t
}
t.mux.Lock()
defer t.mux.Unlock()
t.Mongos = append(t.Mongos, mongo)
return t
}

275
internal/pkg/utils/utils.go Normal file
View File

@ -0,0 +1,275 @@
package utils
import (
"bytes"
"crypto/md5"
"encoding/base64"
"encoding/hex"
"fmt"
"net"
"net/http"
"strings"
"time"
"github.com/tealeg/xlsx"
"golang.org/x/crypto/bcrypt"
)
// GenerateAdminHashedPassword [管理端]生成密码
func GenerateAdminHashedPassword(password string) (string, error) {
salt := "7M&7p7euU=MM"
passwordWithSalt := password + salt
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(passwordWithSalt), bcrypt.DefaultCost)
if err != nil {
return "", err
}
return string(hashedPassword), nil
}
// VerifyAdminHashedPassword [管理端]验证密码
func VerifyAdminHashedPassword(hashedPassword, password string) bool {
salt := "7M&7p7euU=MM"
passwordWithSalt := password + salt
err := bcrypt.CompareHashAndPassword([]byte(hashedPassword+salt), []byte(passwordWithSalt))
return err == nil
}
// GenerateDoctorHashedPassword [医生端]生成密码
func GenerateDoctorHashedPassword(password string) (string, error) {
salt := "9M&9p9euU=DD"
passwordWithSalt := password + salt
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(passwordWithSalt), bcrypt.DefaultCost)
if err != nil {
return "", err
}
return string(hashedPassword), nil
}
// VerifyDoctorHashedPassword [医生端]验证密码
func VerifyDoctorHashedPassword(hashedPassword, password string) bool {
salt := "9M&9p9euU=DD"
passwordWithSalt := password + salt
err := bcrypt.CompareHashAndPassword([]byte(hashedPassword+salt), []byte(passwordWithSalt))
return err == nil
}
// GeneratePatientHashedPassword [患者端]生成密码
func GeneratePatientHashedPassword(password string) (string, error) {
salt := "8T&8p8euU=PP"
passwordWithSalt := password + salt
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(passwordWithSalt), bcrypt.DefaultCost)
if err != nil {
return "", err
}
return string(hashedPassword), nil
}
// VerifyPatientHashedPassword [患者端]验证密码
func VerifyPatientHashedPassword(hashedPassword, password string) bool {
salt := "8T&8p8euU=PP"
passwordWithSalt := password + salt
err := bcrypt.CompareHashAndPassword([]byte(hashedPassword+salt), []byte(passwordWithSalt))
return err == nil
}
// ToExcel 生成 Excel
func ToExcel(titleList []string, dataList []interface{}) []byte {
// 生成一个新的文件
file := xlsx.NewFile()
// 添加sheet页
sheet, _ := file.AddSheet("Sheet1")
// 插入表头
titleRow := sheet.AddRow()
for _, v := range titleList {
cell := titleRow.AddCell()
cell.Value = v
}
// 插入内容
for _, v := range dataList {
row := sheet.AddRow()
row.WriteStruct(v, -1)
}
var buffer bytes.Buffer
_ = file.Write(&buffer)
return buffer.Bytes()
}
func MD5(text string) string {
hash := md5.New()
hash.Write([]byte(text))
hashBytes := hash.Sum(nil)
return hex.EncodeToString(hashBytes)
}
// GetIP 尝试从 HTTP 请求中获取真实的客户端 IP 地址
func GetIP(r *http.Request) string {
// 从 X-Forwarded-For 头部获取IP地址
xForwardedFor := r.Header.Get("X-Forwarded-For")
if xForwardedFor != "" {
// 可能有多个IP地址通常第一个是客户端的真实IP
ips := strings.Split(xForwardedFor, ",")
if len(ips) > 0 {
return strings.TrimSpace(ips[0])
}
}
// 如果没有 X-Forwarded-For 头部,尝试从 X-Real-IP 获取
xRealIP := r.Header.Get("X-Real-IP")
if xRealIP != "" {
return strings.TrimSpace(xRealIP)
}
// 如果没有代理头部,最后退回到 RemoteAddr
ip, _, err := net.SplitHostPort(r.RemoteAddr)
if err != nil {
// 如果处理RemoteAddr出错返回空字符串
return ""
}
return ip
}
// FriendlyTimeAgo 友好时间
func FriendlyTimeAgo(date time.Time) string {
now := time.Now()
if date.After(now) {
return "未来的日期"
}
diff := now.Sub(date)
minutes := int(diff.Minutes())
hours := int(diff.Hours())
days := int(hours / 24)
// 小于1分钟
if minutes < 1 {
return "刚刚"
}
// 小于1小时
if hours < 1 {
return fmt.Sprintf("%d分钟", minutes)
}
// 小于1天
if hours < 24 {
return fmt.Sprintf("%d小时", hours)
}
// 小于1周
if days < 7 {
return fmt.Sprintf("%d天", days)
}
// 小于1个月
if days < 30 {
return fmt.Sprintf("%d周", days/7)
}
// 小于1年
if days < 365 {
months := int(days / 30)
if months < 1 {
return fmt.Sprintf("%d天", days)
}
return fmt.Sprintf("%d个月", months)
}
// 大于等于1年
years := days / 365
remainingDays := days % 365
months := remainingDays / 30
if months == 0 {
return fmt.Sprintf("%d年", years)
}
return fmt.Sprintf("%d年%d个月", years, months)
}
// FriendlySubTime 时间相减
func FriendlySubTime(birthday, date time.Time) string {
diff := date.Sub(birthday)
minutes := int(diff.Minutes())
hours := int(diff.Hours())
days := int(hours / 24)
// 小于1分钟
if minutes < 1 {
return "刚刚"
}
// 小于1小时
if hours < 1 {
return fmt.Sprintf("%d分钟", minutes)
}
// 小于1天
if hours < 24 {
return fmt.Sprintf("%d小时", hours)
}
// 小于1周
if days < 7 {
return fmt.Sprintf("%d天", days)
}
// 小于1个月
if days < 30 {
return fmt.Sprintf("%d周", days/7)
}
// 小于1年
if days < 365 {
months := int(days / 30)
if months < 1 {
return fmt.Sprintf("%d天", days)
}
return fmt.Sprintf("%d个月", months)
}
// 大于等于1年
years := days / 365
remainingDays := days % 365
months := remainingDays / 30
if months == 0 {
return fmt.Sprintf("%d岁", years)
}
return fmt.Sprintf("%d岁%d个月", years, months)
}
func XorEncrypt(phone, key string) string {
result := make([]byte, len(phone))
for i := 0; i < len(phone); i++ {
result[i] = phone[i] ^ key[i%len(key)]
}
return base64.StdEncoding.EncodeToString(result)
}
func XorDecrypt(encrypted, key string) (string, error) {
data, err := base64.StdEncoding.DecodeString(encrypted)
if err != nil {
return "", err
}
result := make([]byte, len(data))
for i := 0; i < len(data); i++ {
result[i] = data[i] ^ key[i%len(key)]
}
return string(result), nil
}

View File

@ -0,0 +1,30 @@
package utils
import (
"fmt"
"testing"
"time"
)
func TestGenerateAdminHashedPassword(t *testing.T) {
t.Log(MD5("admin2025"))
t.Log(GenerateAdminHashedPassword(MD5("admin2025")))
}
func TestGenerateDoctorHashedPassword(t *testing.T) {
t.Log(MD5("doctor2025"))
t.Log(GenerateDoctorHashedPassword(MD5("doctor2025")))
}
func TestGeneratePatientHashedPassword(t *testing.T) {
t.Log(MD5("patient2025"))
t.Log(GeneratePatientHashedPassword(MD5("patient2025")))
}
func TestXorEncrypt(t *testing.T) {
t.Log(XorEncrypt(fmt.Sprintf("%s%d", "13800000001", time.Now().Local().Unix()), "999999"))
}
func TestXorDecrypt(t *testing.T) {
t.Log(XorDecrypt("CAoBCQkJCQkJCQgIDgwKAQwKCg8B", "999999"))
}

View File

@ -0,0 +1,46 @@
package validation
import (
"fmt"
"mini-chat/configs"
"github.com/gin-gonic/gin/binding"
"github.com/go-playground/locales/en"
"github.com/go-playground/locales/zh"
ut "github.com/go-playground/universal-translator"
"github.com/go-playground/validator/v10"
enTranslation "github.com/go-playground/validator/v10/translations/en"
zhTranslation "github.com/go-playground/validator/v10/translations/zh"
)
var trans ut.Translator
func init() {
lang := configs.Get().Language.Local
if lang == configs.ZhCN {
trans, _ = ut.New(zh.New()).GetTranslator("zh")
if err := zhTranslation.RegisterDefaultTranslations(binding.Validator.Engine().(*validator.Validate), trans); err != nil {
fmt.Println("validator zh translation error", err)
}
}
if lang == configs.EnUS {
trans, _ = ut.New(en.New()).GetTranslator("en")
if err := enTranslation.RegisterDefaultTranslations(binding.Validator.Engine().(*validator.Validate), trans); err != nil {
fmt.Println("validator en translation error", err)
}
}
}
func Error(err error) (message string) {
if validationErrors, ok := err.(validator.ValidationErrors); !ok {
return err.Error()
} else {
for _, e := range validationErrors {
message += e.Translate(trans) + ";"
}
}
return message
}

View File

@ -0,0 +1,28 @@
package proposal
import (
"encoding/json"
)
// AlertMessage 告警信息
type AlertMessage struct {
ProjectName string `json:"project_name"` // 项目名称
Env string `json:"env"` // 运行环境
UID string `json:"uid"` // 用户标示
TraceID string `json:"trace_id"` // 当前请求的唯一ID
HOST string `json:"host"` // 当前请求的 HOST
URI string `json:"uri"` // 当前请求的 URI
Method string `json:"method"` // 当前请求的 Method
ErrorMessage interface{} `json:"error_message"` // 错误信息
ErrorStack string `json:"error_stack"` // 堆栈信息
Time string `json:"time"` // 发生时间
}
// Marshal 序列化到JSON
func (a *AlertMessage) Marshal() (jsonRaw []byte) {
jsonRaw, _ = json.Marshal(a)
return
}
// AlertHandler 告警处理的句柄
type AlertHandler func(msg *AlertMessage)

View File

@ -0,0 +1,25 @@
package proposal
import (
"encoding/json"
)
// MetricsMessage 指标信息
type MetricsMessage struct {
HOST string `json:"host"` // 请求 HOST
Path string `json:"path"` // 请求 Path
Method string `json:"method"` // 请求 Method
HTTPCode int `json:"http_code"` // HTTP 状态码
BusinessCode int `json:"business_code"` // 业务码
CostSeconds float64 `json:"cost_seconds"` // 耗时,单位:秒
IsSuccess bool `json:"is_success"` // 状态,是否成功
}
// Marshal 序列化到JSON
func (m *MetricsMessage) Marshal() (jsonRaw []byte) {
jsonRaw, _ = json.Marshal(m)
return
}
// RecordHandler 指标的记录句柄
type RecordHandler func(msg *MetricsMessage)

View File

@ -0,0 +1,28 @@
package proposal
import (
"encoding/json"
)
// RequestLoggerMessage 日志消息
type RequestLoggerMessage struct {
Tid string `json:"tid"` // 请求链路 ID
Username string `json:"username"` // 用户名
HOST string `json:"host"` // 请求 HOST
Path string `json:"path"` // 请求 Path
Method string `json:"method"` // 请求 Method
HTTPCode int `json:"http_code"` // HTTP 状态码
BusinessCode int `json:"business_code"` // 业务码
CostSeconds float64 `json:"cost_seconds"` // 耗时,单位:秒
IsSuccess bool `json:"is_success"` // 状态,是否成功
Content string `json:"content"` // 内容
}
// Marshal 序列化到JSON
func (m *RequestLoggerMessage) Marshal() (jsonRaw []byte) {
jsonRaw, _ = json.Marshal(m)
return
}
// RequestLoggerHandler 日志记录句柄
type RequestLoggerHandler func(msg *RequestLoggerMessage)

View File

@ -0,0 +1,19 @@
package proposal
import (
"encoding/json"
)
// SessionUserInfo 当前用户会话信息
type SessionUserInfo struct {
Id int32 `json:"id"` // ID
UserName string `json:"username"` // 用户名
NickName string `json:"nickname"` // 昵称
Platform string `json:"platform"` // 平台
}
// Marshal 序列化到JSON
func (user *SessionUserInfo) Marshal() (jsonRaw []byte) {
jsonRaw, _ = json.Marshal(user)
return
}

View File

@ -0,0 +1,368 @@
// 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 dao
import (
"context"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"mini-chat/internal/repository/mysql/model"
)
func newAdmin(db *gorm.DB, opts ...gen.DOOption) admin {
_admin := admin{}
_admin.adminDo.UseDB(db, opts...)
_admin.adminDo.UseModel(&model.Admin{})
tableName := _admin.adminDo.TableName()
_admin.ALL = field.NewAsterisk(tableName)
_admin.ID = field.NewInt32(tableName, "id")
_admin.Username = field.NewString(tableName, "username")
_admin.Nickname = field.NewString(tableName, "nickname")
_admin.Mobile = field.NewString(tableName, "mobile")
_admin.Password = field.NewString(tableName, "password")
_admin.LoginStatus = field.NewInt32(tableName, "login_status")
_admin.LastLoginTime = field.NewTime(tableName, "last_login_time")
_admin.LastLoginIP = field.NewString(tableName, "last_login_ip")
_admin.LastLoginHash = field.NewString(tableName, "last_login_hash")
_admin.CreatedUser = field.NewString(tableName, "created_user")
_admin.CreatedAt = field.NewTime(tableName, "created_at")
_admin.UpdatedUser = field.NewString(tableName, "updated_user")
_admin.UpdatedAt = field.NewTime(tableName, "updated_at")
_admin.fillFieldMap()
return _admin
}
// admin 管理员表
type admin struct {
adminDo
ALL field.Asterisk
ID field.Int32 // 主键
Username field.String // 用户名
Nickname field.String // 昵称
Mobile field.String // 手机号
Password field.String // 密码
LoginStatus field.Int32 // 登录状态(1:启用 0:禁用)
LastLoginTime field.Time // 最后一次登录时间
LastLoginIP field.String // 最后一次登录IP
LastLoginHash field.String // 最后一次登录 Hash
CreatedUser field.String // 创建人
CreatedAt field.Time // 创建时间
UpdatedUser field.String // 更新人
UpdatedAt field.Time // 更新时间
fieldMap map[string]field.Expr
}
func (a admin) Table(newTableName string) *admin {
a.adminDo.UseTable(newTableName)
return a.updateTableName(newTableName)
}
func (a admin) As(alias string) *admin {
a.adminDo.DO = *(a.adminDo.As(alias).(*gen.DO))
return a.updateTableName(alias)
}
func (a *admin) updateTableName(table string) *admin {
a.ALL = field.NewAsterisk(table)
a.ID = field.NewInt32(table, "id")
a.Username = field.NewString(table, "username")
a.Nickname = field.NewString(table, "nickname")
a.Mobile = field.NewString(table, "mobile")
a.Password = field.NewString(table, "password")
a.LoginStatus = field.NewInt32(table, "login_status")
a.LastLoginTime = field.NewTime(table, "last_login_time")
a.LastLoginIP = field.NewString(table, "last_login_ip")
a.LastLoginHash = field.NewString(table, "last_login_hash")
a.CreatedUser = field.NewString(table, "created_user")
a.CreatedAt = field.NewTime(table, "created_at")
a.UpdatedUser = field.NewString(table, "updated_user")
a.UpdatedAt = field.NewTime(table, "updated_at")
a.fillFieldMap()
return a
}
func (a *admin) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := a.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (a *admin) fillFieldMap() {
a.fieldMap = make(map[string]field.Expr, 13)
a.fieldMap["id"] = a.ID
a.fieldMap["username"] = a.Username
a.fieldMap["nickname"] = a.Nickname
a.fieldMap["mobile"] = a.Mobile
a.fieldMap["password"] = a.Password
a.fieldMap["login_status"] = a.LoginStatus
a.fieldMap["last_login_time"] = a.LastLoginTime
a.fieldMap["last_login_ip"] = a.LastLoginIP
a.fieldMap["last_login_hash"] = a.LastLoginHash
a.fieldMap["created_user"] = a.CreatedUser
a.fieldMap["created_at"] = a.CreatedAt
a.fieldMap["updated_user"] = a.UpdatedUser
a.fieldMap["updated_at"] = a.UpdatedAt
}
func (a admin) clone(db *gorm.DB) admin {
a.adminDo.ReplaceConnPool(db.Statement.ConnPool)
return a
}
func (a admin) replaceDB(db *gorm.DB) admin {
a.adminDo.ReplaceDB(db)
return a
}
type adminDo struct{ gen.DO }
func (a adminDo) Debug() *adminDo {
return a.withDO(a.DO.Debug())
}
func (a adminDo) WithContext(ctx context.Context) *adminDo {
return a.withDO(a.DO.WithContext(ctx))
}
func (a adminDo) ReadDB() *adminDo {
return a.Clauses(dbresolver.Read)
}
func (a adminDo) WriteDB() *adminDo {
return a.Clauses(dbresolver.Write)
}
func (a adminDo) Session(config *gorm.Session) *adminDo {
return a.withDO(a.DO.Session(config))
}
func (a adminDo) Clauses(conds ...clause.Expression) *adminDo {
return a.withDO(a.DO.Clauses(conds...))
}
func (a adminDo) Returning(value interface{}, columns ...string) *adminDo {
return a.withDO(a.DO.Returning(value, columns...))
}
func (a adminDo) Not(conds ...gen.Condition) *adminDo {
return a.withDO(a.DO.Not(conds...))
}
func (a adminDo) Or(conds ...gen.Condition) *adminDo {
return a.withDO(a.DO.Or(conds...))
}
func (a adminDo) Select(conds ...field.Expr) *adminDo {
return a.withDO(a.DO.Select(conds...))
}
func (a adminDo) Where(conds ...gen.Condition) *adminDo {
return a.withDO(a.DO.Where(conds...))
}
func (a adminDo) Order(conds ...field.Expr) *adminDo {
return a.withDO(a.DO.Order(conds...))
}
func (a adminDo) Distinct(cols ...field.Expr) *adminDo {
return a.withDO(a.DO.Distinct(cols...))
}
func (a adminDo) Omit(cols ...field.Expr) *adminDo {
return a.withDO(a.DO.Omit(cols...))
}
func (a adminDo) Join(table schema.Tabler, on ...field.Expr) *adminDo {
return a.withDO(a.DO.Join(table, on...))
}
func (a adminDo) LeftJoin(table schema.Tabler, on ...field.Expr) *adminDo {
return a.withDO(a.DO.LeftJoin(table, on...))
}
func (a adminDo) RightJoin(table schema.Tabler, on ...field.Expr) *adminDo {
return a.withDO(a.DO.RightJoin(table, on...))
}
func (a adminDo) Group(cols ...field.Expr) *adminDo {
return a.withDO(a.DO.Group(cols...))
}
func (a adminDo) Having(conds ...gen.Condition) *adminDo {
return a.withDO(a.DO.Having(conds...))
}
func (a adminDo) Limit(limit int) *adminDo {
return a.withDO(a.DO.Limit(limit))
}
func (a adminDo) Offset(offset int) *adminDo {
return a.withDO(a.DO.Offset(offset))
}
func (a adminDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *adminDo {
return a.withDO(a.DO.Scopes(funcs...))
}
func (a adminDo) Unscoped() *adminDo {
return a.withDO(a.DO.Unscoped())
}
func (a adminDo) Create(values ...*model.Admin) error {
if len(values) == 0 {
return nil
}
return a.DO.Create(values)
}
func (a adminDo) CreateInBatches(values []*model.Admin, batchSize int) error {
return a.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (a adminDo) Save(values ...*model.Admin) error {
if len(values) == 0 {
return nil
}
return a.DO.Save(values)
}
func (a adminDo) First() (*model.Admin, error) {
if result, err := a.DO.First(); err != nil {
return nil, err
} else {
return result.(*model.Admin), nil
}
}
func (a adminDo) Take() (*model.Admin, error) {
if result, err := a.DO.Take(); err != nil {
return nil, err
} else {
return result.(*model.Admin), nil
}
}
func (a adminDo) Last() (*model.Admin, error) {
if result, err := a.DO.Last(); err != nil {
return nil, err
} else {
return result.(*model.Admin), nil
}
}
func (a adminDo) Find() ([]*model.Admin, error) {
result, err := a.DO.Find()
return result.([]*model.Admin), err
}
func (a adminDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.Admin, err error) {
buf := make([]*model.Admin, 0, batchSize)
err = a.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (a adminDo) FindInBatches(result *[]*model.Admin, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return a.DO.FindInBatches(result, batchSize, fc)
}
func (a adminDo) Attrs(attrs ...field.AssignExpr) *adminDo {
return a.withDO(a.DO.Attrs(attrs...))
}
func (a adminDo) Assign(attrs ...field.AssignExpr) *adminDo {
return a.withDO(a.DO.Assign(attrs...))
}
func (a adminDo) Joins(fields ...field.RelationField) *adminDo {
for _, _f := range fields {
a = *a.withDO(a.DO.Joins(_f))
}
return &a
}
func (a adminDo) Preload(fields ...field.RelationField) *adminDo {
for _, _f := range fields {
a = *a.withDO(a.DO.Preload(_f))
}
return &a
}
func (a adminDo) FirstOrInit() (*model.Admin, error) {
if result, err := a.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*model.Admin), nil
}
}
func (a adminDo) FirstOrCreate() (*model.Admin, error) {
if result, err := a.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*model.Admin), nil
}
}
func (a adminDo) FindByPage(offset int, limit int) (result []*model.Admin, count int64, err error) {
result, err = a.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = a.Offset(-1).Limit(-1).Count()
return
}
func (a adminDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = a.Count()
if err != nil {
return
}
err = a.Offset(offset).Limit(limit).Scan(result)
return
}
func (a adminDo) Scan(result interface{}) (err error) {
return a.DO.Scan(result)
}
func (a adminDo) Delete(models ...*model.Admin) (result gen.ResultInfo, err error) {
return a.DO.Delete(models)
}
func (a *adminDo) withDO(do gen.Dao) *adminDo {
a.DO = *do.(*gen.DO)
return a
}

View File

@ -0,0 +1,344 @@
// 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 dao
import (
"context"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"mini-chat/internal/repository/mysql/model"
)
func newAppKeyword(db *gorm.DB, opts ...gen.DOOption) appKeyword {
_appKeyword := appKeyword{}
_appKeyword.appKeywordDo.UseDB(db, opts...)
_appKeyword.appKeywordDo.UseModel(&model.AppKeyword{})
tableName := _appKeyword.appKeywordDo.TableName()
_appKeyword.ALL = field.NewAsterisk(tableName)
_appKeyword.ID = field.NewInt32(tableName, "id")
_appKeyword.AppID = field.NewString(tableName, "app_id")
_appKeyword.Keyword = field.NewString(tableName, "keyword")
_appKeyword.CreatedUser = field.NewString(tableName, "created_user")
_appKeyword.CreatedAt = field.NewTime(tableName, "created_at")
_appKeyword.UpdatedUser = field.NewString(tableName, "updated_user")
_appKeyword.UpdatedAt = field.NewTime(tableName, "updated_at")
_appKeyword.fillFieldMap()
return _appKeyword
}
// appKeyword 关键字表
type appKeyword struct {
appKeywordDo
ALL field.Asterisk
ID field.Int32 // 主键ID
AppID field.String // 小程序ID
Keyword field.String // 关键字
CreatedUser field.String // 创建人
CreatedAt field.Time // 创建时间
UpdatedUser field.String // 更新人
UpdatedAt field.Time // 更新时间
fieldMap map[string]field.Expr
}
func (a appKeyword) Table(newTableName string) *appKeyword {
a.appKeywordDo.UseTable(newTableName)
return a.updateTableName(newTableName)
}
func (a appKeyword) As(alias string) *appKeyword {
a.appKeywordDo.DO = *(a.appKeywordDo.As(alias).(*gen.DO))
return a.updateTableName(alias)
}
func (a *appKeyword) updateTableName(table string) *appKeyword {
a.ALL = field.NewAsterisk(table)
a.ID = field.NewInt32(table, "id")
a.AppID = field.NewString(table, "app_id")
a.Keyword = field.NewString(table, "keyword")
a.CreatedUser = field.NewString(table, "created_user")
a.CreatedAt = field.NewTime(table, "created_at")
a.UpdatedUser = field.NewString(table, "updated_user")
a.UpdatedAt = field.NewTime(table, "updated_at")
a.fillFieldMap()
return a
}
func (a *appKeyword) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := a.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (a *appKeyword) fillFieldMap() {
a.fieldMap = make(map[string]field.Expr, 7)
a.fieldMap["id"] = a.ID
a.fieldMap["app_id"] = a.AppID
a.fieldMap["keyword"] = a.Keyword
a.fieldMap["created_user"] = a.CreatedUser
a.fieldMap["created_at"] = a.CreatedAt
a.fieldMap["updated_user"] = a.UpdatedUser
a.fieldMap["updated_at"] = a.UpdatedAt
}
func (a appKeyword) clone(db *gorm.DB) appKeyword {
a.appKeywordDo.ReplaceConnPool(db.Statement.ConnPool)
return a
}
func (a appKeyword) replaceDB(db *gorm.DB) appKeyword {
a.appKeywordDo.ReplaceDB(db)
return a
}
type appKeywordDo struct{ gen.DO }
func (a appKeywordDo) Debug() *appKeywordDo {
return a.withDO(a.DO.Debug())
}
func (a appKeywordDo) WithContext(ctx context.Context) *appKeywordDo {
return a.withDO(a.DO.WithContext(ctx))
}
func (a appKeywordDo) ReadDB() *appKeywordDo {
return a.Clauses(dbresolver.Read)
}
func (a appKeywordDo) WriteDB() *appKeywordDo {
return a.Clauses(dbresolver.Write)
}
func (a appKeywordDo) Session(config *gorm.Session) *appKeywordDo {
return a.withDO(a.DO.Session(config))
}
func (a appKeywordDo) Clauses(conds ...clause.Expression) *appKeywordDo {
return a.withDO(a.DO.Clauses(conds...))
}
func (a appKeywordDo) Returning(value interface{}, columns ...string) *appKeywordDo {
return a.withDO(a.DO.Returning(value, columns...))
}
func (a appKeywordDo) Not(conds ...gen.Condition) *appKeywordDo {
return a.withDO(a.DO.Not(conds...))
}
func (a appKeywordDo) Or(conds ...gen.Condition) *appKeywordDo {
return a.withDO(a.DO.Or(conds...))
}
func (a appKeywordDo) Select(conds ...field.Expr) *appKeywordDo {
return a.withDO(a.DO.Select(conds...))
}
func (a appKeywordDo) Where(conds ...gen.Condition) *appKeywordDo {
return a.withDO(a.DO.Where(conds...))
}
func (a appKeywordDo) Order(conds ...field.Expr) *appKeywordDo {
return a.withDO(a.DO.Order(conds...))
}
func (a appKeywordDo) Distinct(cols ...field.Expr) *appKeywordDo {
return a.withDO(a.DO.Distinct(cols...))
}
func (a appKeywordDo) Omit(cols ...field.Expr) *appKeywordDo {
return a.withDO(a.DO.Omit(cols...))
}
func (a appKeywordDo) Join(table schema.Tabler, on ...field.Expr) *appKeywordDo {
return a.withDO(a.DO.Join(table, on...))
}
func (a appKeywordDo) LeftJoin(table schema.Tabler, on ...field.Expr) *appKeywordDo {
return a.withDO(a.DO.LeftJoin(table, on...))
}
func (a appKeywordDo) RightJoin(table schema.Tabler, on ...field.Expr) *appKeywordDo {
return a.withDO(a.DO.RightJoin(table, on...))
}
func (a appKeywordDo) Group(cols ...field.Expr) *appKeywordDo {
return a.withDO(a.DO.Group(cols...))
}
func (a appKeywordDo) Having(conds ...gen.Condition) *appKeywordDo {
return a.withDO(a.DO.Having(conds...))
}
func (a appKeywordDo) Limit(limit int) *appKeywordDo {
return a.withDO(a.DO.Limit(limit))
}
func (a appKeywordDo) Offset(offset int) *appKeywordDo {
return a.withDO(a.DO.Offset(offset))
}
func (a appKeywordDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *appKeywordDo {
return a.withDO(a.DO.Scopes(funcs...))
}
func (a appKeywordDo) Unscoped() *appKeywordDo {
return a.withDO(a.DO.Unscoped())
}
func (a appKeywordDo) Create(values ...*model.AppKeyword) error {
if len(values) == 0 {
return nil
}
return a.DO.Create(values)
}
func (a appKeywordDo) CreateInBatches(values []*model.AppKeyword, batchSize int) error {
return a.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (a appKeywordDo) Save(values ...*model.AppKeyword) error {
if len(values) == 0 {
return nil
}
return a.DO.Save(values)
}
func (a appKeywordDo) First() (*model.AppKeyword, error) {
if result, err := a.DO.First(); err != nil {
return nil, err
} else {
return result.(*model.AppKeyword), nil
}
}
func (a appKeywordDo) Take() (*model.AppKeyword, error) {
if result, err := a.DO.Take(); err != nil {
return nil, err
} else {
return result.(*model.AppKeyword), nil
}
}
func (a appKeywordDo) Last() (*model.AppKeyword, error) {
if result, err := a.DO.Last(); err != nil {
return nil, err
} else {
return result.(*model.AppKeyword), nil
}
}
func (a appKeywordDo) Find() ([]*model.AppKeyword, error) {
result, err := a.DO.Find()
return result.([]*model.AppKeyword), err
}
func (a appKeywordDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.AppKeyword, err error) {
buf := make([]*model.AppKeyword, 0, batchSize)
err = a.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (a appKeywordDo) FindInBatches(result *[]*model.AppKeyword, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return a.DO.FindInBatches(result, batchSize, fc)
}
func (a appKeywordDo) Attrs(attrs ...field.AssignExpr) *appKeywordDo {
return a.withDO(a.DO.Attrs(attrs...))
}
func (a appKeywordDo) Assign(attrs ...field.AssignExpr) *appKeywordDo {
return a.withDO(a.DO.Assign(attrs...))
}
func (a appKeywordDo) Joins(fields ...field.RelationField) *appKeywordDo {
for _, _f := range fields {
a = *a.withDO(a.DO.Joins(_f))
}
return &a
}
func (a appKeywordDo) Preload(fields ...field.RelationField) *appKeywordDo {
for _, _f := range fields {
a = *a.withDO(a.DO.Preload(_f))
}
return &a
}
func (a appKeywordDo) FirstOrInit() (*model.AppKeyword, error) {
if result, err := a.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*model.AppKeyword), nil
}
}
func (a appKeywordDo) FirstOrCreate() (*model.AppKeyword, error) {
if result, err := a.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*model.AppKeyword), nil
}
}
func (a appKeywordDo) FindByPage(offset int, limit int) (result []*model.AppKeyword, count int64, err error) {
result, err = a.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = a.Offset(-1).Limit(-1).Count()
return
}
func (a appKeywordDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = a.Count()
if err != nil {
return
}
err = a.Offset(offset).Limit(limit).Scan(result)
return
}
func (a appKeywordDo) Scan(result interface{}) (err error) {
return a.DO.Scan(result)
}
func (a appKeywordDo) Delete(models ...*model.AppKeyword) (result gen.ResultInfo, err error) {
return a.DO.Delete(models)
}
func (a *appKeywordDo) withDO(do gen.Dao) *appKeywordDo {
a.DO = *do.(*gen.DO)
return a
}

View File

@ -0,0 +1,356 @@
// 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 dao
import (
"context"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"mini-chat/internal/repository/mysql/model"
)
func newAppKeywordReply(db *gorm.DB, opts ...gen.DOOption) appKeywordReply {
_appKeywordReply := appKeywordReply{}
_appKeywordReply.appKeywordReplyDo.UseDB(db, opts...)
_appKeywordReply.appKeywordReplyDo.UseModel(&model.AppKeywordReply{})
tableName := _appKeywordReply.appKeywordReplyDo.TableName()
_appKeywordReply.ALL = field.NewAsterisk(tableName)
_appKeywordReply.ID = field.NewInt32(tableName, "id")
_appKeywordReply.AppID = field.NewString(tableName, "app_id")
_appKeywordReply.KeywordID = field.NewInt32(tableName, "keyword_id")
_appKeywordReply.IntervalSeconds = field.NewInt32(tableName, "interval_seconds")
_appKeywordReply.Type = field.NewInt32(tableName, "type")
_appKeywordReply.Content = field.NewString(tableName, "content")
_appKeywordReply.CreatedUser = field.NewString(tableName, "created_user")
_appKeywordReply.CreatedAt = field.NewTime(tableName, "created_at")
_appKeywordReply.UpdatedUser = field.NewString(tableName, "updated_user")
_appKeywordReply.UpdatedAt = field.NewTime(tableName, "updated_at")
_appKeywordReply.fillFieldMap()
return _appKeywordReply
}
// appKeywordReply 关键字回复表
type appKeywordReply struct {
appKeywordReplyDo
ALL field.Asterisk
ID field.Int32 // 主键ID
AppID field.String // 小程序ID
KeywordID field.Int32 // 关联 app_keyword 表的ID
IntervalSeconds field.Int32 // 时间间隔,单位为秒
Type field.Int32 // 类型(1:文本 2:图片 3:语音条 4:视频 5=小程序 6=地理位置 7=链接 8=GIF图 9=名片 10=文件 11=转人工)
Content field.String // 内容
CreatedUser field.String // 创建人
CreatedAt field.Time // 创建时间
UpdatedUser field.String // 更新人
UpdatedAt field.Time // 更新时间
fieldMap map[string]field.Expr
}
func (a appKeywordReply) Table(newTableName string) *appKeywordReply {
a.appKeywordReplyDo.UseTable(newTableName)
return a.updateTableName(newTableName)
}
func (a appKeywordReply) As(alias string) *appKeywordReply {
a.appKeywordReplyDo.DO = *(a.appKeywordReplyDo.As(alias).(*gen.DO))
return a.updateTableName(alias)
}
func (a *appKeywordReply) updateTableName(table string) *appKeywordReply {
a.ALL = field.NewAsterisk(table)
a.ID = field.NewInt32(table, "id")
a.AppID = field.NewString(table, "app_id")
a.KeywordID = field.NewInt32(table, "keyword_id")
a.IntervalSeconds = field.NewInt32(table, "interval_seconds")
a.Type = field.NewInt32(table, "type")
a.Content = field.NewString(table, "content")
a.CreatedUser = field.NewString(table, "created_user")
a.CreatedAt = field.NewTime(table, "created_at")
a.UpdatedUser = field.NewString(table, "updated_user")
a.UpdatedAt = field.NewTime(table, "updated_at")
a.fillFieldMap()
return a
}
func (a *appKeywordReply) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := a.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (a *appKeywordReply) fillFieldMap() {
a.fieldMap = make(map[string]field.Expr, 10)
a.fieldMap["id"] = a.ID
a.fieldMap["app_id"] = a.AppID
a.fieldMap["keyword_id"] = a.KeywordID
a.fieldMap["interval_seconds"] = a.IntervalSeconds
a.fieldMap["type"] = a.Type
a.fieldMap["content"] = a.Content
a.fieldMap["created_user"] = a.CreatedUser
a.fieldMap["created_at"] = a.CreatedAt
a.fieldMap["updated_user"] = a.UpdatedUser
a.fieldMap["updated_at"] = a.UpdatedAt
}
func (a appKeywordReply) clone(db *gorm.DB) appKeywordReply {
a.appKeywordReplyDo.ReplaceConnPool(db.Statement.ConnPool)
return a
}
func (a appKeywordReply) replaceDB(db *gorm.DB) appKeywordReply {
a.appKeywordReplyDo.ReplaceDB(db)
return a
}
type appKeywordReplyDo struct{ gen.DO }
func (a appKeywordReplyDo) Debug() *appKeywordReplyDo {
return a.withDO(a.DO.Debug())
}
func (a appKeywordReplyDo) WithContext(ctx context.Context) *appKeywordReplyDo {
return a.withDO(a.DO.WithContext(ctx))
}
func (a appKeywordReplyDo) ReadDB() *appKeywordReplyDo {
return a.Clauses(dbresolver.Read)
}
func (a appKeywordReplyDo) WriteDB() *appKeywordReplyDo {
return a.Clauses(dbresolver.Write)
}
func (a appKeywordReplyDo) Session(config *gorm.Session) *appKeywordReplyDo {
return a.withDO(a.DO.Session(config))
}
func (a appKeywordReplyDo) Clauses(conds ...clause.Expression) *appKeywordReplyDo {
return a.withDO(a.DO.Clauses(conds...))
}
func (a appKeywordReplyDo) Returning(value interface{}, columns ...string) *appKeywordReplyDo {
return a.withDO(a.DO.Returning(value, columns...))
}
func (a appKeywordReplyDo) Not(conds ...gen.Condition) *appKeywordReplyDo {
return a.withDO(a.DO.Not(conds...))
}
func (a appKeywordReplyDo) Or(conds ...gen.Condition) *appKeywordReplyDo {
return a.withDO(a.DO.Or(conds...))
}
func (a appKeywordReplyDo) Select(conds ...field.Expr) *appKeywordReplyDo {
return a.withDO(a.DO.Select(conds...))
}
func (a appKeywordReplyDo) Where(conds ...gen.Condition) *appKeywordReplyDo {
return a.withDO(a.DO.Where(conds...))
}
func (a appKeywordReplyDo) Order(conds ...field.Expr) *appKeywordReplyDo {
return a.withDO(a.DO.Order(conds...))
}
func (a appKeywordReplyDo) Distinct(cols ...field.Expr) *appKeywordReplyDo {
return a.withDO(a.DO.Distinct(cols...))
}
func (a appKeywordReplyDo) Omit(cols ...field.Expr) *appKeywordReplyDo {
return a.withDO(a.DO.Omit(cols...))
}
func (a appKeywordReplyDo) Join(table schema.Tabler, on ...field.Expr) *appKeywordReplyDo {
return a.withDO(a.DO.Join(table, on...))
}
func (a appKeywordReplyDo) LeftJoin(table schema.Tabler, on ...field.Expr) *appKeywordReplyDo {
return a.withDO(a.DO.LeftJoin(table, on...))
}
func (a appKeywordReplyDo) RightJoin(table schema.Tabler, on ...field.Expr) *appKeywordReplyDo {
return a.withDO(a.DO.RightJoin(table, on...))
}
func (a appKeywordReplyDo) Group(cols ...field.Expr) *appKeywordReplyDo {
return a.withDO(a.DO.Group(cols...))
}
func (a appKeywordReplyDo) Having(conds ...gen.Condition) *appKeywordReplyDo {
return a.withDO(a.DO.Having(conds...))
}
func (a appKeywordReplyDo) Limit(limit int) *appKeywordReplyDo {
return a.withDO(a.DO.Limit(limit))
}
func (a appKeywordReplyDo) Offset(offset int) *appKeywordReplyDo {
return a.withDO(a.DO.Offset(offset))
}
func (a appKeywordReplyDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *appKeywordReplyDo {
return a.withDO(a.DO.Scopes(funcs...))
}
func (a appKeywordReplyDo) Unscoped() *appKeywordReplyDo {
return a.withDO(a.DO.Unscoped())
}
func (a appKeywordReplyDo) Create(values ...*model.AppKeywordReply) error {
if len(values) == 0 {
return nil
}
return a.DO.Create(values)
}
func (a appKeywordReplyDo) CreateInBatches(values []*model.AppKeywordReply, batchSize int) error {
return a.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (a appKeywordReplyDo) Save(values ...*model.AppKeywordReply) error {
if len(values) == 0 {
return nil
}
return a.DO.Save(values)
}
func (a appKeywordReplyDo) First() (*model.AppKeywordReply, error) {
if result, err := a.DO.First(); err != nil {
return nil, err
} else {
return result.(*model.AppKeywordReply), nil
}
}
func (a appKeywordReplyDo) Take() (*model.AppKeywordReply, error) {
if result, err := a.DO.Take(); err != nil {
return nil, err
} else {
return result.(*model.AppKeywordReply), nil
}
}
func (a appKeywordReplyDo) Last() (*model.AppKeywordReply, error) {
if result, err := a.DO.Last(); err != nil {
return nil, err
} else {
return result.(*model.AppKeywordReply), nil
}
}
func (a appKeywordReplyDo) Find() ([]*model.AppKeywordReply, error) {
result, err := a.DO.Find()
return result.([]*model.AppKeywordReply), err
}
func (a appKeywordReplyDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.AppKeywordReply, err error) {
buf := make([]*model.AppKeywordReply, 0, batchSize)
err = a.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (a appKeywordReplyDo) FindInBatches(result *[]*model.AppKeywordReply, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return a.DO.FindInBatches(result, batchSize, fc)
}
func (a appKeywordReplyDo) Attrs(attrs ...field.AssignExpr) *appKeywordReplyDo {
return a.withDO(a.DO.Attrs(attrs...))
}
func (a appKeywordReplyDo) Assign(attrs ...field.AssignExpr) *appKeywordReplyDo {
return a.withDO(a.DO.Assign(attrs...))
}
func (a appKeywordReplyDo) Joins(fields ...field.RelationField) *appKeywordReplyDo {
for _, _f := range fields {
a = *a.withDO(a.DO.Joins(_f))
}
return &a
}
func (a appKeywordReplyDo) Preload(fields ...field.RelationField) *appKeywordReplyDo {
for _, _f := range fields {
a = *a.withDO(a.DO.Preload(_f))
}
return &a
}
func (a appKeywordReplyDo) FirstOrInit() (*model.AppKeywordReply, error) {
if result, err := a.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*model.AppKeywordReply), nil
}
}
func (a appKeywordReplyDo) FirstOrCreate() (*model.AppKeywordReply, error) {
if result, err := a.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*model.AppKeywordReply), nil
}
}
func (a appKeywordReplyDo) FindByPage(offset int, limit int) (result []*model.AppKeywordReply, count int64, err error) {
result, err = a.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = a.Offset(-1).Limit(-1).Count()
return
}
func (a appKeywordReplyDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = a.Count()
if err != nil {
return
}
err = a.Offset(offset).Limit(limit).Scan(result)
return
}
func (a appKeywordReplyDo) Scan(result interface{}) (err error) {
return a.DO.Scan(result)
}
func (a appKeywordReplyDo) Delete(models ...*model.AppKeywordReply) (result gen.ResultInfo, err error) {
return a.DO.Delete(models)
}
func (a *appKeywordReplyDo) withDO(do gen.Dao) *appKeywordReplyDo {
a.DO = *do.(*gen.DO)
return a
}

View File

@ -0,0 +1,352 @@
// 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 dao
import (
"context"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"mini-chat/internal/repository/mysql/model"
)
func newAppMessageLog(db *gorm.DB, opts ...gen.DOOption) appMessageLog {
_appMessageLog := appMessageLog{}
_appMessageLog.appMessageLogDo.UseDB(db, opts...)
_appMessageLog.appMessageLogDo.UseModel(&model.AppMessageLog{})
tableName := _appMessageLog.appMessageLogDo.TableName()
_appMessageLog.ALL = field.NewAsterisk(tableName)
_appMessageLog.ID = field.NewInt32(tableName, "id")
_appMessageLog.AppID = field.NewString(tableName, "app_id")
_appMessageLog.SenderID = field.NewString(tableName, "sender_id")
_appMessageLog.SenderName = field.NewString(tableName, "sender_name")
_appMessageLog.SendTime = field.NewTime(tableName, "send_time")
_appMessageLog.ReceiverID = field.NewString(tableName, "receiver_id")
_appMessageLog.MsgType = field.NewInt32(tableName, "msg_type")
_appMessageLog.Content = field.NewString(tableName, "content")
_appMessageLog.CreatedAt = field.NewTime(tableName, "created_at")
_appMessageLog.fillFieldMap()
return _appMessageLog
}
// appMessageLog 消息日志表
type appMessageLog struct {
appMessageLogDo
ALL field.Asterisk
ID field.Int32 // 主键ID
AppID field.String // 小程序ID
SenderID field.String // 发送人ID
SenderName field.String // 发送人昵称
SendTime field.Time // 发送时间
ReceiverID field.String // 接收人ID
MsgType field.Int32 // 信息类型
Content field.String // 内容
CreatedAt field.Time // 创建时间
fieldMap map[string]field.Expr
}
func (a appMessageLog) Table(newTableName string) *appMessageLog {
a.appMessageLogDo.UseTable(newTableName)
return a.updateTableName(newTableName)
}
func (a appMessageLog) As(alias string) *appMessageLog {
a.appMessageLogDo.DO = *(a.appMessageLogDo.As(alias).(*gen.DO))
return a.updateTableName(alias)
}
func (a *appMessageLog) updateTableName(table string) *appMessageLog {
a.ALL = field.NewAsterisk(table)
a.ID = field.NewInt32(table, "id")
a.AppID = field.NewString(table, "app_id")
a.SenderID = field.NewString(table, "sender_id")
a.SenderName = field.NewString(table, "sender_name")
a.SendTime = field.NewTime(table, "send_time")
a.ReceiverID = field.NewString(table, "receiver_id")
a.MsgType = field.NewInt32(table, "msg_type")
a.Content = field.NewString(table, "content")
a.CreatedAt = field.NewTime(table, "created_at")
a.fillFieldMap()
return a
}
func (a *appMessageLog) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := a.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (a *appMessageLog) fillFieldMap() {
a.fieldMap = make(map[string]field.Expr, 9)
a.fieldMap["id"] = a.ID
a.fieldMap["app_id"] = a.AppID
a.fieldMap["sender_id"] = a.SenderID
a.fieldMap["sender_name"] = a.SenderName
a.fieldMap["send_time"] = a.SendTime
a.fieldMap["receiver_id"] = a.ReceiverID
a.fieldMap["msg_type"] = a.MsgType
a.fieldMap["content"] = a.Content
a.fieldMap["created_at"] = a.CreatedAt
}
func (a appMessageLog) clone(db *gorm.DB) appMessageLog {
a.appMessageLogDo.ReplaceConnPool(db.Statement.ConnPool)
return a
}
func (a appMessageLog) replaceDB(db *gorm.DB) appMessageLog {
a.appMessageLogDo.ReplaceDB(db)
return a
}
type appMessageLogDo struct{ gen.DO }
func (a appMessageLogDo) Debug() *appMessageLogDo {
return a.withDO(a.DO.Debug())
}
func (a appMessageLogDo) WithContext(ctx context.Context) *appMessageLogDo {
return a.withDO(a.DO.WithContext(ctx))
}
func (a appMessageLogDo) ReadDB() *appMessageLogDo {
return a.Clauses(dbresolver.Read)
}
func (a appMessageLogDo) WriteDB() *appMessageLogDo {
return a.Clauses(dbresolver.Write)
}
func (a appMessageLogDo) Session(config *gorm.Session) *appMessageLogDo {
return a.withDO(a.DO.Session(config))
}
func (a appMessageLogDo) Clauses(conds ...clause.Expression) *appMessageLogDo {
return a.withDO(a.DO.Clauses(conds...))
}
func (a appMessageLogDo) Returning(value interface{}, columns ...string) *appMessageLogDo {
return a.withDO(a.DO.Returning(value, columns...))
}
func (a appMessageLogDo) Not(conds ...gen.Condition) *appMessageLogDo {
return a.withDO(a.DO.Not(conds...))
}
func (a appMessageLogDo) Or(conds ...gen.Condition) *appMessageLogDo {
return a.withDO(a.DO.Or(conds...))
}
func (a appMessageLogDo) Select(conds ...field.Expr) *appMessageLogDo {
return a.withDO(a.DO.Select(conds...))
}
func (a appMessageLogDo) Where(conds ...gen.Condition) *appMessageLogDo {
return a.withDO(a.DO.Where(conds...))
}
func (a appMessageLogDo) Order(conds ...field.Expr) *appMessageLogDo {
return a.withDO(a.DO.Order(conds...))
}
func (a appMessageLogDo) Distinct(cols ...field.Expr) *appMessageLogDo {
return a.withDO(a.DO.Distinct(cols...))
}
func (a appMessageLogDo) Omit(cols ...field.Expr) *appMessageLogDo {
return a.withDO(a.DO.Omit(cols...))
}
func (a appMessageLogDo) Join(table schema.Tabler, on ...field.Expr) *appMessageLogDo {
return a.withDO(a.DO.Join(table, on...))
}
func (a appMessageLogDo) LeftJoin(table schema.Tabler, on ...field.Expr) *appMessageLogDo {
return a.withDO(a.DO.LeftJoin(table, on...))
}
func (a appMessageLogDo) RightJoin(table schema.Tabler, on ...field.Expr) *appMessageLogDo {
return a.withDO(a.DO.RightJoin(table, on...))
}
func (a appMessageLogDo) Group(cols ...field.Expr) *appMessageLogDo {
return a.withDO(a.DO.Group(cols...))
}
func (a appMessageLogDo) Having(conds ...gen.Condition) *appMessageLogDo {
return a.withDO(a.DO.Having(conds...))
}
func (a appMessageLogDo) Limit(limit int) *appMessageLogDo {
return a.withDO(a.DO.Limit(limit))
}
func (a appMessageLogDo) Offset(offset int) *appMessageLogDo {
return a.withDO(a.DO.Offset(offset))
}
func (a appMessageLogDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *appMessageLogDo {
return a.withDO(a.DO.Scopes(funcs...))
}
func (a appMessageLogDo) Unscoped() *appMessageLogDo {
return a.withDO(a.DO.Unscoped())
}
func (a appMessageLogDo) Create(values ...*model.AppMessageLog) error {
if len(values) == 0 {
return nil
}
return a.DO.Create(values)
}
func (a appMessageLogDo) CreateInBatches(values []*model.AppMessageLog, batchSize int) error {
return a.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (a appMessageLogDo) Save(values ...*model.AppMessageLog) error {
if len(values) == 0 {
return nil
}
return a.DO.Save(values)
}
func (a appMessageLogDo) First() (*model.AppMessageLog, error) {
if result, err := a.DO.First(); err != nil {
return nil, err
} else {
return result.(*model.AppMessageLog), nil
}
}
func (a appMessageLogDo) Take() (*model.AppMessageLog, error) {
if result, err := a.DO.Take(); err != nil {
return nil, err
} else {
return result.(*model.AppMessageLog), nil
}
}
func (a appMessageLogDo) Last() (*model.AppMessageLog, error) {
if result, err := a.DO.Last(); err != nil {
return nil, err
} else {
return result.(*model.AppMessageLog), nil
}
}
func (a appMessageLogDo) Find() ([]*model.AppMessageLog, error) {
result, err := a.DO.Find()
return result.([]*model.AppMessageLog), err
}
func (a appMessageLogDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.AppMessageLog, err error) {
buf := make([]*model.AppMessageLog, 0, batchSize)
err = a.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (a appMessageLogDo) FindInBatches(result *[]*model.AppMessageLog, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return a.DO.FindInBatches(result, batchSize, fc)
}
func (a appMessageLogDo) Attrs(attrs ...field.AssignExpr) *appMessageLogDo {
return a.withDO(a.DO.Attrs(attrs...))
}
func (a appMessageLogDo) Assign(attrs ...field.AssignExpr) *appMessageLogDo {
return a.withDO(a.DO.Assign(attrs...))
}
func (a appMessageLogDo) Joins(fields ...field.RelationField) *appMessageLogDo {
for _, _f := range fields {
a = *a.withDO(a.DO.Joins(_f))
}
return &a
}
func (a appMessageLogDo) Preload(fields ...field.RelationField) *appMessageLogDo {
for _, _f := range fields {
a = *a.withDO(a.DO.Preload(_f))
}
return &a
}
func (a appMessageLogDo) FirstOrInit() (*model.AppMessageLog, error) {
if result, err := a.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*model.AppMessageLog), nil
}
}
func (a appMessageLogDo) FirstOrCreate() (*model.AppMessageLog, error) {
if result, err := a.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*model.AppMessageLog), nil
}
}
func (a appMessageLogDo) FindByPage(offset int, limit int) (result []*model.AppMessageLog, count int64, err error) {
result, err = a.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = a.Offset(-1).Limit(-1).Count()
return
}
func (a appMessageLogDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = a.Count()
if err != nil {
return
}
err = a.Offset(offset).Limit(limit).Scan(result)
return
}
func (a appMessageLogDo) Scan(result interface{}) (err error) {
return a.DO.Scan(result)
}
func (a appMessageLogDo) Delete(models ...*model.AppMessageLog) (result gen.ResultInfo, err error) {
return a.DO.Delete(models)
}
func (a *appMessageLogDo) withDO(do gen.Dao) *appMessageLogDo {
a.DO = *do.(*gen.DO)
return a
}

View File

@ -0,0 +1,336 @@
// 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 dao
import (
"context"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"mini-chat/internal/repository/mysql/model"
)
func newAppUser(db *gorm.DB, opts ...gen.DOOption) appUser {
_appUser := appUser{}
_appUser.appUserDo.UseDB(db, opts...)
_appUser.appUserDo.UseModel(&model.AppUser{})
tableName := _appUser.appUserDo.TableName()
_appUser.ALL = field.NewAsterisk(tableName)
_appUser.ID = field.NewInt32(tableName, "id")
_appUser.AppID = field.NewString(tableName, "app_id")
_appUser.UserID = field.NewString(tableName, "user_id")
_appUser.UserName = field.NewString(tableName, "user_name")
_appUser.UserAvatar = field.NewString(tableName, "user_avatar")
_appUser.fillFieldMap()
return _appUser
}
// appUser 小程序的用户表
type appUser struct {
appUserDo
ALL field.Asterisk
ID field.Int32 // 主键ID
AppID field.String // 小程序ID
UserID field.String // 用户ID
UserName field.String // 用户昵称
UserAvatar field.String // 用户头像
fieldMap map[string]field.Expr
}
func (a appUser) Table(newTableName string) *appUser {
a.appUserDo.UseTable(newTableName)
return a.updateTableName(newTableName)
}
func (a appUser) As(alias string) *appUser {
a.appUserDo.DO = *(a.appUserDo.As(alias).(*gen.DO))
return a.updateTableName(alias)
}
func (a *appUser) updateTableName(table string) *appUser {
a.ALL = field.NewAsterisk(table)
a.ID = field.NewInt32(table, "id")
a.AppID = field.NewString(table, "app_id")
a.UserID = field.NewString(table, "user_id")
a.UserName = field.NewString(table, "user_name")
a.UserAvatar = field.NewString(table, "user_avatar")
a.fillFieldMap()
return a
}
func (a *appUser) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := a.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (a *appUser) fillFieldMap() {
a.fieldMap = make(map[string]field.Expr, 5)
a.fieldMap["id"] = a.ID
a.fieldMap["app_id"] = a.AppID
a.fieldMap["user_id"] = a.UserID
a.fieldMap["user_name"] = a.UserName
a.fieldMap["user_avatar"] = a.UserAvatar
}
func (a appUser) clone(db *gorm.DB) appUser {
a.appUserDo.ReplaceConnPool(db.Statement.ConnPool)
return a
}
func (a appUser) replaceDB(db *gorm.DB) appUser {
a.appUserDo.ReplaceDB(db)
return a
}
type appUserDo struct{ gen.DO }
func (a appUserDo) Debug() *appUserDo {
return a.withDO(a.DO.Debug())
}
func (a appUserDo) WithContext(ctx context.Context) *appUserDo {
return a.withDO(a.DO.WithContext(ctx))
}
func (a appUserDo) ReadDB() *appUserDo {
return a.Clauses(dbresolver.Read)
}
func (a appUserDo) WriteDB() *appUserDo {
return a.Clauses(dbresolver.Write)
}
func (a appUserDo) Session(config *gorm.Session) *appUserDo {
return a.withDO(a.DO.Session(config))
}
func (a appUserDo) Clauses(conds ...clause.Expression) *appUserDo {
return a.withDO(a.DO.Clauses(conds...))
}
func (a appUserDo) Returning(value interface{}, columns ...string) *appUserDo {
return a.withDO(a.DO.Returning(value, columns...))
}
func (a appUserDo) Not(conds ...gen.Condition) *appUserDo {
return a.withDO(a.DO.Not(conds...))
}
func (a appUserDo) Or(conds ...gen.Condition) *appUserDo {
return a.withDO(a.DO.Or(conds...))
}
func (a appUserDo) Select(conds ...field.Expr) *appUserDo {
return a.withDO(a.DO.Select(conds...))
}
func (a appUserDo) Where(conds ...gen.Condition) *appUserDo {
return a.withDO(a.DO.Where(conds...))
}
func (a appUserDo) Order(conds ...field.Expr) *appUserDo {
return a.withDO(a.DO.Order(conds...))
}
func (a appUserDo) Distinct(cols ...field.Expr) *appUserDo {
return a.withDO(a.DO.Distinct(cols...))
}
func (a appUserDo) Omit(cols ...field.Expr) *appUserDo {
return a.withDO(a.DO.Omit(cols...))
}
func (a appUserDo) Join(table schema.Tabler, on ...field.Expr) *appUserDo {
return a.withDO(a.DO.Join(table, on...))
}
func (a appUserDo) LeftJoin(table schema.Tabler, on ...field.Expr) *appUserDo {
return a.withDO(a.DO.LeftJoin(table, on...))
}
func (a appUserDo) RightJoin(table schema.Tabler, on ...field.Expr) *appUserDo {
return a.withDO(a.DO.RightJoin(table, on...))
}
func (a appUserDo) Group(cols ...field.Expr) *appUserDo {
return a.withDO(a.DO.Group(cols...))
}
func (a appUserDo) Having(conds ...gen.Condition) *appUserDo {
return a.withDO(a.DO.Having(conds...))
}
func (a appUserDo) Limit(limit int) *appUserDo {
return a.withDO(a.DO.Limit(limit))
}
func (a appUserDo) Offset(offset int) *appUserDo {
return a.withDO(a.DO.Offset(offset))
}
func (a appUserDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *appUserDo {
return a.withDO(a.DO.Scopes(funcs...))
}
func (a appUserDo) Unscoped() *appUserDo {
return a.withDO(a.DO.Unscoped())
}
func (a appUserDo) Create(values ...*model.AppUser) error {
if len(values) == 0 {
return nil
}
return a.DO.Create(values)
}
func (a appUserDo) CreateInBatches(values []*model.AppUser, batchSize int) error {
return a.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (a appUserDo) Save(values ...*model.AppUser) error {
if len(values) == 0 {
return nil
}
return a.DO.Save(values)
}
func (a appUserDo) First() (*model.AppUser, error) {
if result, err := a.DO.First(); err != nil {
return nil, err
} else {
return result.(*model.AppUser), nil
}
}
func (a appUserDo) Take() (*model.AppUser, error) {
if result, err := a.DO.Take(); err != nil {
return nil, err
} else {
return result.(*model.AppUser), nil
}
}
func (a appUserDo) Last() (*model.AppUser, error) {
if result, err := a.DO.Last(); err != nil {
return nil, err
} else {
return result.(*model.AppUser), nil
}
}
func (a appUserDo) Find() ([]*model.AppUser, error) {
result, err := a.DO.Find()
return result.([]*model.AppUser), err
}
func (a appUserDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.AppUser, err error) {
buf := make([]*model.AppUser, 0, batchSize)
err = a.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (a appUserDo) FindInBatches(result *[]*model.AppUser, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return a.DO.FindInBatches(result, batchSize, fc)
}
func (a appUserDo) Attrs(attrs ...field.AssignExpr) *appUserDo {
return a.withDO(a.DO.Attrs(attrs...))
}
func (a appUserDo) Assign(attrs ...field.AssignExpr) *appUserDo {
return a.withDO(a.DO.Assign(attrs...))
}
func (a appUserDo) Joins(fields ...field.RelationField) *appUserDo {
for _, _f := range fields {
a = *a.withDO(a.DO.Joins(_f))
}
return &a
}
func (a appUserDo) Preload(fields ...field.RelationField) *appUserDo {
for _, _f := range fields {
a = *a.withDO(a.DO.Preload(_f))
}
return &a
}
func (a appUserDo) FirstOrInit() (*model.AppUser, error) {
if result, err := a.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*model.AppUser), nil
}
}
func (a appUserDo) FirstOrCreate() (*model.AppUser, error) {
if result, err := a.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*model.AppUser), nil
}
}
func (a appUserDo) FindByPage(offset int, limit int) (result []*model.AppUser, count int64, err error) {
result, err = a.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = a.Offset(-1).Limit(-1).Count()
return
}
func (a appUserDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = a.Count()
if err != nil {
return
}
err = a.Offset(offset).Limit(limit).Scan(result)
return
}
func (a appUserDo) Scan(result interface{}) (err error) {
return a.DO.Scan(result)
}
func (a appUserDo) Delete(models ...*model.AppUser) (result gen.ResultInfo, err error) {
return a.DO.Delete(models)
}
func (a *appUserDo) withDO(do gen.Dao) *appUserDo {
a.DO = *do.(*gen.DO)
return a
}

View File

@ -0,0 +1,348 @@
// 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 dao
import (
"context"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"mini-chat/internal/repository/mysql/model"
)
func newArticle(db *gorm.DB, opts ...gen.DOOption) article {
_article := article{}
_article.articleDo.UseDB(db, opts...)
_article.articleDo.UseModel(&model.Article{})
tableName := _article.articleDo.TableName()
_article.ALL = field.NewAsterisk(tableName)
_article.ID = field.NewInt32(tableName, "id")
_article.Title = field.NewString(tableName, "title")
_article.CoverImage = field.NewString(tableName, "cover_image")
_article.Content = field.NewString(tableName, "content")
_article.CreatedUser = field.NewString(tableName, "created_user")
_article.CreatedAt = field.NewTime(tableName, "created_at")
_article.UpdatedUser = field.NewString(tableName, "updated_user")
_article.UpdatedAt = field.NewTime(tableName, "updated_at")
_article.fillFieldMap()
return _article
}
// article 文章表
type article struct {
articleDo
ALL field.Asterisk
ID field.Int32 // 主键
Title field.String // 文章标题
CoverImage field.String // 文章封面图
Content field.String // 文章内容
CreatedUser field.String // 创建人
CreatedAt field.Time // 创建时间
UpdatedUser field.String // 更新人
UpdatedAt field.Time // 更新时间
fieldMap map[string]field.Expr
}
func (a article) Table(newTableName string) *article {
a.articleDo.UseTable(newTableName)
return a.updateTableName(newTableName)
}
func (a article) As(alias string) *article {
a.articleDo.DO = *(a.articleDo.As(alias).(*gen.DO))
return a.updateTableName(alias)
}
func (a *article) updateTableName(table string) *article {
a.ALL = field.NewAsterisk(table)
a.ID = field.NewInt32(table, "id")
a.Title = field.NewString(table, "title")
a.CoverImage = field.NewString(table, "cover_image")
a.Content = field.NewString(table, "content")
a.CreatedUser = field.NewString(table, "created_user")
a.CreatedAt = field.NewTime(table, "created_at")
a.UpdatedUser = field.NewString(table, "updated_user")
a.UpdatedAt = field.NewTime(table, "updated_at")
a.fillFieldMap()
return a
}
func (a *article) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := a.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (a *article) fillFieldMap() {
a.fieldMap = make(map[string]field.Expr, 8)
a.fieldMap["id"] = a.ID
a.fieldMap["title"] = a.Title
a.fieldMap["cover_image"] = a.CoverImage
a.fieldMap["content"] = a.Content
a.fieldMap["created_user"] = a.CreatedUser
a.fieldMap["created_at"] = a.CreatedAt
a.fieldMap["updated_user"] = a.UpdatedUser
a.fieldMap["updated_at"] = a.UpdatedAt
}
func (a article) clone(db *gorm.DB) article {
a.articleDo.ReplaceConnPool(db.Statement.ConnPool)
return a
}
func (a article) replaceDB(db *gorm.DB) article {
a.articleDo.ReplaceDB(db)
return a
}
type articleDo struct{ gen.DO }
func (a articleDo) Debug() *articleDo {
return a.withDO(a.DO.Debug())
}
func (a articleDo) WithContext(ctx context.Context) *articleDo {
return a.withDO(a.DO.WithContext(ctx))
}
func (a articleDo) ReadDB() *articleDo {
return a.Clauses(dbresolver.Read)
}
func (a articleDo) WriteDB() *articleDo {
return a.Clauses(dbresolver.Write)
}
func (a articleDo) Session(config *gorm.Session) *articleDo {
return a.withDO(a.DO.Session(config))
}
func (a articleDo) Clauses(conds ...clause.Expression) *articleDo {
return a.withDO(a.DO.Clauses(conds...))
}
func (a articleDo) Returning(value interface{}, columns ...string) *articleDo {
return a.withDO(a.DO.Returning(value, columns...))
}
func (a articleDo) Not(conds ...gen.Condition) *articleDo {
return a.withDO(a.DO.Not(conds...))
}
func (a articleDo) Or(conds ...gen.Condition) *articleDo {
return a.withDO(a.DO.Or(conds...))
}
func (a articleDo) Select(conds ...field.Expr) *articleDo {
return a.withDO(a.DO.Select(conds...))
}
func (a articleDo) Where(conds ...gen.Condition) *articleDo {
return a.withDO(a.DO.Where(conds...))
}
func (a articleDo) Order(conds ...field.Expr) *articleDo {
return a.withDO(a.DO.Order(conds...))
}
func (a articleDo) Distinct(cols ...field.Expr) *articleDo {
return a.withDO(a.DO.Distinct(cols...))
}
func (a articleDo) Omit(cols ...field.Expr) *articleDo {
return a.withDO(a.DO.Omit(cols...))
}
func (a articleDo) Join(table schema.Tabler, on ...field.Expr) *articleDo {
return a.withDO(a.DO.Join(table, on...))
}
func (a articleDo) LeftJoin(table schema.Tabler, on ...field.Expr) *articleDo {
return a.withDO(a.DO.LeftJoin(table, on...))
}
func (a articleDo) RightJoin(table schema.Tabler, on ...field.Expr) *articleDo {
return a.withDO(a.DO.RightJoin(table, on...))
}
func (a articleDo) Group(cols ...field.Expr) *articleDo {
return a.withDO(a.DO.Group(cols...))
}
func (a articleDo) Having(conds ...gen.Condition) *articleDo {
return a.withDO(a.DO.Having(conds...))
}
func (a articleDo) Limit(limit int) *articleDo {
return a.withDO(a.DO.Limit(limit))
}
func (a articleDo) Offset(offset int) *articleDo {
return a.withDO(a.DO.Offset(offset))
}
func (a articleDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *articleDo {
return a.withDO(a.DO.Scopes(funcs...))
}
func (a articleDo) Unscoped() *articleDo {
return a.withDO(a.DO.Unscoped())
}
func (a articleDo) Create(values ...*model.Article) error {
if len(values) == 0 {
return nil
}
return a.DO.Create(values)
}
func (a articleDo) CreateInBatches(values []*model.Article, batchSize int) error {
return a.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (a articleDo) Save(values ...*model.Article) error {
if len(values) == 0 {
return nil
}
return a.DO.Save(values)
}
func (a articleDo) First() (*model.Article, error) {
if result, err := a.DO.First(); err != nil {
return nil, err
} else {
return result.(*model.Article), nil
}
}
func (a articleDo) Take() (*model.Article, error) {
if result, err := a.DO.Take(); err != nil {
return nil, err
} else {
return result.(*model.Article), nil
}
}
func (a articleDo) Last() (*model.Article, error) {
if result, err := a.DO.Last(); err != nil {
return nil, err
} else {
return result.(*model.Article), nil
}
}
func (a articleDo) Find() ([]*model.Article, error) {
result, err := a.DO.Find()
return result.([]*model.Article), err
}
func (a articleDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.Article, err error) {
buf := make([]*model.Article, 0, batchSize)
err = a.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (a articleDo) FindInBatches(result *[]*model.Article, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return a.DO.FindInBatches(result, batchSize, fc)
}
func (a articleDo) Attrs(attrs ...field.AssignExpr) *articleDo {
return a.withDO(a.DO.Attrs(attrs...))
}
func (a articleDo) Assign(attrs ...field.AssignExpr) *articleDo {
return a.withDO(a.DO.Assign(attrs...))
}
func (a articleDo) Joins(fields ...field.RelationField) *articleDo {
for _, _f := range fields {
a = *a.withDO(a.DO.Joins(_f))
}
return &a
}
func (a articleDo) Preload(fields ...field.RelationField) *articleDo {
for _, _f := range fields {
a = *a.withDO(a.DO.Preload(_f))
}
return &a
}
func (a articleDo) FirstOrInit() (*model.Article, error) {
if result, err := a.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*model.Article), nil
}
}
func (a articleDo) FirstOrCreate() (*model.Article, error) {
if result, err := a.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*model.Article), nil
}
}
func (a articleDo) FindByPage(offset int, limit int) (result []*model.Article, count int64, err error) {
result, err = a.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = a.Offset(-1).Limit(-1).Count()
return
}
func (a articleDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = a.Count()
if err != nil {
return
}
err = a.Offset(offset).Limit(limit).Scan(result)
return
}
func (a articleDo) Scan(result interface{}) (err error) {
return a.DO.Scan(result)
}
func (a articleDo) Delete(models ...*model.Article) (result gen.ResultInfo, err error) {
return a.DO.Delete(models)
}
func (a *articleDo) withDO(do gen.Dao) *articleDo {
a.DO = *do.(*gen.DO)
return a
}

View File

@ -0,0 +1,364 @@
// 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 dao
import (
"context"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"mini-chat/internal/repository/mysql/model"
)
func newDiagnosticRecord(db *gorm.DB, opts ...gen.DOOption) diagnosticRecord {
_diagnosticRecord := diagnosticRecord{}
_diagnosticRecord.diagnosticRecordDo.UseDB(db, opts...)
_diagnosticRecord.diagnosticRecordDo.UseModel(&model.DiagnosticRecord{})
tableName := _diagnosticRecord.diagnosticRecordDo.TableName()
_diagnosticRecord.ALL = field.NewAsterisk(tableName)
_diagnosticRecord.ID = field.NewInt32(tableName, "id")
_diagnosticRecord.UserID = field.NewString(tableName, "user_id")
_diagnosticRecord.Username = field.NewString(tableName, "username")
_diagnosticRecord.Mobile = field.NewString(tableName, "mobile")
_diagnosticRecord.Mmp7 = field.NewString(tableName, "mmp_7")
_diagnosticRecord.Day = field.NewInt32(tableName, "day")
_diagnosticRecord.GallbladderImage = field.NewString(tableName, "gallbladder_image")
_diagnosticRecord.PortalVeinBranchImage = field.NewString(tableName, "portal_vein_branch_image")
_diagnosticRecord.PortalVeinCrossImage = field.NewString(tableName, "portal_vein_cross_image")
_diagnosticRecord.IdentifyResult = field.NewString(tableName, "identify_result")
_diagnosticRecord.CreatedUser = field.NewString(tableName, "created_user")
_diagnosticRecord.CreatedAt = field.NewTime(tableName, "created_at")
_diagnosticRecord.fillFieldMap()
return _diagnosticRecord
}
// diagnosticRecord 诊断记录表
type diagnosticRecord struct {
diagnosticRecordDo
ALL field.Asterisk
ID field.Int32 // 主键
UserID field.String // 用户ID(openid)
Username field.String // 姓名
Mobile field.String // 手机号
Mmp7 field.String // MMP-7检测值
Day field.Int32 // 日龄(天)
GallbladderImage field.String // 胆囊照片
PortalVeinBranchImage field.String // 门静脉左右分支照片
PortalVeinCrossImage field.String // 门静脉右支横截照片
IdentifyResult field.String // 识别结果
CreatedUser field.String // 创建人
CreatedAt field.Time // 创建时间
fieldMap map[string]field.Expr
}
func (d diagnosticRecord) Table(newTableName string) *diagnosticRecord {
d.diagnosticRecordDo.UseTable(newTableName)
return d.updateTableName(newTableName)
}
func (d diagnosticRecord) As(alias string) *diagnosticRecord {
d.diagnosticRecordDo.DO = *(d.diagnosticRecordDo.As(alias).(*gen.DO))
return d.updateTableName(alias)
}
func (d *diagnosticRecord) updateTableName(table string) *diagnosticRecord {
d.ALL = field.NewAsterisk(table)
d.ID = field.NewInt32(table, "id")
d.UserID = field.NewString(table, "user_id")
d.Username = field.NewString(table, "username")
d.Mobile = field.NewString(table, "mobile")
d.Mmp7 = field.NewString(table, "mmp_7")
d.Day = field.NewInt32(table, "day")
d.GallbladderImage = field.NewString(table, "gallbladder_image")
d.PortalVeinBranchImage = field.NewString(table, "portal_vein_branch_image")
d.PortalVeinCrossImage = field.NewString(table, "portal_vein_cross_image")
d.IdentifyResult = field.NewString(table, "identify_result")
d.CreatedUser = field.NewString(table, "created_user")
d.CreatedAt = field.NewTime(table, "created_at")
d.fillFieldMap()
return d
}
func (d *diagnosticRecord) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := d.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (d *diagnosticRecord) fillFieldMap() {
d.fieldMap = make(map[string]field.Expr, 12)
d.fieldMap["id"] = d.ID
d.fieldMap["user_id"] = d.UserID
d.fieldMap["username"] = d.Username
d.fieldMap["mobile"] = d.Mobile
d.fieldMap["mmp_7"] = d.Mmp7
d.fieldMap["day"] = d.Day
d.fieldMap["gallbladder_image"] = d.GallbladderImage
d.fieldMap["portal_vein_branch_image"] = d.PortalVeinBranchImage
d.fieldMap["portal_vein_cross_image"] = d.PortalVeinCrossImage
d.fieldMap["identify_result"] = d.IdentifyResult
d.fieldMap["created_user"] = d.CreatedUser
d.fieldMap["created_at"] = d.CreatedAt
}
func (d diagnosticRecord) clone(db *gorm.DB) diagnosticRecord {
d.diagnosticRecordDo.ReplaceConnPool(db.Statement.ConnPool)
return d
}
func (d diagnosticRecord) replaceDB(db *gorm.DB) diagnosticRecord {
d.diagnosticRecordDo.ReplaceDB(db)
return d
}
type diagnosticRecordDo struct{ gen.DO }
func (d diagnosticRecordDo) Debug() *diagnosticRecordDo {
return d.withDO(d.DO.Debug())
}
func (d diagnosticRecordDo) WithContext(ctx context.Context) *diagnosticRecordDo {
return d.withDO(d.DO.WithContext(ctx))
}
func (d diagnosticRecordDo) ReadDB() *diagnosticRecordDo {
return d.Clauses(dbresolver.Read)
}
func (d diagnosticRecordDo) WriteDB() *diagnosticRecordDo {
return d.Clauses(dbresolver.Write)
}
func (d diagnosticRecordDo) Session(config *gorm.Session) *diagnosticRecordDo {
return d.withDO(d.DO.Session(config))
}
func (d diagnosticRecordDo) Clauses(conds ...clause.Expression) *diagnosticRecordDo {
return d.withDO(d.DO.Clauses(conds...))
}
func (d diagnosticRecordDo) Returning(value interface{}, columns ...string) *diagnosticRecordDo {
return d.withDO(d.DO.Returning(value, columns...))
}
func (d diagnosticRecordDo) Not(conds ...gen.Condition) *diagnosticRecordDo {
return d.withDO(d.DO.Not(conds...))
}
func (d diagnosticRecordDo) Or(conds ...gen.Condition) *diagnosticRecordDo {
return d.withDO(d.DO.Or(conds...))
}
func (d diagnosticRecordDo) Select(conds ...field.Expr) *diagnosticRecordDo {
return d.withDO(d.DO.Select(conds...))
}
func (d diagnosticRecordDo) Where(conds ...gen.Condition) *diagnosticRecordDo {
return d.withDO(d.DO.Where(conds...))
}
func (d diagnosticRecordDo) Order(conds ...field.Expr) *diagnosticRecordDo {
return d.withDO(d.DO.Order(conds...))
}
func (d diagnosticRecordDo) Distinct(cols ...field.Expr) *diagnosticRecordDo {
return d.withDO(d.DO.Distinct(cols...))
}
func (d diagnosticRecordDo) Omit(cols ...field.Expr) *diagnosticRecordDo {
return d.withDO(d.DO.Omit(cols...))
}
func (d diagnosticRecordDo) Join(table schema.Tabler, on ...field.Expr) *diagnosticRecordDo {
return d.withDO(d.DO.Join(table, on...))
}
func (d diagnosticRecordDo) LeftJoin(table schema.Tabler, on ...field.Expr) *diagnosticRecordDo {
return d.withDO(d.DO.LeftJoin(table, on...))
}
func (d diagnosticRecordDo) RightJoin(table schema.Tabler, on ...field.Expr) *diagnosticRecordDo {
return d.withDO(d.DO.RightJoin(table, on...))
}
func (d diagnosticRecordDo) Group(cols ...field.Expr) *diagnosticRecordDo {
return d.withDO(d.DO.Group(cols...))
}
func (d diagnosticRecordDo) Having(conds ...gen.Condition) *diagnosticRecordDo {
return d.withDO(d.DO.Having(conds...))
}
func (d diagnosticRecordDo) Limit(limit int) *diagnosticRecordDo {
return d.withDO(d.DO.Limit(limit))
}
func (d diagnosticRecordDo) Offset(offset int) *diagnosticRecordDo {
return d.withDO(d.DO.Offset(offset))
}
func (d diagnosticRecordDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *diagnosticRecordDo {
return d.withDO(d.DO.Scopes(funcs...))
}
func (d diagnosticRecordDo) Unscoped() *diagnosticRecordDo {
return d.withDO(d.DO.Unscoped())
}
func (d diagnosticRecordDo) Create(values ...*model.DiagnosticRecord) error {
if len(values) == 0 {
return nil
}
return d.DO.Create(values)
}
func (d diagnosticRecordDo) CreateInBatches(values []*model.DiagnosticRecord, batchSize int) error {
return d.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (d diagnosticRecordDo) Save(values ...*model.DiagnosticRecord) error {
if len(values) == 0 {
return nil
}
return d.DO.Save(values)
}
func (d diagnosticRecordDo) First() (*model.DiagnosticRecord, error) {
if result, err := d.DO.First(); err != nil {
return nil, err
} else {
return result.(*model.DiagnosticRecord), nil
}
}
func (d diagnosticRecordDo) Take() (*model.DiagnosticRecord, error) {
if result, err := d.DO.Take(); err != nil {
return nil, err
} else {
return result.(*model.DiagnosticRecord), nil
}
}
func (d diagnosticRecordDo) Last() (*model.DiagnosticRecord, error) {
if result, err := d.DO.Last(); err != nil {
return nil, err
} else {
return result.(*model.DiagnosticRecord), nil
}
}
func (d diagnosticRecordDo) Find() ([]*model.DiagnosticRecord, error) {
result, err := d.DO.Find()
return result.([]*model.DiagnosticRecord), err
}
func (d diagnosticRecordDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.DiagnosticRecord, err error) {
buf := make([]*model.DiagnosticRecord, 0, batchSize)
err = d.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (d diagnosticRecordDo) FindInBatches(result *[]*model.DiagnosticRecord, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return d.DO.FindInBatches(result, batchSize, fc)
}
func (d diagnosticRecordDo) Attrs(attrs ...field.AssignExpr) *diagnosticRecordDo {
return d.withDO(d.DO.Attrs(attrs...))
}
func (d diagnosticRecordDo) Assign(attrs ...field.AssignExpr) *diagnosticRecordDo {
return d.withDO(d.DO.Assign(attrs...))
}
func (d diagnosticRecordDo) Joins(fields ...field.RelationField) *diagnosticRecordDo {
for _, _f := range fields {
d = *d.withDO(d.DO.Joins(_f))
}
return &d
}
func (d diagnosticRecordDo) Preload(fields ...field.RelationField) *diagnosticRecordDo {
for _, _f := range fields {
d = *d.withDO(d.DO.Preload(_f))
}
return &d
}
func (d diagnosticRecordDo) FirstOrInit() (*model.DiagnosticRecord, error) {
if result, err := d.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*model.DiagnosticRecord), nil
}
}
func (d diagnosticRecordDo) FirstOrCreate() (*model.DiagnosticRecord, error) {
if result, err := d.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*model.DiagnosticRecord), nil
}
}
func (d diagnosticRecordDo) FindByPage(offset int, limit int) (result []*model.DiagnosticRecord, count int64, err error) {
result, err = d.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = d.Offset(-1).Limit(-1).Count()
return
}
func (d diagnosticRecordDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = d.Count()
if err != nil {
return
}
err = d.Offset(offset).Limit(limit).Scan(result)
return
}
func (d diagnosticRecordDo) Scan(result interface{}) (err error) {
return d.DO.Scan(result)
}
func (d diagnosticRecordDo) Delete(models ...*model.DiagnosticRecord) (result gen.ResultInfo, err error) {
return d.DO.Delete(models)
}
func (d *diagnosticRecordDo) withDO(do gen.Dao) *diagnosticRecordDo {
d.DO = *do.(*gen.DO)
return d
}

View File

@ -0,0 +1,368 @@
// 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 dao
import (
"context"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"mini-chat/internal/repository/mysql/model"
)
func newDoctor(db *gorm.DB, opts ...gen.DOOption) doctor {
_doctor := doctor{}
_doctor.doctorDo.UseDB(db, opts...)
_doctor.doctorDo.UseModel(&model.Doctor{})
tableName := _doctor.doctorDo.TableName()
_doctor.ALL = field.NewAsterisk(tableName)
_doctor.ID = field.NewInt32(tableName, "id")
_doctor.Username = field.NewString(tableName, "username")
_doctor.Nickname = field.NewString(tableName, "nickname")
_doctor.Mobile = field.NewString(tableName, "mobile")
_doctor.Password = field.NewString(tableName, "password")
_doctor.LoginStatus = field.NewInt32(tableName, "login_status")
_doctor.LastLoginTime = field.NewTime(tableName, "last_login_time")
_doctor.LastLoginIP = field.NewString(tableName, "last_login_ip")
_doctor.LastLoginHash = field.NewString(tableName, "last_login_hash")
_doctor.CreatedUser = field.NewString(tableName, "created_user")
_doctor.CreatedAt = field.NewTime(tableName, "created_at")
_doctor.UpdatedUser = field.NewString(tableName, "updated_user")
_doctor.UpdatedAt = field.NewTime(tableName, "updated_at")
_doctor.fillFieldMap()
return _doctor
}
// doctor 医生表
type doctor struct {
doctorDo
ALL field.Asterisk
ID field.Int32 // 主键
Username field.String // 用户名
Nickname field.String // 昵称
Mobile field.String // 手机号
Password field.String // 密码
LoginStatus field.Int32 // 登录状态(1:启用 0:禁用)
LastLoginTime field.Time // 最后一次登录时间
LastLoginIP field.String // 最后一次登录IP
LastLoginHash field.String // 最后一次登录 Hash
CreatedUser field.String // 创建人
CreatedAt field.Time // 创建时间
UpdatedUser field.String // 更新人
UpdatedAt field.Time // 更新时间
fieldMap map[string]field.Expr
}
func (d doctor) Table(newTableName string) *doctor {
d.doctorDo.UseTable(newTableName)
return d.updateTableName(newTableName)
}
func (d doctor) As(alias string) *doctor {
d.doctorDo.DO = *(d.doctorDo.As(alias).(*gen.DO))
return d.updateTableName(alias)
}
func (d *doctor) updateTableName(table string) *doctor {
d.ALL = field.NewAsterisk(table)
d.ID = field.NewInt32(table, "id")
d.Username = field.NewString(table, "username")
d.Nickname = field.NewString(table, "nickname")
d.Mobile = field.NewString(table, "mobile")
d.Password = field.NewString(table, "password")
d.LoginStatus = field.NewInt32(table, "login_status")
d.LastLoginTime = field.NewTime(table, "last_login_time")
d.LastLoginIP = field.NewString(table, "last_login_ip")
d.LastLoginHash = field.NewString(table, "last_login_hash")
d.CreatedUser = field.NewString(table, "created_user")
d.CreatedAt = field.NewTime(table, "created_at")
d.UpdatedUser = field.NewString(table, "updated_user")
d.UpdatedAt = field.NewTime(table, "updated_at")
d.fillFieldMap()
return d
}
func (d *doctor) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := d.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (d *doctor) fillFieldMap() {
d.fieldMap = make(map[string]field.Expr, 13)
d.fieldMap["id"] = d.ID
d.fieldMap["username"] = d.Username
d.fieldMap["nickname"] = d.Nickname
d.fieldMap["mobile"] = d.Mobile
d.fieldMap["password"] = d.Password
d.fieldMap["login_status"] = d.LoginStatus
d.fieldMap["last_login_time"] = d.LastLoginTime
d.fieldMap["last_login_ip"] = d.LastLoginIP
d.fieldMap["last_login_hash"] = d.LastLoginHash
d.fieldMap["created_user"] = d.CreatedUser
d.fieldMap["created_at"] = d.CreatedAt
d.fieldMap["updated_user"] = d.UpdatedUser
d.fieldMap["updated_at"] = d.UpdatedAt
}
func (d doctor) clone(db *gorm.DB) doctor {
d.doctorDo.ReplaceConnPool(db.Statement.ConnPool)
return d
}
func (d doctor) replaceDB(db *gorm.DB) doctor {
d.doctorDo.ReplaceDB(db)
return d
}
type doctorDo struct{ gen.DO }
func (d doctorDo) Debug() *doctorDo {
return d.withDO(d.DO.Debug())
}
func (d doctorDo) WithContext(ctx context.Context) *doctorDo {
return d.withDO(d.DO.WithContext(ctx))
}
func (d doctorDo) ReadDB() *doctorDo {
return d.Clauses(dbresolver.Read)
}
func (d doctorDo) WriteDB() *doctorDo {
return d.Clauses(dbresolver.Write)
}
func (d doctorDo) Session(config *gorm.Session) *doctorDo {
return d.withDO(d.DO.Session(config))
}
func (d doctorDo) Clauses(conds ...clause.Expression) *doctorDo {
return d.withDO(d.DO.Clauses(conds...))
}
func (d doctorDo) Returning(value interface{}, columns ...string) *doctorDo {
return d.withDO(d.DO.Returning(value, columns...))
}
func (d doctorDo) Not(conds ...gen.Condition) *doctorDo {
return d.withDO(d.DO.Not(conds...))
}
func (d doctorDo) Or(conds ...gen.Condition) *doctorDo {
return d.withDO(d.DO.Or(conds...))
}
func (d doctorDo) Select(conds ...field.Expr) *doctorDo {
return d.withDO(d.DO.Select(conds...))
}
func (d doctorDo) Where(conds ...gen.Condition) *doctorDo {
return d.withDO(d.DO.Where(conds...))
}
func (d doctorDo) Order(conds ...field.Expr) *doctorDo {
return d.withDO(d.DO.Order(conds...))
}
func (d doctorDo) Distinct(cols ...field.Expr) *doctorDo {
return d.withDO(d.DO.Distinct(cols...))
}
func (d doctorDo) Omit(cols ...field.Expr) *doctorDo {
return d.withDO(d.DO.Omit(cols...))
}
func (d doctorDo) Join(table schema.Tabler, on ...field.Expr) *doctorDo {
return d.withDO(d.DO.Join(table, on...))
}
func (d doctorDo) LeftJoin(table schema.Tabler, on ...field.Expr) *doctorDo {
return d.withDO(d.DO.LeftJoin(table, on...))
}
func (d doctorDo) RightJoin(table schema.Tabler, on ...field.Expr) *doctorDo {
return d.withDO(d.DO.RightJoin(table, on...))
}
func (d doctorDo) Group(cols ...field.Expr) *doctorDo {
return d.withDO(d.DO.Group(cols...))
}
func (d doctorDo) Having(conds ...gen.Condition) *doctorDo {
return d.withDO(d.DO.Having(conds...))
}
func (d doctorDo) Limit(limit int) *doctorDo {
return d.withDO(d.DO.Limit(limit))
}
func (d doctorDo) Offset(offset int) *doctorDo {
return d.withDO(d.DO.Offset(offset))
}
func (d doctorDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *doctorDo {
return d.withDO(d.DO.Scopes(funcs...))
}
func (d doctorDo) Unscoped() *doctorDo {
return d.withDO(d.DO.Unscoped())
}
func (d doctorDo) Create(values ...*model.Doctor) error {
if len(values) == 0 {
return nil
}
return d.DO.Create(values)
}
func (d doctorDo) CreateInBatches(values []*model.Doctor, batchSize int) error {
return d.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (d doctorDo) Save(values ...*model.Doctor) error {
if len(values) == 0 {
return nil
}
return d.DO.Save(values)
}
func (d doctorDo) First() (*model.Doctor, error) {
if result, err := d.DO.First(); err != nil {
return nil, err
} else {
return result.(*model.Doctor), nil
}
}
func (d doctorDo) Take() (*model.Doctor, error) {
if result, err := d.DO.Take(); err != nil {
return nil, err
} else {
return result.(*model.Doctor), nil
}
}
func (d doctorDo) Last() (*model.Doctor, error) {
if result, err := d.DO.Last(); err != nil {
return nil, err
} else {
return result.(*model.Doctor), nil
}
}
func (d doctorDo) Find() ([]*model.Doctor, error) {
result, err := d.DO.Find()
return result.([]*model.Doctor), err
}
func (d doctorDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.Doctor, err error) {
buf := make([]*model.Doctor, 0, batchSize)
err = d.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (d doctorDo) FindInBatches(result *[]*model.Doctor, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return d.DO.FindInBatches(result, batchSize, fc)
}
func (d doctorDo) Attrs(attrs ...field.AssignExpr) *doctorDo {
return d.withDO(d.DO.Attrs(attrs...))
}
func (d doctorDo) Assign(attrs ...field.AssignExpr) *doctorDo {
return d.withDO(d.DO.Assign(attrs...))
}
func (d doctorDo) Joins(fields ...field.RelationField) *doctorDo {
for _, _f := range fields {
d = *d.withDO(d.DO.Joins(_f))
}
return &d
}
func (d doctorDo) Preload(fields ...field.RelationField) *doctorDo {
for _, _f := range fields {
d = *d.withDO(d.DO.Preload(_f))
}
return &d
}
func (d doctorDo) FirstOrInit() (*model.Doctor, error) {
if result, err := d.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*model.Doctor), nil
}
}
func (d doctorDo) FirstOrCreate() (*model.Doctor, error) {
if result, err := d.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*model.Doctor), nil
}
}
func (d doctorDo) FindByPage(offset int, limit int) (result []*model.Doctor, count int64, err error) {
result, err = d.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = d.Offset(-1).Limit(-1).Count()
return
}
func (d doctorDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = d.Count()
if err != nil {
return
}
err = d.Offset(offset).Limit(limit).Scan(result)
return
}
func (d doctorDo) Scan(result interface{}) (err error) {
return d.DO.Scan(result)
}
func (d doctorDo) Delete(models ...*model.Doctor) (result gen.ResultInfo, err error) {
return d.DO.Delete(models)
}
func (d *doctorDo) withDO(do gen.Dao) *doctorDo {
d.DO = *do.(*gen.DO)
return d
}

View File

@ -0,0 +1,159 @@
// 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 dao
import (
"context"
"database/sql"
"gorm.io/gorm"
"gorm.io/gen"
"gorm.io/plugin/dbresolver"
)
var (
Q = new(Query)
Admin *admin
AppKeyword *appKeyword
AppKeywordReply *appKeywordReply
AppMessageLog *appMessageLog
AppUser *appUser
LogOperation *logOperation
LogRequest *logRequest
MiniProgram *miniProgram
)
func SetDefault(db *gorm.DB, opts ...gen.DOOption) {
*Q = *Use(db, opts...)
Admin = &Q.Admin
AppKeyword = &Q.AppKeyword
AppKeywordReply = &Q.AppKeywordReply
AppMessageLog = &Q.AppMessageLog
AppUser = &Q.AppUser
LogOperation = &Q.LogOperation
LogRequest = &Q.LogRequest
MiniProgram = &Q.MiniProgram
}
func Use(db *gorm.DB, opts ...gen.DOOption) *Query {
return &Query{
db: db,
Admin: newAdmin(db, opts...),
AppKeyword: newAppKeyword(db, opts...),
AppKeywordReply: newAppKeywordReply(db, opts...),
AppMessageLog: newAppMessageLog(db, opts...),
AppUser: newAppUser(db, opts...),
LogOperation: newLogOperation(db, opts...),
LogRequest: newLogRequest(db, opts...),
MiniProgram: newMiniProgram(db, opts...),
}
}
type Query struct {
db *gorm.DB
Admin admin
AppKeyword appKeyword
AppKeywordReply appKeywordReply
AppMessageLog appMessageLog
AppUser appUser
LogOperation logOperation
LogRequest logRequest
MiniProgram miniProgram
}
func (q *Query) Available() bool { return q.db != nil }
func (q *Query) clone(db *gorm.DB) *Query {
return &Query{
db: db,
Admin: q.Admin.clone(db),
AppKeyword: q.AppKeyword.clone(db),
AppKeywordReply: q.AppKeywordReply.clone(db),
AppMessageLog: q.AppMessageLog.clone(db),
AppUser: q.AppUser.clone(db),
LogOperation: q.LogOperation.clone(db),
LogRequest: q.LogRequest.clone(db),
MiniProgram: q.MiniProgram.clone(db),
}
}
func (q *Query) ReadDB() *Query {
return q.ReplaceDB(q.db.Clauses(dbresolver.Read))
}
func (q *Query) WriteDB() *Query {
return q.ReplaceDB(q.db.Clauses(dbresolver.Write))
}
func (q *Query) ReplaceDB(db *gorm.DB) *Query {
return &Query{
db: db,
Admin: q.Admin.replaceDB(db),
AppKeyword: q.AppKeyword.replaceDB(db),
AppKeywordReply: q.AppKeywordReply.replaceDB(db),
AppMessageLog: q.AppMessageLog.replaceDB(db),
AppUser: q.AppUser.replaceDB(db),
LogOperation: q.LogOperation.replaceDB(db),
LogRequest: q.LogRequest.replaceDB(db),
MiniProgram: q.MiniProgram.replaceDB(db),
}
}
type queryCtx struct {
Admin *adminDo
AppKeyword *appKeywordDo
AppKeywordReply *appKeywordReplyDo
AppMessageLog *appMessageLogDo
AppUser *appUserDo
LogOperation *logOperationDo
LogRequest *logRequestDo
MiniProgram *miniProgramDo
}
func (q *Query) WithContext(ctx context.Context) *queryCtx {
return &queryCtx{
Admin: q.Admin.WithContext(ctx),
AppKeyword: q.AppKeyword.WithContext(ctx),
AppKeywordReply: q.AppKeywordReply.WithContext(ctx),
AppMessageLog: q.AppMessageLog.WithContext(ctx),
AppUser: q.AppUser.WithContext(ctx),
LogOperation: q.LogOperation.WithContext(ctx),
LogRequest: q.LogRequest.WithContext(ctx),
MiniProgram: q.MiniProgram.WithContext(ctx),
}
}
func (q *Query) Transaction(fc func(tx *Query) error, opts ...*sql.TxOptions) error {
return q.db.Transaction(func(tx *gorm.DB) error { return fc(q.clone(tx)) }, opts...)
}
func (q *Query) Begin(opts ...*sql.TxOptions) *QueryTx {
tx := q.db.Begin(opts...)
return &QueryTx{Query: q.clone(tx), Error: tx.Error}
}
type QueryTx struct {
*Query
Error error
}
func (q *QueryTx) Commit() error {
return q.db.Commit().Error
}
func (q *QueryTx) Rollback() error {
return q.db.Rollback().Error
}
func (q *QueryTx) SavePoint(name string) error {
return q.db.SavePoint(name).Error
}
func (q *QueryTx) RollbackTo(name string) error {
return q.db.RollbackTo(name).Error
}

View File

@ -0,0 +1,336 @@
// 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 dao
import (
"context"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"mini-chat/internal/repository/mysql/model"
)
func newLogOperation(db *gorm.DB, opts ...gen.DOOption) logOperation {
_logOperation := logOperation{}
_logOperation.logOperationDo.UseDB(db, opts...)
_logOperation.logOperationDo.UseModel(&model.LogOperation{})
tableName := _logOperation.logOperationDo.TableName()
_logOperation.ALL = field.NewAsterisk(tableName)
_logOperation.ID = field.NewInt32(tableName, "id")
_logOperation.Level = field.NewString(tableName, "level")
_logOperation.Msg = field.NewString(tableName, "msg")
_logOperation.Content = field.NewString(tableName, "content")
_logOperation.CreatedAt = field.NewTime(tableName, "created_at")
_logOperation.fillFieldMap()
return _logOperation
}
// logOperation 内部日志表
type logOperation struct {
logOperationDo
ALL field.Asterisk
ID field.Int32 // 主键
Level field.String // 错误级别
Msg field.String // 错误信息
Content field.String // 错误内容
CreatedAt field.Time // 创建时间
fieldMap map[string]field.Expr
}
func (l logOperation) Table(newTableName string) *logOperation {
l.logOperationDo.UseTable(newTableName)
return l.updateTableName(newTableName)
}
func (l logOperation) As(alias string) *logOperation {
l.logOperationDo.DO = *(l.logOperationDo.As(alias).(*gen.DO))
return l.updateTableName(alias)
}
func (l *logOperation) updateTableName(table string) *logOperation {
l.ALL = field.NewAsterisk(table)
l.ID = field.NewInt32(table, "id")
l.Level = field.NewString(table, "level")
l.Msg = field.NewString(table, "msg")
l.Content = field.NewString(table, "content")
l.CreatedAt = field.NewTime(table, "created_at")
l.fillFieldMap()
return l
}
func (l *logOperation) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := l.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (l *logOperation) fillFieldMap() {
l.fieldMap = make(map[string]field.Expr, 5)
l.fieldMap["id"] = l.ID
l.fieldMap["level"] = l.Level
l.fieldMap["msg"] = l.Msg
l.fieldMap["content"] = l.Content
l.fieldMap["created_at"] = l.CreatedAt
}
func (l logOperation) clone(db *gorm.DB) logOperation {
l.logOperationDo.ReplaceConnPool(db.Statement.ConnPool)
return l
}
func (l logOperation) replaceDB(db *gorm.DB) logOperation {
l.logOperationDo.ReplaceDB(db)
return l
}
type logOperationDo struct{ gen.DO }
func (l logOperationDo) Debug() *logOperationDo {
return l.withDO(l.DO.Debug())
}
func (l logOperationDo) WithContext(ctx context.Context) *logOperationDo {
return l.withDO(l.DO.WithContext(ctx))
}
func (l logOperationDo) ReadDB() *logOperationDo {
return l.Clauses(dbresolver.Read)
}
func (l logOperationDo) WriteDB() *logOperationDo {
return l.Clauses(dbresolver.Write)
}
func (l logOperationDo) Session(config *gorm.Session) *logOperationDo {
return l.withDO(l.DO.Session(config))
}
func (l logOperationDo) Clauses(conds ...clause.Expression) *logOperationDo {
return l.withDO(l.DO.Clauses(conds...))
}
func (l logOperationDo) Returning(value interface{}, columns ...string) *logOperationDo {
return l.withDO(l.DO.Returning(value, columns...))
}
func (l logOperationDo) Not(conds ...gen.Condition) *logOperationDo {
return l.withDO(l.DO.Not(conds...))
}
func (l logOperationDo) Or(conds ...gen.Condition) *logOperationDo {
return l.withDO(l.DO.Or(conds...))
}
func (l logOperationDo) Select(conds ...field.Expr) *logOperationDo {
return l.withDO(l.DO.Select(conds...))
}
func (l logOperationDo) Where(conds ...gen.Condition) *logOperationDo {
return l.withDO(l.DO.Where(conds...))
}
func (l logOperationDo) Order(conds ...field.Expr) *logOperationDo {
return l.withDO(l.DO.Order(conds...))
}
func (l logOperationDo) Distinct(cols ...field.Expr) *logOperationDo {
return l.withDO(l.DO.Distinct(cols...))
}
func (l logOperationDo) Omit(cols ...field.Expr) *logOperationDo {
return l.withDO(l.DO.Omit(cols...))
}
func (l logOperationDo) Join(table schema.Tabler, on ...field.Expr) *logOperationDo {
return l.withDO(l.DO.Join(table, on...))
}
func (l logOperationDo) LeftJoin(table schema.Tabler, on ...field.Expr) *logOperationDo {
return l.withDO(l.DO.LeftJoin(table, on...))
}
func (l logOperationDo) RightJoin(table schema.Tabler, on ...field.Expr) *logOperationDo {
return l.withDO(l.DO.RightJoin(table, on...))
}
func (l logOperationDo) Group(cols ...field.Expr) *logOperationDo {
return l.withDO(l.DO.Group(cols...))
}
func (l logOperationDo) Having(conds ...gen.Condition) *logOperationDo {
return l.withDO(l.DO.Having(conds...))
}
func (l logOperationDo) Limit(limit int) *logOperationDo {
return l.withDO(l.DO.Limit(limit))
}
func (l logOperationDo) Offset(offset int) *logOperationDo {
return l.withDO(l.DO.Offset(offset))
}
func (l logOperationDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *logOperationDo {
return l.withDO(l.DO.Scopes(funcs...))
}
func (l logOperationDo) Unscoped() *logOperationDo {
return l.withDO(l.DO.Unscoped())
}
func (l logOperationDo) Create(values ...*model.LogOperation) error {
if len(values) == 0 {
return nil
}
return l.DO.Create(values)
}
func (l logOperationDo) CreateInBatches(values []*model.LogOperation, batchSize int) error {
return l.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (l logOperationDo) Save(values ...*model.LogOperation) error {
if len(values) == 0 {
return nil
}
return l.DO.Save(values)
}
func (l logOperationDo) First() (*model.LogOperation, error) {
if result, err := l.DO.First(); err != nil {
return nil, err
} else {
return result.(*model.LogOperation), nil
}
}
func (l logOperationDo) Take() (*model.LogOperation, error) {
if result, err := l.DO.Take(); err != nil {
return nil, err
} else {
return result.(*model.LogOperation), nil
}
}
func (l logOperationDo) Last() (*model.LogOperation, error) {
if result, err := l.DO.Last(); err != nil {
return nil, err
} else {
return result.(*model.LogOperation), nil
}
}
func (l logOperationDo) Find() ([]*model.LogOperation, error) {
result, err := l.DO.Find()
return result.([]*model.LogOperation), err
}
func (l logOperationDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.LogOperation, err error) {
buf := make([]*model.LogOperation, 0, batchSize)
err = l.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (l logOperationDo) FindInBatches(result *[]*model.LogOperation, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return l.DO.FindInBatches(result, batchSize, fc)
}
func (l logOperationDo) Attrs(attrs ...field.AssignExpr) *logOperationDo {
return l.withDO(l.DO.Attrs(attrs...))
}
func (l logOperationDo) Assign(attrs ...field.AssignExpr) *logOperationDo {
return l.withDO(l.DO.Assign(attrs...))
}
func (l logOperationDo) Joins(fields ...field.RelationField) *logOperationDo {
for _, _f := range fields {
l = *l.withDO(l.DO.Joins(_f))
}
return &l
}
func (l logOperationDo) Preload(fields ...field.RelationField) *logOperationDo {
for _, _f := range fields {
l = *l.withDO(l.DO.Preload(_f))
}
return &l
}
func (l logOperationDo) FirstOrInit() (*model.LogOperation, error) {
if result, err := l.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*model.LogOperation), nil
}
}
func (l logOperationDo) FirstOrCreate() (*model.LogOperation, error) {
if result, err := l.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*model.LogOperation), nil
}
}
func (l logOperationDo) FindByPage(offset int, limit int) (result []*model.LogOperation, count int64, err error) {
result, err = l.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = l.Offset(-1).Limit(-1).Count()
return
}
func (l logOperationDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = l.Count()
if err != nil {
return
}
err = l.Offset(offset).Limit(limit).Scan(result)
return
}
func (l logOperationDo) Scan(result interface{}) (err error) {
return l.DO.Scan(result)
}
func (l logOperationDo) Delete(models ...*model.LogOperation) (result gen.ResultInfo, err error) {
return l.DO.Delete(models)
}
func (l *logOperationDo) withDO(do gen.Dao) *logOperationDo {
l.DO = *do.(*gen.DO)
return l
}

View File

@ -0,0 +1,364 @@
// 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 dao
import (
"context"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"mini-chat/internal/repository/mysql/model"
)
func newLogRequest(db *gorm.DB, opts ...gen.DOOption) logRequest {
_logRequest := logRequest{}
_logRequest.logRequestDo.UseDB(db, opts...)
_logRequest.logRequestDo.UseModel(&model.LogRequest{})
tableName := _logRequest.logRequestDo.TableName()
_logRequest.ALL = field.NewAsterisk(tableName)
_logRequest.ID = field.NewInt32(tableName, "id")
_logRequest.Tid = field.NewString(tableName, "tid")
_logRequest.Username = field.NewString(tableName, "username")
_logRequest.Host = field.NewString(tableName, "host")
_logRequest.Path = field.NewString(tableName, "path")
_logRequest.Method = field.NewString(tableName, "method")
_logRequest.HTTPCode = field.NewInt32(tableName, "http_code")
_logRequest.BusinessCode = field.NewInt32(tableName, "business_code")
_logRequest.CostMilliseconds = field.NewFloat64(tableName, "cost_milliseconds")
_logRequest.IsSuccess = field.NewInt32(tableName, "is_success")
_logRequest.Content = field.NewString(tableName, "content")
_logRequest.CreatedAt = field.NewTime(tableName, "created_at")
_logRequest.fillFieldMap()
return _logRequest
}
// logRequest 请求日志表
type logRequest struct {
logRequestDo
ALL field.Asterisk
ID field.Int32 // 主键
Tid field.String // 请求链路 ID
Username field.String // 登录名
Host field.String // 请求 HOST
Path field.String // 请求 Path
Method field.String // 请求 Method
HTTPCode field.Int32 // HTTP 状态码
BusinessCode field.Int32 // 业务码
CostMilliseconds field.Float64 // 耗时(毫秒)
IsSuccess field.Int32 // 是否成功(1=是 -1=否)
Content field.String // 内容
CreatedAt field.Time // 创建时间
fieldMap map[string]field.Expr
}
func (l logRequest) Table(newTableName string) *logRequest {
l.logRequestDo.UseTable(newTableName)
return l.updateTableName(newTableName)
}
func (l logRequest) As(alias string) *logRequest {
l.logRequestDo.DO = *(l.logRequestDo.As(alias).(*gen.DO))
return l.updateTableName(alias)
}
func (l *logRequest) updateTableName(table string) *logRequest {
l.ALL = field.NewAsterisk(table)
l.ID = field.NewInt32(table, "id")
l.Tid = field.NewString(table, "tid")
l.Username = field.NewString(table, "username")
l.Host = field.NewString(table, "host")
l.Path = field.NewString(table, "path")
l.Method = field.NewString(table, "method")
l.HTTPCode = field.NewInt32(table, "http_code")
l.BusinessCode = field.NewInt32(table, "business_code")
l.CostMilliseconds = field.NewFloat64(table, "cost_milliseconds")
l.IsSuccess = field.NewInt32(table, "is_success")
l.Content = field.NewString(table, "content")
l.CreatedAt = field.NewTime(table, "created_at")
l.fillFieldMap()
return l
}
func (l *logRequest) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := l.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (l *logRequest) fillFieldMap() {
l.fieldMap = make(map[string]field.Expr, 12)
l.fieldMap["id"] = l.ID
l.fieldMap["tid"] = l.Tid
l.fieldMap["username"] = l.Username
l.fieldMap["host"] = l.Host
l.fieldMap["path"] = l.Path
l.fieldMap["method"] = l.Method
l.fieldMap["http_code"] = l.HTTPCode
l.fieldMap["business_code"] = l.BusinessCode
l.fieldMap["cost_milliseconds"] = l.CostMilliseconds
l.fieldMap["is_success"] = l.IsSuccess
l.fieldMap["content"] = l.Content
l.fieldMap["created_at"] = l.CreatedAt
}
func (l logRequest) clone(db *gorm.DB) logRequest {
l.logRequestDo.ReplaceConnPool(db.Statement.ConnPool)
return l
}
func (l logRequest) replaceDB(db *gorm.DB) logRequest {
l.logRequestDo.ReplaceDB(db)
return l
}
type logRequestDo struct{ gen.DO }
func (l logRequestDo) Debug() *logRequestDo {
return l.withDO(l.DO.Debug())
}
func (l logRequestDo) WithContext(ctx context.Context) *logRequestDo {
return l.withDO(l.DO.WithContext(ctx))
}
func (l logRequestDo) ReadDB() *logRequestDo {
return l.Clauses(dbresolver.Read)
}
func (l logRequestDo) WriteDB() *logRequestDo {
return l.Clauses(dbresolver.Write)
}
func (l logRequestDo) Session(config *gorm.Session) *logRequestDo {
return l.withDO(l.DO.Session(config))
}
func (l logRequestDo) Clauses(conds ...clause.Expression) *logRequestDo {
return l.withDO(l.DO.Clauses(conds...))
}
func (l logRequestDo) Returning(value interface{}, columns ...string) *logRequestDo {
return l.withDO(l.DO.Returning(value, columns...))
}
func (l logRequestDo) Not(conds ...gen.Condition) *logRequestDo {
return l.withDO(l.DO.Not(conds...))
}
func (l logRequestDo) Or(conds ...gen.Condition) *logRequestDo {
return l.withDO(l.DO.Or(conds...))
}
func (l logRequestDo) Select(conds ...field.Expr) *logRequestDo {
return l.withDO(l.DO.Select(conds...))
}
func (l logRequestDo) Where(conds ...gen.Condition) *logRequestDo {
return l.withDO(l.DO.Where(conds...))
}
func (l logRequestDo) Order(conds ...field.Expr) *logRequestDo {
return l.withDO(l.DO.Order(conds...))
}
func (l logRequestDo) Distinct(cols ...field.Expr) *logRequestDo {
return l.withDO(l.DO.Distinct(cols...))
}
func (l logRequestDo) Omit(cols ...field.Expr) *logRequestDo {
return l.withDO(l.DO.Omit(cols...))
}
func (l logRequestDo) Join(table schema.Tabler, on ...field.Expr) *logRequestDo {
return l.withDO(l.DO.Join(table, on...))
}
func (l logRequestDo) LeftJoin(table schema.Tabler, on ...field.Expr) *logRequestDo {
return l.withDO(l.DO.LeftJoin(table, on...))
}
func (l logRequestDo) RightJoin(table schema.Tabler, on ...field.Expr) *logRequestDo {
return l.withDO(l.DO.RightJoin(table, on...))
}
func (l logRequestDo) Group(cols ...field.Expr) *logRequestDo {
return l.withDO(l.DO.Group(cols...))
}
func (l logRequestDo) Having(conds ...gen.Condition) *logRequestDo {
return l.withDO(l.DO.Having(conds...))
}
func (l logRequestDo) Limit(limit int) *logRequestDo {
return l.withDO(l.DO.Limit(limit))
}
func (l logRequestDo) Offset(offset int) *logRequestDo {
return l.withDO(l.DO.Offset(offset))
}
func (l logRequestDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *logRequestDo {
return l.withDO(l.DO.Scopes(funcs...))
}
func (l logRequestDo) Unscoped() *logRequestDo {
return l.withDO(l.DO.Unscoped())
}
func (l logRequestDo) Create(values ...*model.LogRequest) error {
if len(values) == 0 {
return nil
}
return l.DO.Create(values)
}
func (l logRequestDo) CreateInBatches(values []*model.LogRequest, batchSize int) error {
return l.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (l logRequestDo) Save(values ...*model.LogRequest) error {
if len(values) == 0 {
return nil
}
return l.DO.Save(values)
}
func (l logRequestDo) First() (*model.LogRequest, error) {
if result, err := l.DO.First(); err != nil {
return nil, err
} else {
return result.(*model.LogRequest), nil
}
}
func (l logRequestDo) Take() (*model.LogRequest, error) {
if result, err := l.DO.Take(); err != nil {
return nil, err
} else {
return result.(*model.LogRequest), nil
}
}
func (l logRequestDo) Last() (*model.LogRequest, error) {
if result, err := l.DO.Last(); err != nil {
return nil, err
} else {
return result.(*model.LogRequest), nil
}
}
func (l logRequestDo) Find() ([]*model.LogRequest, error) {
result, err := l.DO.Find()
return result.([]*model.LogRequest), err
}
func (l logRequestDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.LogRequest, err error) {
buf := make([]*model.LogRequest, 0, batchSize)
err = l.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (l logRequestDo) FindInBatches(result *[]*model.LogRequest, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return l.DO.FindInBatches(result, batchSize, fc)
}
func (l logRequestDo) Attrs(attrs ...field.AssignExpr) *logRequestDo {
return l.withDO(l.DO.Attrs(attrs...))
}
func (l logRequestDo) Assign(attrs ...field.AssignExpr) *logRequestDo {
return l.withDO(l.DO.Assign(attrs...))
}
func (l logRequestDo) Joins(fields ...field.RelationField) *logRequestDo {
for _, _f := range fields {
l = *l.withDO(l.DO.Joins(_f))
}
return &l
}
func (l logRequestDo) Preload(fields ...field.RelationField) *logRequestDo {
for _, _f := range fields {
l = *l.withDO(l.DO.Preload(_f))
}
return &l
}
func (l logRequestDo) FirstOrInit() (*model.LogRequest, error) {
if result, err := l.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*model.LogRequest), nil
}
}
func (l logRequestDo) FirstOrCreate() (*model.LogRequest, error) {
if result, err := l.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*model.LogRequest), nil
}
}
func (l logRequestDo) FindByPage(offset int, limit int) (result []*model.LogRequest, count int64, err error) {
result, err = l.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = l.Offset(-1).Limit(-1).Count()
return
}
func (l logRequestDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = l.Count()
if err != nil {
return
}
err = l.Offset(offset).Limit(limit).Scan(result)
return
}
func (l logRequestDo) Scan(result interface{}) (err error) {
return l.DO.Scan(result)
}
func (l logRequestDo) Delete(models ...*model.LogRequest) (result gen.ResultInfo, err error) {
return l.DO.Delete(models)
}
func (l *logRequestDo) withDO(do gen.Dao) *logRequestDo {
l.DO = *do.(*gen.DO)
return l
}

View File

@ -0,0 +1,352 @@
// 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 dao
import (
"context"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"mini-chat/internal/repository/mysql/model"
)
func newMiniProgram(db *gorm.DB, opts ...gen.DOOption) miniProgram {
_miniProgram := miniProgram{}
_miniProgram.miniProgramDo.UseDB(db, opts...)
_miniProgram.miniProgramDo.UseModel(&model.MiniProgram{})
tableName := _miniProgram.miniProgramDo.TableName()
_miniProgram.ALL = field.NewAsterisk(tableName)
_miniProgram.ID = field.NewInt32(tableName, "id")
_miniProgram.AppID = field.NewString(tableName, "app_id")
_miniProgram.Name = field.NewString(tableName, "name")
_miniProgram.Description = field.NewString(tableName, "description")
_miniProgram.Avatar = field.NewString(tableName, "avatar")
_miniProgram.CreatedUser = field.NewString(tableName, "created_user")
_miniProgram.CreatedAt = field.NewTime(tableName, "created_at")
_miniProgram.UpdatedUser = field.NewString(tableName, "updated_user")
_miniProgram.UpdatedAt = field.NewTime(tableName, "updated_at")
_miniProgram.fillFieldMap()
return _miniProgram
}
// miniProgram 小程序表
type miniProgram struct {
miniProgramDo
ALL field.Asterisk
ID field.Int32 // 主键ID
AppID field.String // 小程序ID
Name field.String // 名称
Description field.String // 描述
Avatar field.String // 头像
CreatedUser field.String // 创建人
CreatedAt field.Time // 创建时间
UpdatedUser field.String // 更新人
UpdatedAt field.Time // 更新时间
fieldMap map[string]field.Expr
}
func (m miniProgram) Table(newTableName string) *miniProgram {
m.miniProgramDo.UseTable(newTableName)
return m.updateTableName(newTableName)
}
func (m miniProgram) As(alias string) *miniProgram {
m.miniProgramDo.DO = *(m.miniProgramDo.As(alias).(*gen.DO))
return m.updateTableName(alias)
}
func (m *miniProgram) updateTableName(table string) *miniProgram {
m.ALL = field.NewAsterisk(table)
m.ID = field.NewInt32(table, "id")
m.AppID = field.NewString(table, "app_id")
m.Name = field.NewString(table, "name")
m.Description = field.NewString(table, "description")
m.Avatar = field.NewString(table, "avatar")
m.CreatedUser = field.NewString(table, "created_user")
m.CreatedAt = field.NewTime(table, "created_at")
m.UpdatedUser = field.NewString(table, "updated_user")
m.UpdatedAt = field.NewTime(table, "updated_at")
m.fillFieldMap()
return m
}
func (m *miniProgram) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := m.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (m *miniProgram) fillFieldMap() {
m.fieldMap = make(map[string]field.Expr, 9)
m.fieldMap["id"] = m.ID
m.fieldMap["app_id"] = m.AppID
m.fieldMap["name"] = m.Name
m.fieldMap["description"] = m.Description
m.fieldMap["avatar"] = m.Avatar
m.fieldMap["created_user"] = m.CreatedUser
m.fieldMap["created_at"] = m.CreatedAt
m.fieldMap["updated_user"] = m.UpdatedUser
m.fieldMap["updated_at"] = m.UpdatedAt
}
func (m miniProgram) clone(db *gorm.DB) miniProgram {
m.miniProgramDo.ReplaceConnPool(db.Statement.ConnPool)
return m
}
func (m miniProgram) replaceDB(db *gorm.DB) miniProgram {
m.miniProgramDo.ReplaceDB(db)
return m
}
type miniProgramDo struct{ gen.DO }
func (m miniProgramDo) Debug() *miniProgramDo {
return m.withDO(m.DO.Debug())
}
func (m miniProgramDo) WithContext(ctx context.Context) *miniProgramDo {
return m.withDO(m.DO.WithContext(ctx))
}
func (m miniProgramDo) ReadDB() *miniProgramDo {
return m.Clauses(dbresolver.Read)
}
func (m miniProgramDo) WriteDB() *miniProgramDo {
return m.Clauses(dbresolver.Write)
}
func (m miniProgramDo) Session(config *gorm.Session) *miniProgramDo {
return m.withDO(m.DO.Session(config))
}
func (m miniProgramDo) Clauses(conds ...clause.Expression) *miniProgramDo {
return m.withDO(m.DO.Clauses(conds...))
}
func (m miniProgramDo) Returning(value interface{}, columns ...string) *miniProgramDo {
return m.withDO(m.DO.Returning(value, columns...))
}
func (m miniProgramDo) Not(conds ...gen.Condition) *miniProgramDo {
return m.withDO(m.DO.Not(conds...))
}
func (m miniProgramDo) Or(conds ...gen.Condition) *miniProgramDo {
return m.withDO(m.DO.Or(conds...))
}
func (m miniProgramDo) Select(conds ...field.Expr) *miniProgramDo {
return m.withDO(m.DO.Select(conds...))
}
func (m miniProgramDo) Where(conds ...gen.Condition) *miniProgramDo {
return m.withDO(m.DO.Where(conds...))
}
func (m miniProgramDo) Order(conds ...field.Expr) *miniProgramDo {
return m.withDO(m.DO.Order(conds...))
}
func (m miniProgramDo) Distinct(cols ...field.Expr) *miniProgramDo {
return m.withDO(m.DO.Distinct(cols...))
}
func (m miniProgramDo) Omit(cols ...field.Expr) *miniProgramDo {
return m.withDO(m.DO.Omit(cols...))
}
func (m miniProgramDo) Join(table schema.Tabler, on ...field.Expr) *miniProgramDo {
return m.withDO(m.DO.Join(table, on...))
}
func (m miniProgramDo) LeftJoin(table schema.Tabler, on ...field.Expr) *miniProgramDo {
return m.withDO(m.DO.LeftJoin(table, on...))
}
func (m miniProgramDo) RightJoin(table schema.Tabler, on ...field.Expr) *miniProgramDo {
return m.withDO(m.DO.RightJoin(table, on...))
}
func (m miniProgramDo) Group(cols ...field.Expr) *miniProgramDo {
return m.withDO(m.DO.Group(cols...))
}
func (m miniProgramDo) Having(conds ...gen.Condition) *miniProgramDo {
return m.withDO(m.DO.Having(conds...))
}
func (m miniProgramDo) Limit(limit int) *miniProgramDo {
return m.withDO(m.DO.Limit(limit))
}
func (m miniProgramDo) Offset(offset int) *miniProgramDo {
return m.withDO(m.DO.Offset(offset))
}
func (m miniProgramDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *miniProgramDo {
return m.withDO(m.DO.Scopes(funcs...))
}
func (m miniProgramDo) Unscoped() *miniProgramDo {
return m.withDO(m.DO.Unscoped())
}
func (m miniProgramDo) Create(values ...*model.MiniProgram) error {
if len(values) == 0 {
return nil
}
return m.DO.Create(values)
}
func (m miniProgramDo) CreateInBatches(values []*model.MiniProgram, batchSize int) error {
return m.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (m miniProgramDo) Save(values ...*model.MiniProgram) error {
if len(values) == 0 {
return nil
}
return m.DO.Save(values)
}
func (m miniProgramDo) First() (*model.MiniProgram, error) {
if result, err := m.DO.First(); err != nil {
return nil, err
} else {
return result.(*model.MiniProgram), nil
}
}
func (m miniProgramDo) Take() (*model.MiniProgram, error) {
if result, err := m.DO.Take(); err != nil {
return nil, err
} else {
return result.(*model.MiniProgram), nil
}
}
func (m miniProgramDo) Last() (*model.MiniProgram, error) {
if result, err := m.DO.Last(); err != nil {
return nil, err
} else {
return result.(*model.MiniProgram), nil
}
}
func (m miniProgramDo) Find() ([]*model.MiniProgram, error) {
result, err := m.DO.Find()
return result.([]*model.MiniProgram), err
}
func (m miniProgramDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.MiniProgram, err error) {
buf := make([]*model.MiniProgram, 0, batchSize)
err = m.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (m miniProgramDo) FindInBatches(result *[]*model.MiniProgram, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return m.DO.FindInBatches(result, batchSize, fc)
}
func (m miniProgramDo) Attrs(attrs ...field.AssignExpr) *miniProgramDo {
return m.withDO(m.DO.Attrs(attrs...))
}
func (m miniProgramDo) Assign(attrs ...field.AssignExpr) *miniProgramDo {
return m.withDO(m.DO.Assign(attrs...))
}
func (m miniProgramDo) Joins(fields ...field.RelationField) *miniProgramDo {
for _, _f := range fields {
m = *m.withDO(m.DO.Joins(_f))
}
return &m
}
func (m miniProgramDo) Preload(fields ...field.RelationField) *miniProgramDo {
for _, _f := range fields {
m = *m.withDO(m.DO.Preload(_f))
}
return &m
}
func (m miniProgramDo) FirstOrInit() (*model.MiniProgram, error) {
if result, err := m.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*model.MiniProgram), nil
}
}
func (m miniProgramDo) FirstOrCreate() (*model.MiniProgram, error) {
if result, err := m.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*model.MiniProgram), nil
}
}
func (m miniProgramDo) FindByPage(offset int, limit int) (result []*model.MiniProgram, count int64, err error) {
result, err = m.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = m.Offset(-1).Limit(-1).Count()
return
}
func (m miniProgramDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = m.Count()
if err != nil {
return
}
err = m.Offset(offset).Limit(limit).Scan(result)
return
}
func (m miniProgramDo) Scan(result interface{}) (err error) {
return m.DO.Scan(result)
}
func (m miniProgramDo) Delete(models ...*model.MiniProgram) (result gen.ResultInfo, err error) {
return m.DO.Delete(models)
}
func (m *miniProgramDo) withDO(do gen.Dao) *miniProgramDo {
m.DO = *do.(*gen.DO)
return m
}

View File

@ -0,0 +1,332 @@
// 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 dao
import (
"context"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"mini-chat/internal/repository/mysql/model"
)
func newMiniprogramAccessToken(db *gorm.DB, opts ...gen.DOOption) miniprogramAccessToken {
_miniprogramAccessToken := miniprogramAccessToken{}
_miniprogramAccessToken.miniprogramAccessTokenDo.UseDB(db, opts...)
_miniprogramAccessToken.miniprogramAccessTokenDo.UseModel(&model.MiniprogramAccessToken{})
tableName := _miniprogramAccessToken.miniprogramAccessTokenDo.TableName()
_miniprogramAccessToken.ALL = field.NewAsterisk(tableName)
_miniprogramAccessToken.ID = field.NewInt32(tableName, "id")
_miniprogramAccessToken.AccessToken = field.NewString(tableName, "access_token")
_miniprogramAccessToken.CreatedAt = field.NewTime(tableName, "created_at")
_miniprogramAccessToken.ExpiredAt = field.NewTime(tableName, "expired_at")
_miniprogramAccessToken.fillFieldMap()
return _miniprogramAccessToken
}
// miniprogramAccessToken 小程序 access_token 表
type miniprogramAccessToken struct {
miniprogramAccessTokenDo
ALL field.Asterisk
ID field.Int32 // 主键
AccessToken field.String // access_token
CreatedAt field.Time // 创建时间
ExpiredAt field.Time // 过期时间
fieldMap map[string]field.Expr
}
func (m miniprogramAccessToken) Table(newTableName string) *miniprogramAccessToken {
m.miniprogramAccessTokenDo.UseTable(newTableName)
return m.updateTableName(newTableName)
}
func (m miniprogramAccessToken) As(alias string) *miniprogramAccessToken {
m.miniprogramAccessTokenDo.DO = *(m.miniprogramAccessTokenDo.As(alias).(*gen.DO))
return m.updateTableName(alias)
}
func (m *miniprogramAccessToken) updateTableName(table string) *miniprogramAccessToken {
m.ALL = field.NewAsterisk(table)
m.ID = field.NewInt32(table, "id")
m.AccessToken = field.NewString(table, "access_token")
m.CreatedAt = field.NewTime(table, "created_at")
m.ExpiredAt = field.NewTime(table, "expired_at")
m.fillFieldMap()
return m
}
func (m *miniprogramAccessToken) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := m.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (m *miniprogramAccessToken) fillFieldMap() {
m.fieldMap = make(map[string]field.Expr, 4)
m.fieldMap["id"] = m.ID
m.fieldMap["access_token"] = m.AccessToken
m.fieldMap["created_at"] = m.CreatedAt
m.fieldMap["expired_at"] = m.ExpiredAt
}
func (m miniprogramAccessToken) clone(db *gorm.DB) miniprogramAccessToken {
m.miniprogramAccessTokenDo.ReplaceConnPool(db.Statement.ConnPool)
return m
}
func (m miniprogramAccessToken) replaceDB(db *gorm.DB) miniprogramAccessToken {
m.miniprogramAccessTokenDo.ReplaceDB(db)
return m
}
type miniprogramAccessTokenDo struct{ gen.DO }
func (m miniprogramAccessTokenDo) Debug() *miniprogramAccessTokenDo {
return m.withDO(m.DO.Debug())
}
func (m miniprogramAccessTokenDo) WithContext(ctx context.Context) *miniprogramAccessTokenDo {
return m.withDO(m.DO.WithContext(ctx))
}
func (m miniprogramAccessTokenDo) ReadDB() *miniprogramAccessTokenDo {
return m.Clauses(dbresolver.Read)
}
func (m miniprogramAccessTokenDo) WriteDB() *miniprogramAccessTokenDo {
return m.Clauses(dbresolver.Write)
}
func (m miniprogramAccessTokenDo) Session(config *gorm.Session) *miniprogramAccessTokenDo {
return m.withDO(m.DO.Session(config))
}
func (m miniprogramAccessTokenDo) Clauses(conds ...clause.Expression) *miniprogramAccessTokenDo {
return m.withDO(m.DO.Clauses(conds...))
}
func (m miniprogramAccessTokenDo) Returning(value interface{}, columns ...string) *miniprogramAccessTokenDo {
return m.withDO(m.DO.Returning(value, columns...))
}
func (m miniprogramAccessTokenDo) Not(conds ...gen.Condition) *miniprogramAccessTokenDo {
return m.withDO(m.DO.Not(conds...))
}
func (m miniprogramAccessTokenDo) Or(conds ...gen.Condition) *miniprogramAccessTokenDo {
return m.withDO(m.DO.Or(conds...))
}
func (m miniprogramAccessTokenDo) Select(conds ...field.Expr) *miniprogramAccessTokenDo {
return m.withDO(m.DO.Select(conds...))
}
func (m miniprogramAccessTokenDo) Where(conds ...gen.Condition) *miniprogramAccessTokenDo {
return m.withDO(m.DO.Where(conds...))
}
func (m miniprogramAccessTokenDo) Order(conds ...field.Expr) *miniprogramAccessTokenDo {
return m.withDO(m.DO.Order(conds...))
}
func (m miniprogramAccessTokenDo) Distinct(cols ...field.Expr) *miniprogramAccessTokenDo {
return m.withDO(m.DO.Distinct(cols...))
}
func (m miniprogramAccessTokenDo) Omit(cols ...field.Expr) *miniprogramAccessTokenDo {
return m.withDO(m.DO.Omit(cols...))
}
func (m miniprogramAccessTokenDo) Join(table schema.Tabler, on ...field.Expr) *miniprogramAccessTokenDo {
return m.withDO(m.DO.Join(table, on...))
}
func (m miniprogramAccessTokenDo) LeftJoin(table schema.Tabler, on ...field.Expr) *miniprogramAccessTokenDo {
return m.withDO(m.DO.LeftJoin(table, on...))
}
func (m miniprogramAccessTokenDo) RightJoin(table schema.Tabler, on ...field.Expr) *miniprogramAccessTokenDo {
return m.withDO(m.DO.RightJoin(table, on...))
}
func (m miniprogramAccessTokenDo) Group(cols ...field.Expr) *miniprogramAccessTokenDo {
return m.withDO(m.DO.Group(cols...))
}
func (m miniprogramAccessTokenDo) Having(conds ...gen.Condition) *miniprogramAccessTokenDo {
return m.withDO(m.DO.Having(conds...))
}
func (m miniprogramAccessTokenDo) Limit(limit int) *miniprogramAccessTokenDo {
return m.withDO(m.DO.Limit(limit))
}
func (m miniprogramAccessTokenDo) Offset(offset int) *miniprogramAccessTokenDo {
return m.withDO(m.DO.Offset(offset))
}
func (m miniprogramAccessTokenDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *miniprogramAccessTokenDo {
return m.withDO(m.DO.Scopes(funcs...))
}
func (m miniprogramAccessTokenDo) Unscoped() *miniprogramAccessTokenDo {
return m.withDO(m.DO.Unscoped())
}
func (m miniprogramAccessTokenDo) Create(values ...*model.MiniprogramAccessToken) error {
if len(values) == 0 {
return nil
}
return m.DO.Create(values)
}
func (m miniprogramAccessTokenDo) CreateInBatches(values []*model.MiniprogramAccessToken, batchSize int) error {
return m.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (m miniprogramAccessTokenDo) Save(values ...*model.MiniprogramAccessToken) error {
if len(values) == 0 {
return nil
}
return m.DO.Save(values)
}
func (m miniprogramAccessTokenDo) First() (*model.MiniprogramAccessToken, error) {
if result, err := m.DO.First(); err != nil {
return nil, err
} else {
return result.(*model.MiniprogramAccessToken), nil
}
}
func (m miniprogramAccessTokenDo) Take() (*model.MiniprogramAccessToken, error) {
if result, err := m.DO.Take(); err != nil {
return nil, err
} else {
return result.(*model.MiniprogramAccessToken), nil
}
}
func (m miniprogramAccessTokenDo) Last() (*model.MiniprogramAccessToken, error) {
if result, err := m.DO.Last(); err != nil {
return nil, err
} else {
return result.(*model.MiniprogramAccessToken), nil
}
}
func (m miniprogramAccessTokenDo) Find() ([]*model.MiniprogramAccessToken, error) {
result, err := m.DO.Find()
return result.([]*model.MiniprogramAccessToken), err
}
func (m miniprogramAccessTokenDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.MiniprogramAccessToken, err error) {
buf := make([]*model.MiniprogramAccessToken, 0, batchSize)
err = m.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (m miniprogramAccessTokenDo) FindInBatches(result *[]*model.MiniprogramAccessToken, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return m.DO.FindInBatches(result, batchSize, fc)
}
func (m miniprogramAccessTokenDo) Attrs(attrs ...field.AssignExpr) *miniprogramAccessTokenDo {
return m.withDO(m.DO.Attrs(attrs...))
}
func (m miniprogramAccessTokenDo) Assign(attrs ...field.AssignExpr) *miniprogramAccessTokenDo {
return m.withDO(m.DO.Assign(attrs...))
}
func (m miniprogramAccessTokenDo) Joins(fields ...field.RelationField) *miniprogramAccessTokenDo {
for _, _f := range fields {
m = *m.withDO(m.DO.Joins(_f))
}
return &m
}
func (m miniprogramAccessTokenDo) Preload(fields ...field.RelationField) *miniprogramAccessTokenDo {
for _, _f := range fields {
m = *m.withDO(m.DO.Preload(_f))
}
return &m
}
func (m miniprogramAccessTokenDo) FirstOrInit() (*model.MiniprogramAccessToken, error) {
if result, err := m.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*model.MiniprogramAccessToken), nil
}
}
func (m miniprogramAccessTokenDo) FirstOrCreate() (*model.MiniprogramAccessToken, error) {
if result, err := m.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*model.MiniprogramAccessToken), nil
}
}
func (m miniprogramAccessTokenDo) FindByPage(offset int, limit int) (result []*model.MiniprogramAccessToken, count int64, err error) {
result, err = m.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = m.Offset(-1).Limit(-1).Count()
return
}
func (m miniprogramAccessTokenDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = m.Count()
if err != nil {
return
}
err = m.Offset(offset).Limit(limit).Scan(result)
return
}
func (m miniprogramAccessTokenDo) Scan(result interface{}) (err error) {
return m.DO.Scan(result)
}
func (m miniprogramAccessTokenDo) Delete(models ...*model.MiniprogramAccessToken) (result gen.ResultInfo, err error) {
return m.DO.Delete(models)
}
func (m *miniprogramAccessTokenDo) withDO(do gen.Dao) *miniprogramAccessTokenDo {
m.DO = *do.(*gen.DO)
return m
}

View File

@ -0,0 +1,440 @@
// 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 dao
import (
"context"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"mini-chat/internal/repository/mysql/model"
)
func newPatient(db *gorm.DB, opts ...gen.DOOption) patient {
_patient := patient{}
_patient.patientDo.UseDB(db, opts...)
_patient.patientDo.UseModel(&model.Patient{})
tableName := _patient.patientDo.TableName()
_patient.ALL = field.NewAsterisk(tableName)
_patient.ID = field.NewInt32(tableName, "id")
_patient.Mobile = field.NewString(tableName, "mobile")
_patient.Username = field.NewString(tableName, "username")
_patient.Sex = field.NewInt32(tableName, "sex")
_patient.Password = field.NewString(tableName, "password")
_patient.Avatar = field.NewString(tableName, "avatar")
_patient.IDNumber = field.NewString(tableName, "id_number")
_patient.Birthday = field.NewTime(tableName, "birthday")
_patient.BirthWeight = field.NewInt32(tableName, "birth_weight")
_patient.OperativeDate = field.NewTime(tableName, "operative_date")
_patient.NextFollowDate = field.NewTime(tableName, "next_follow_date")
_patient.ParityNumber = field.NewInt32(tableName, "parity_number")
_patient.BirthNumber = field.NewInt32(tableName, "birth_number")
_patient.ConceptionType = field.NewInt32(tableName, "conception_type")
_patient.GestationalWeek = field.NewInt32(tableName, "gestational_week")
_patient.PrenatalCheckType = field.NewInt32(tableName, "prenatal_check_type")
_patient.PrenatalCheckRemark = field.NewString(tableName, "prenatal_check_remark")
_patient.DeliveryType = field.NewInt32(tableName, "delivery_type")
_patient.RiskType = field.NewInt32(tableName, "risk_type")
_patient.RiskValue = field.NewString(tableName, "risk_value")
_patient.HeightGenerateCurveType = field.NewInt32(tableName, "height_generate_curve_type")
_patient.WeightGenerateCurveType = field.NewInt32(tableName, "weight_generate_curve_type")
_patient.LoginStatus = field.NewInt32(tableName, "login_status")
_patient.LastLoginTime = field.NewTime(tableName, "last_login_time")
_patient.LastLoginIP = field.NewString(tableName, "last_login_ip")
_patient.LastLoginHash = field.NewString(tableName, "last_login_hash")
_patient.WxUserID = field.NewString(tableName, "wx_user_id")
_patient.CreatedUser = field.NewString(tableName, "created_user")
_patient.CreatedAt = field.NewTime(tableName, "created_at")
_patient.UpdatedUser = field.NewString(tableName, "updated_user")
_patient.UpdatedAt = field.NewTime(tableName, "updated_at")
_patient.fillFieldMap()
return _patient
}
// patient 患者表
type patient struct {
patientDo
ALL field.Asterisk
ID field.Int32 // 主键
Mobile field.String // 手机号
Username field.String // 姓名
Sex field.Int32 // 性别(1:男 2:女)
Password field.String // 密码
Avatar field.String // 头像地址
IDNumber field.String // 身份证号
Birthday field.Time // 出生日期
BirthWeight field.Int32 // 出生体重(克)
OperativeDate field.Time // 手术日期
NextFollowDate field.Time // 下次随访时间
ParityNumber field.Int32 // 胎次(0:未知 1:1胎 2:胎 3:胎 4:≥4胎)
BirthNumber field.Int32 // 产次(0:未知 1:1产 2:2产 3:≥3产)
ConceptionType field.Int32 // 受孕方式(0:未知 1:自然受孕 2:辅助生殖技术)
GestationalWeek field.Int32 // 孕周
PrenatalCheckType field.Int32 // 产检是否异常(0:未知 1:有 2:无)
PrenatalCheckRemark field.String // 产检异常备注
DeliveryType field.Int32 // 分娩方式(0:未知 1:顺产 2:剖宫产)
RiskType field.Int32 // 风险类型(0:未知 1:低危 2:中危 3:高危)
RiskValue field.String // 风险值
HeightGenerateCurveType field.Int32 // 身高生长曲线类型(0:未知 1:轻度偏离 2:正常 3:重度偏离)
WeightGenerateCurveType field.Int32 // 体重生长曲线类型(0:未知 1:轻度偏离 2:正常 3:重度偏离)
LoginStatus field.Int32 // 登录状态(1:启用 0:禁用)
LastLoginTime field.Time // 最后一次登录时间
LastLoginIP field.String // 最后一次登录IP
LastLoginHash field.String // 最后一次登录 Hash
WxUserID field.String // 微信ID
CreatedUser field.String // 创建人
CreatedAt field.Time // 创建时间
UpdatedUser field.String // 更新人
UpdatedAt field.Time // 更新时间
fieldMap map[string]field.Expr
}
func (p patient) Table(newTableName string) *patient {
p.patientDo.UseTable(newTableName)
return p.updateTableName(newTableName)
}
func (p patient) As(alias string) *patient {
p.patientDo.DO = *(p.patientDo.As(alias).(*gen.DO))
return p.updateTableName(alias)
}
func (p *patient) updateTableName(table string) *patient {
p.ALL = field.NewAsterisk(table)
p.ID = field.NewInt32(table, "id")
p.Mobile = field.NewString(table, "mobile")
p.Username = field.NewString(table, "username")
p.Sex = field.NewInt32(table, "sex")
p.Password = field.NewString(table, "password")
p.Avatar = field.NewString(table, "avatar")
p.IDNumber = field.NewString(table, "id_number")
p.Birthday = field.NewTime(table, "birthday")
p.BirthWeight = field.NewInt32(table, "birth_weight")
p.OperativeDate = field.NewTime(table, "operative_date")
p.NextFollowDate = field.NewTime(table, "next_follow_date")
p.ParityNumber = field.NewInt32(table, "parity_number")
p.BirthNumber = field.NewInt32(table, "birth_number")
p.ConceptionType = field.NewInt32(table, "conception_type")
p.GestationalWeek = field.NewInt32(table, "gestational_week")
p.PrenatalCheckType = field.NewInt32(table, "prenatal_check_type")
p.PrenatalCheckRemark = field.NewString(table, "prenatal_check_remark")
p.DeliveryType = field.NewInt32(table, "delivery_type")
p.RiskType = field.NewInt32(table, "risk_type")
p.RiskValue = field.NewString(table, "risk_value")
p.HeightGenerateCurveType = field.NewInt32(table, "height_generate_curve_type")
p.WeightGenerateCurveType = field.NewInt32(table, "weight_generate_curve_type")
p.LoginStatus = field.NewInt32(table, "login_status")
p.LastLoginTime = field.NewTime(table, "last_login_time")
p.LastLoginIP = field.NewString(table, "last_login_ip")
p.LastLoginHash = field.NewString(table, "last_login_hash")
p.WxUserID = field.NewString(table, "wx_user_id")
p.CreatedUser = field.NewString(table, "created_user")
p.CreatedAt = field.NewTime(table, "created_at")
p.UpdatedUser = field.NewString(table, "updated_user")
p.UpdatedAt = field.NewTime(table, "updated_at")
p.fillFieldMap()
return p
}
func (p *patient) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := p.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (p *patient) fillFieldMap() {
p.fieldMap = make(map[string]field.Expr, 31)
p.fieldMap["id"] = p.ID
p.fieldMap["mobile"] = p.Mobile
p.fieldMap["username"] = p.Username
p.fieldMap["sex"] = p.Sex
p.fieldMap["password"] = p.Password
p.fieldMap["avatar"] = p.Avatar
p.fieldMap["id_number"] = p.IDNumber
p.fieldMap["birthday"] = p.Birthday
p.fieldMap["birth_weight"] = p.BirthWeight
p.fieldMap["operative_date"] = p.OperativeDate
p.fieldMap["next_follow_date"] = p.NextFollowDate
p.fieldMap["parity_number"] = p.ParityNumber
p.fieldMap["birth_number"] = p.BirthNumber
p.fieldMap["conception_type"] = p.ConceptionType
p.fieldMap["gestational_week"] = p.GestationalWeek
p.fieldMap["prenatal_check_type"] = p.PrenatalCheckType
p.fieldMap["prenatal_check_remark"] = p.PrenatalCheckRemark
p.fieldMap["delivery_type"] = p.DeliveryType
p.fieldMap["risk_type"] = p.RiskType
p.fieldMap["risk_value"] = p.RiskValue
p.fieldMap["height_generate_curve_type"] = p.HeightGenerateCurveType
p.fieldMap["weight_generate_curve_type"] = p.WeightGenerateCurveType
p.fieldMap["login_status"] = p.LoginStatus
p.fieldMap["last_login_time"] = p.LastLoginTime
p.fieldMap["last_login_ip"] = p.LastLoginIP
p.fieldMap["last_login_hash"] = p.LastLoginHash
p.fieldMap["wx_user_id"] = p.WxUserID
p.fieldMap["created_user"] = p.CreatedUser
p.fieldMap["created_at"] = p.CreatedAt
p.fieldMap["updated_user"] = p.UpdatedUser
p.fieldMap["updated_at"] = p.UpdatedAt
}
func (p patient) clone(db *gorm.DB) patient {
p.patientDo.ReplaceConnPool(db.Statement.ConnPool)
return p
}
func (p patient) replaceDB(db *gorm.DB) patient {
p.patientDo.ReplaceDB(db)
return p
}
type patientDo struct{ gen.DO }
func (p patientDo) Debug() *patientDo {
return p.withDO(p.DO.Debug())
}
func (p patientDo) WithContext(ctx context.Context) *patientDo {
return p.withDO(p.DO.WithContext(ctx))
}
func (p patientDo) ReadDB() *patientDo {
return p.Clauses(dbresolver.Read)
}
func (p patientDo) WriteDB() *patientDo {
return p.Clauses(dbresolver.Write)
}
func (p patientDo) Session(config *gorm.Session) *patientDo {
return p.withDO(p.DO.Session(config))
}
func (p patientDo) Clauses(conds ...clause.Expression) *patientDo {
return p.withDO(p.DO.Clauses(conds...))
}
func (p patientDo) Returning(value interface{}, columns ...string) *patientDo {
return p.withDO(p.DO.Returning(value, columns...))
}
func (p patientDo) Not(conds ...gen.Condition) *patientDo {
return p.withDO(p.DO.Not(conds...))
}
func (p patientDo) Or(conds ...gen.Condition) *patientDo {
return p.withDO(p.DO.Or(conds...))
}
func (p patientDo) Select(conds ...field.Expr) *patientDo {
return p.withDO(p.DO.Select(conds...))
}
func (p patientDo) Where(conds ...gen.Condition) *patientDo {
return p.withDO(p.DO.Where(conds...))
}
func (p patientDo) Order(conds ...field.Expr) *patientDo {
return p.withDO(p.DO.Order(conds...))
}
func (p patientDo) Distinct(cols ...field.Expr) *patientDo {
return p.withDO(p.DO.Distinct(cols...))
}
func (p patientDo) Omit(cols ...field.Expr) *patientDo {
return p.withDO(p.DO.Omit(cols...))
}
func (p patientDo) Join(table schema.Tabler, on ...field.Expr) *patientDo {
return p.withDO(p.DO.Join(table, on...))
}
func (p patientDo) LeftJoin(table schema.Tabler, on ...field.Expr) *patientDo {
return p.withDO(p.DO.LeftJoin(table, on...))
}
func (p patientDo) RightJoin(table schema.Tabler, on ...field.Expr) *patientDo {
return p.withDO(p.DO.RightJoin(table, on...))
}
func (p patientDo) Group(cols ...field.Expr) *patientDo {
return p.withDO(p.DO.Group(cols...))
}
func (p patientDo) Having(conds ...gen.Condition) *patientDo {
return p.withDO(p.DO.Having(conds...))
}
func (p patientDo) Limit(limit int) *patientDo {
return p.withDO(p.DO.Limit(limit))
}
func (p patientDo) Offset(offset int) *patientDo {
return p.withDO(p.DO.Offset(offset))
}
func (p patientDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *patientDo {
return p.withDO(p.DO.Scopes(funcs...))
}
func (p patientDo) Unscoped() *patientDo {
return p.withDO(p.DO.Unscoped())
}
func (p patientDo) Create(values ...*model.Patient) error {
if len(values) == 0 {
return nil
}
return p.DO.Create(values)
}
func (p patientDo) CreateInBatches(values []*model.Patient, batchSize int) error {
return p.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (p patientDo) Save(values ...*model.Patient) error {
if len(values) == 0 {
return nil
}
return p.DO.Save(values)
}
func (p patientDo) First() (*model.Patient, error) {
if result, err := p.DO.First(); err != nil {
return nil, err
} else {
return result.(*model.Patient), nil
}
}
func (p patientDo) Take() (*model.Patient, error) {
if result, err := p.DO.Take(); err != nil {
return nil, err
} else {
return result.(*model.Patient), nil
}
}
func (p patientDo) Last() (*model.Patient, error) {
if result, err := p.DO.Last(); err != nil {
return nil, err
} else {
return result.(*model.Patient), nil
}
}
func (p patientDo) Find() ([]*model.Patient, error) {
result, err := p.DO.Find()
return result.([]*model.Patient), err
}
func (p patientDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.Patient, err error) {
buf := make([]*model.Patient, 0, batchSize)
err = p.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (p patientDo) FindInBatches(result *[]*model.Patient, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return p.DO.FindInBatches(result, batchSize, fc)
}
func (p patientDo) Attrs(attrs ...field.AssignExpr) *patientDo {
return p.withDO(p.DO.Attrs(attrs...))
}
func (p patientDo) Assign(attrs ...field.AssignExpr) *patientDo {
return p.withDO(p.DO.Assign(attrs...))
}
func (p patientDo) Joins(fields ...field.RelationField) *patientDo {
for _, _f := range fields {
p = *p.withDO(p.DO.Joins(_f))
}
return &p
}
func (p patientDo) Preload(fields ...field.RelationField) *patientDo {
for _, _f := range fields {
p = *p.withDO(p.DO.Preload(_f))
}
return &p
}
func (p patientDo) FirstOrInit() (*model.Patient, error) {
if result, err := p.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*model.Patient), nil
}
}
func (p patientDo) FirstOrCreate() (*model.Patient, error) {
if result, err := p.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*model.Patient), nil
}
}
func (p patientDo) FindByPage(offset int, limit int) (result []*model.Patient, count int64, err error) {
result, err = p.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = p.Offset(-1).Limit(-1).Count()
return
}
func (p patientDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = p.Count()
if err != nil {
return
}
err = p.Offset(offset).Limit(limit).Scan(result)
return
}
func (p patientDo) Scan(result interface{}) (err error) {
return p.DO.Scan(result)
}
func (p patientDo) Delete(models ...*model.Patient) (result gen.ResultInfo, err error) {
return p.DO.Delete(models)
}
func (p *patientDo) withDO(do gen.Dao) *patientDo {
p.DO = *do.(*gen.DO)
return p
}

View File

@ -0,0 +1,348 @@
// 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 dao
import (
"context"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"mini-chat/internal/repository/mysql/model"
)
func newPatientEmergencySymptom(db *gorm.DB, opts ...gen.DOOption) patientEmergencySymptom {
_patientEmergencySymptom := patientEmergencySymptom{}
_patientEmergencySymptom.patientEmergencySymptomDo.UseDB(db, opts...)
_patientEmergencySymptom.patientEmergencySymptomDo.UseModel(&model.PatientEmergencySymptom{})
tableName := _patientEmergencySymptom.patientEmergencySymptomDo.TableName()
_patientEmergencySymptom.ALL = field.NewAsterisk(tableName)
_patientEmergencySymptom.ID = field.NewInt32(tableName, "id")
_patientEmergencySymptom.PatientID = field.NewInt32(tableName, "patient_id")
_patientEmergencySymptom.Symptom = field.NewString(tableName, "symptom")
_patientEmergencySymptom.Conclusion = field.NewString(tableName, "conclusion")
_patientEmergencySymptom.CreatedUser = field.NewString(tableName, "created_user")
_patientEmergencySymptom.CreatedAt = field.NewTime(tableName, "created_at")
_patientEmergencySymptom.UpdatedUser = field.NewString(tableName, "updated_user")
_patientEmergencySymptom.UpdatedAt = field.NewTime(tableName, "updated_at")
_patientEmergencySymptom.fillFieldMap()
return _patientEmergencySymptom
}
// patientEmergencySymptom 患者紧急症状表
type patientEmergencySymptom struct {
patientEmergencySymptomDo
ALL field.Asterisk
ID field.Int32 // 主键
PatientID field.Int32 // 患者ID
Symptom field.String // 症状信息(JSON格式)
Conclusion field.String // 结论
CreatedUser field.String // 创建人
CreatedAt field.Time // 创建时间
UpdatedUser field.String // 更新人
UpdatedAt field.Time // 更新时间
fieldMap map[string]field.Expr
}
func (p patientEmergencySymptom) Table(newTableName string) *patientEmergencySymptom {
p.patientEmergencySymptomDo.UseTable(newTableName)
return p.updateTableName(newTableName)
}
func (p patientEmergencySymptom) As(alias string) *patientEmergencySymptom {
p.patientEmergencySymptomDo.DO = *(p.patientEmergencySymptomDo.As(alias).(*gen.DO))
return p.updateTableName(alias)
}
func (p *patientEmergencySymptom) updateTableName(table string) *patientEmergencySymptom {
p.ALL = field.NewAsterisk(table)
p.ID = field.NewInt32(table, "id")
p.PatientID = field.NewInt32(table, "patient_id")
p.Symptom = field.NewString(table, "symptom")
p.Conclusion = field.NewString(table, "conclusion")
p.CreatedUser = field.NewString(table, "created_user")
p.CreatedAt = field.NewTime(table, "created_at")
p.UpdatedUser = field.NewString(table, "updated_user")
p.UpdatedAt = field.NewTime(table, "updated_at")
p.fillFieldMap()
return p
}
func (p *patientEmergencySymptom) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := p.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (p *patientEmergencySymptom) fillFieldMap() {
p.fieldMap = make(map[string]field.Expr, 8)
p.fieldMap["id"] = p.ID
p.fieldMap["patient_id"] = p.PatientID
p.fieldMap["symptom"] = p.Symptom
p.fieldMap["conclusion"] = p.Conclusion
p.fieldMap["created_user"] = p.CreatedUser
p.fieldMap["created_at"] = p.CreatedAt
p.fieldMap["updated_user"] = p.UpdatedUser
p.fieldMap["updated_at"] = p.UpdatedAt
}
func (p patientEmergencySymptom) clone(db *gorm.DB) patientEmergencySymptom {
p.patientEmergencySymptomDo.ReplaceConnPool(db.Statement.ConnPool)
return p
}
func (p patientEmergencySymptom) replaceDB(db *gorm.DB) patientEmergencySymptom {
p.patientEmergencySymptomDo.ReplaceDB(db)
return p
}
type patientEmergencySymptomDo struct{ gen.DO }
func (p patientEmergencySymptomDo) Debug() *patientEmergencySymptomDo {
return p.withDO(p.DO.Debug())
}
func (p patientEmergencySymptomDo) WithContext(ctx context.Context) *patientEmergencySymptomDo {
return p.withDO(p.DO.WithContext(ctx))
}
func (p patientEmergencySymptomDo) ReadDB() *patientEmergencySymptomDo {
return p.Clauses(dbresolver.Read)
}
func (p patientEmergencySymptomDo) WriteDB() *patientEmergencySymptomDo {
return p.Clauses(dbresolver.Write)
}
func (p patientEmergencySymptomDo) Session(config *gorm.Session) *patientEmergencySymptomDo {
return p.withDO(p.DO.Session(config))
}
func (p patientEmergencySymptomDo) Clauses(conds ...clause.Expression) *patientEmergencySymptomDo {
return p.withDO(p.DO.Clauses(conds...))
}
func (p patientEmergencySymptomDo) Returning(value interface{}, columns ...string) *patientEmergencySymptomDo {
return p.withDO(p.DO.Returning(value, columns...))
}
func (p patientEmergencySymptomDo) Not(conds ...gen.Condition) *patientEmergencySymptomDo {
return p.withDO(p.DO.Not(conds...))
}
func (p patientEmergencySymptomDo) Or(conds ...gen.Condition) *patientEmergencySymptomDo {
return p.withDO(p.DO.Or(conds...))
}
func (p patientEmergencySymptomDo) Select(conds ...field.Expr) *patientEmergencySymptomDo {
return p.withDO(p.DO.Select(conds...))
}
func (p patientEmergencySymptomDo) Where(conds ...gen.Condition) *patientEmergencySymptomDo {
return p.withDO(p.DO.Where(conds...))
}
func (p patientEmergencySymptomDo) Order(conds ...field.Expr) *patientEmergencySymptomDo {
return p.withDO(p.DO.Order(conds...))
}
func (p patientEmergencySymptomDo) Distinct(cols ...field.Expr) *patientEmergencySymptomDo {
return p.withDO(p.DO.Distinct(cols...))
}
func (p patientEmergencySymptomDo) Omit(cols ...field.Expr) *patientEmergencySymptomDo {
return p.withDO(p.DO.Omit(cols...))
}
func (p patientEmergencySymptomDo) Join(table schema.Tabler, on ...field.Expr) *patientEmergencySymptomDo {
return p.withDO(p.DO.Join(table, on...))
}
func (p patientEmergencySymptomDo) LeftJoin(table schema.Tabler, on ...field.Expr) *patientEmergencySymptomDo {
return p.withDO(p.DO.LeftJoin(table, on...))
}
func (p patientEmergencySymptomDo) RightJoin(table schema.Tabler, on ...field.Expr) *patientEmergencySymptomDo {
return p.withDO(p.DO.RightJoin(table, on...))
}
func (p patientEmergencySymptomDo) Group(cols ...field.Expr) *patientEmergencySymptomDo {
return p.withDO(p.DO.Group(cols...))
}
func (p patientEmergencySymptomDo) Having(conds ...gen.Condition) *patientEmergencySymptomDo {
return p.withDO(p.DO.Having(conds...))
}
func (p patientEmergencySymptomDo) Limit(limit int) *patientEmergencySymptomDo {
return p.withDO(p.DO.Limit(limit))
}
func (p patientEmergencySymptomDo) Offset(offset int) *patientEmergencySymptomDo {
return p.withDO(p.DO.Offset(offset))
}
func (p patientEmergencySymptomDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *patientEmergencySymptomDo {
return p.withDO(p.DO.Scopes(funcs...))
}
func (p patientEmergencySymptomDo) Unscoped() *patientEmergencySymptomDo {
return p.withDO(p.DO.Unscoped())
}
func (p patientEmergencySymptomDo) Create(values ...*model.PatientEmergencySymptom) error {
if len(values) == 0 {
return nil
}
return p.DO.Create(values)
}
func (p patientEmergencySymptomDo) CreateInBatches(values []*model.PatientEmergencySymptom, batchSize int) error {
return p.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (p patientEmergencySymptomDo) Save(values ...*model.PatientEmergencySymptom) error {
if len(values) == 0 {
return nil
}
return p.DO.Save(values)
}
func (p patientEmergencySymptomDo) First() (*model.PatientEmergencySymptom, error) {
if result, err := p.DO.First(); err != nil {
return nil, err
} else {
return result.(*model.PatientEmergencySymptom), nil
}
}
func (p patientEmergencySymptomDo) Take() (*model.PatientEmergencySymptom, error) {
if result, err := p.DO.Take(); err != nil {
return nil, err
} else {
return result.(*model.PatientEmergencySymptom), nil
}
}
func (p patientEmergencySymptomDo) Last() (*model.PatientEmergencySymptom, error) {
if result, err := p.DO.Last(); err != nil {
return nil, err
} else {
return result.(*model.PatientEmergencySymptom), nil
}
}
func (p patientEmergencySymptomDo) Find() ([]*model.PatientEmergencySymptom, error) {
result, err := p.DO.Find()
return result.([]*model.PatientEmergencySymptom), err
}
func (p patientEmergencySymptomDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.PatientEmergencySymptom, err error) {
buf := make([]*model.PatientEmergencySymptom, 0, batchSize)
err = p.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (p patientEmergencySymptomDo) FindInBatches(result *[]*model.PatientEmergencySymptom, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return p.DO.FindInBatches(result, batchSize, fc)
}
func (p patientEmergencySymptomDo) Attrs(attrs ...field.AssignExpr) *patientEmergencySymptomDo {
return p.withDO(p.DO.Attrs(attrs...))
}
func (p patientEmergencySymptomDo) Assign(attrs ...field.AssignExpr) *patientEmergencySymptomDo {
return p.withDO(p.DO.Assign(attrs...))
}
func (p patientEmergencySymptomDo) Joins(fields ...field.RelationField) *patientEmergencySymptomDo {
for _, _f := range fields {
p = *p.withDO(p.DO.Joins(_f))
}
return &p
}
func (p patientEmergencySymptomDo) Preload(fields ...field.RelationField) *patientEmergencySymptomDo {
for _, _f := range fields {
p = *p.withDO(p.DO.Preload(_f))
}
return &p
}
func (p patientEmergencySymptomDo) FirstOrInit() (*model.PatientEmergencySymptom, error) {
if result, err := p.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*model.PatientEmergencySymptom), nil
}
}
func (p patientEmergencySymptomDo) FirstOrCreate() (*model.PatientEmergencySymptom, error) {
if result, err := p.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*model.PatientEmergencySymptom), nil
}
}
func (p patientEmergencySymptomDo) FindByPage(offset int, limit int) (result []*model.PatientEmergencySymptom, count int64, err error) {
result, err = p.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = p.Offset(-1).Limit(-1).Count()
return
}
func (p patientEmergencySymptomDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = p.Count()
if err != nil {
return
}
err = p.Offset(offset).Limit(limit).Scan(result)
return
}
func (p patientEmergencySymptomDo) Scan(result interface{}) (err error) {
return p.DO.Scan(result)
}
func (p patientEmergencySymptomDo) Delete(models ...*model.PatientEmergencySymptom) (result gen.ResultInfo, err error) {
return p.DO.Delete(models)
}
func (p *patientEmergencySymptomDo) withDO(do gen.Dao) *patientEmergencySymptomDo {
p.DO = *do.(*gen.DO)
return p
}

View File

@ -0,0 +1,352 @@
// 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 dao
import (
"context"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"mini-chat/internal/repository/mysql/model"
)
func newPatientFollowPlan(db *gorm.DB, opts ...gen.DOOption) patientFollowPlan {
_patientFollowPlan := patientFollowPlan{}
_patientFollowPlan.patientFollowPlanDo.UseDB(db, opts...)
_patientFollowPlan.patientFollowPlanDo.UseModel(&model.PatientFollowPlan{})
tableName := _patientFollowPlan.patientFollowPlanDo.TableName()
_patientFollowPlan.ALL = field.NewAsterisk(tableName)
_patientFollowPlan.ID = field.NewInt32(tableName, "id")
_patientFollowPlan.PatientID = field.NewInt32(tableName, "patient_id")
_patientFollowPlan.PlanName = field.NewString(tableName, "plan_name")
_patientFollowPlan.PlanDate = field.NewTime(tableName, "plan_date")
_patientFollowPlan.Status = field.NewInt32(tableName, "status")
_patientFollowPlan.CreatedUser = field.NewString(tableName, "created_user")
_patientFollowPlan.CreatedAt = field.NewTime(tableName, "created_at")
_patientFollowPlan.UpdatedUser = field.NewString(tableName, "updated_user")
_patientFollowPlan.UpdatedAt = field.NewTime(tableName, "updated_at")
_patientFollowPlan.fillFieldMap()
return _patientFollowPlan
}
// patientFollowPlan 患者随访计划表
type patientFollowPlan struct {
patientFollowPlanDo
ALL field.Asterisk
ID field.Int32 // 主键
PatientID field.Int32 // 患者ID
PlanName field.String // 计划名称
PlanDate field.Time // 计划时间
Status field.Int32 // 完成状态(1:未完成 2:已完成)
CreatedUser field.String // 创建人
CreatedAt field.Time // 创建时间
UpdatedUser field.String // 更新人
UpdatedAt field.Time // 更新时间
fieldMap map[string]field.Expr
}
func (p patientFollowPlan) Table(newTableName string) *patientFollowPlan {
p.patientFollowPlanDo.UseTable(newTableName)
return p.updateTableName(newTableName)
}
func (p patientFollowPlan) As(alias string) *patientFollowPlan {
p.patientFollowPlanDo.DO = *(p.patientFollowPlanDo.As(alias).(*gen.DO))
return p.updateTableName(alias)
}
func (p *patientFollowPlan) updateTableName(table string) *patientFollowPlan {
p.ALL = field.NewAsterisk(table)
p.ID = field.NewInt32(table, "id")
p.PatientID = field.NewInt32(table, "patient_id")
p.PlanName = field.NewString(table, "plan_name")
p.PlanDate = field.NewTime(table, "plan_date")
p.Status = field.NewInt32(table, "status")
p.CreatedUser = field.NewString(table, "created_user")
p.CreatedAt = field.NewTime(table, "created_at")
p.UpdatedUser = field.NewString(table, "updated_user")
p.UpdatedAt = field.NewTime(table, "updated_at")
p.fillFieldMap()
return p
}
func (p *patientFollowPlan) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := p.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (p *patientFollowPlan) fillFieldMap() {
p.fieldMap = make(map[string]field.Expr, 9)
p.fieldMap["id"] = p.ID
p.fieldMap["patient_id"] = p.PatientID
p.fieldMap["plan_name"] = p.PlanName
p.fieldMap["plan_date"] = p.PlanDate
p.fieldMap["status"] = p.Status
p.fieldMap["created_user"] = p.CreatedUser
p.fieldMap["created_at"] = p.CreatedAt
p.fieldMap["updated_user"] = p.UpdatedUser
p.fieldMap["updated_at"] = p.UpdatedAt
}
func (p patientFollowPlan) clone(db *gorm.DB) patientFollowPlan {
p.patientFollowPlanDo.ReplaceConnPool(db.Statement.ConnPool)
return p
}
func (p patientFollowPlan) replaceDB(db *gorm.DB) patientFollowPlan {
p.patientFollowPlanDo.ReplaceDB(db)
return p
}
type patientFollowPlanDo struct{ gen.DO }
func (p patientFollowPlanDo) Debug() *patientFollowPlanDo {
return p.withDO(p.DO.Debug())
}
func (p patientFollowPlanDo) WithContext(ctx context.Context) *patientFollowPlanDo {
return p.withDO(p.DO.WithContext(ctx))
}
func (p patientFollowPlanDo) ReadDB() *patientFollowPlanDo {
return p.Clauses(dbresolver.Read)
}
func (p patientFollowPlanDo) WriteDB() *patientFollowPlanDo {
return p.Clauses(dbresolver.Write)
}
func (p patientFollowPlanDo) Session(config *gorm.Session) *patientFollowPlanDo {
return p.withDO(p.DO.Session(config))
}
func (p patientFollowPlanDo) Clauses(conds ...clause.Expression) *patientFollowPlanDo {
return p.withDO(p.DO.Clauses(conds...))
}
func (p patientFollowPlanDo) Returning(value interface{}, columns ...string) *patientFollowPlanDo {
return p.withDO(p.DO.Returning(value, columns...))
}
func (p patientFollowPlanDo) Not(conds ...gen.Condition) *patientFollowPlanDo {
return p.withDO(p.DO.Not(conds...))
}
func (p patientFollowPlanDo) Or(conds ...gen.Condition) *patientFollowPlanDo {
return p.withDO(p.DO.Or(conds...))
}
func (p patientFollowPlanDo) Select(conds ...field.Expr) *patientFollowPlanDo {
return p.withDO(p.DO.Select(conds...))
}
func (p patientFollowPlanDo) Where(conds ...gen.Condition) *patientFollowPlanDo {
return p.withDO(p.DO.Where(conds...))
}
func (p patientFollowPlanDo) Order(conds ...field.Expr) *patientFollowPlanDo {
return p.withDO(p.DO.Order(conds...))
}
func (p patientFollowPlanDo) Distinct(cols ...field.Expr) *patientFollowPlanDo {
return p.withDO(p.DO.Distinct(cols...))
}
func (p patientFollowPlanDo) Omit(cols ...field.Expr) *patientFollowPlanDo {
return p.withDO(p.DO.Omit(cols...))
}
func (p patientFollowPlanDo) Join(table schema.Tabler, on ...field.Expr) *patientFollowPlanDo {
return p.withDO(p.DO.Join(table, on...))
}
func (p patientFollowPlanDo) LeftJoin(table schema.Tabler, on ...field.Expr) *patientFollowPlanDo {
return p.withDO(p.DO.LeftJoin(table, on...))
}
func (p patientFollowPlanDo) RightJoin(table schema.Tabler, on ...field.Expr) *patientFollowPlanDo {
return p.withDO(p.DO.RightJoin(table, on...))
}
func (p patientFollowPlanDo) Group(cols ...field.Expr) *patientFollowPlanDo {
return p.withDO(p.DO.Group(cols...))
}
func (p patientFollowPlanDo) Having(conds ...gen.Condition) *patientFollowPlanDo {
return p.withDO(p.DO.Having(conds...))
}
func (p patientFollowPlanDo) Limit(limit int) *patientFollowPlanDo {
return p.withDO(p.DO.Limit(limit))
}
func (p patientFollowPlanDo) Offset(offset int) *patientFollowPlanDo {
return p.withDO(p.DO.Offset(offset))
}
func (p patientFollowPlanDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *patientFollowPlanDo {
return p.withDO(p.DO.Scopes(funcs...))
}
func (p patientFollowPlanDo) Unscoped() *patientFollowPlanDo {
return p.withDO(p.DO.Unscoped())
}
func (p patientFollowPlanDo) Create(values ...*model.PatientFollowPlan) error {
if len(values) == 0 {
return nil
}
return p.DO.Create(values)
}
func (p patientFollowPlanDo) CreateInBatches(values []*model.PatientFollowPlan, batchSize int) error {
return p.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (p patientFollowPlanDo) Save(values ...*model.PatientFollowPlan) error {
if len(values) == 0 {
return nil
}
return p.DO.Save(values)
}
func (p patientFollowPlanDo) First() (*model.PatientFollowPlan, error) {
if result, err := p.DO.First(); err != nil {
return nil, err
} else {
return result.(*model.PatientFollowPlan), nil
}
}
func (p patientFollowPlanDo) Take() (*model.PatientFollowPlan, error) {
if result, err := p.DO.Take(); err != nil {
return nil, err
} else {
return result.(*model.PatientFollowPlan), nil
}
}
func (p patientFollowPlanDo) Last() (*model.PatientFollowPlan, error) {
if result, err := p.DO.Last(); err != nil {
return nil, err
} else {
return result.(*model.PatientFollowPlan), nil
}
}
func (p patientFollowPlanDo) Find() ([]*model.PatientFollowPlan, error) {
result, err := p.DO.Find()
return result.([]*model.PatientFollowPlan), err
}
func (p patientFollowPlanDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.PatientFollowPlan, err error) {
buf := make([]*model.PatientFollowPlan, 0, batchSize)
err = p.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (p patientFollowPlanDo) FindInBatches(result *[]*model.PatientFollowPlan, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return p.DO.FindInBatches(result, batchSize, fc)
}
func (p patientFollowPlanDo) Attrs(attrs ...field.AssignExpr) *patientFollowPlanDo {
return p.withDO(p.DO.Attrs(attrs...))
}
func (p patientFollowPlanDo) Assign(attrs ...field.AssignExpr) *patientFollowPlanDo {
return p.withDO(p.DO.Assign(attrs...))
}
func (p patientFollowPlanDo) Joins(fields ...field.RelationField) *patientFollowPlanDo {
for _, _f := range fields {
p = *p.withDO(p.DO.Joins(_f))
}
return &p
}
func (p patientFollowPlanDo) Preload(fields ...field.RelationField) *patientFollowPlanDo {
for _, _f := range fields {
p = *p.withDO(p.DO.Preload(_f))
}
return &p
}
func (p patientFollowPlanDo) FirstOrInit() (*model.PatientFollowPlan, error) {
if result, err := p.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*model.PatientFollowPlan), nil
}
}
func (p patientFollowPlanDo) FirstOrCreate() (*model.PatientFollowPlan, error) {
if result, err := p.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*model.PatientFollowPlan), nil
}
}
func (p patientFollowPlanDo) FindByPage(offset int, limit int) (result []*model.PatientFollowPlan, count int64, err error) {
result, err = p.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = p.Offset(-1).Limit(-1).Count()
return
}
func (p patientFollowPlanDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = p.Count()
if err != nil {
return
}
err = p.Offset(offset).Limit(limit).Scan(result)
return
}
func (p patientFollowPlanDo) Scan(result interface{}) (err error) {
return p.DO.Scan(result)
}
func (p patientFollowPlanDo) Delete(models ...*model.PatientFollowPlan) (result gen.ResultInfo, err error) {
return p.DO.Delete(models)
}
func (p *patientFollowPlanDo) withDO(do gen.Dao) *patientFollowPlanDo {
p.DO = *do.(*gen.DO)
return p
}

View File

@ -0,0 +1,568 @@
// 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 dao
import (
"context"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"mini-chat/internal/repository/mysql/model"
)
func newPatientFollowQuestionnaire(db *gorm.DB, opts ...gen.DOOption) patientFollowQuestionnaire {
_patientFollowQuestionnaire := patientFollowQuestionnaire{}
_patientFollowQuestionnaire.patientFollowQuestionnaireDo.UseDB(db, opts...)
_patientFollowQuestionnaire.patientFollowQuestionnaireDo.UseModel(&model.PatientFollowQuestionnaire{})
tableName := _patientFollowQuestionnaire.patientFollowQuestionnaireDo.TableName()
_patientFollowQuestionnaire.ALL = field.NewAsterisk(tableName)
_patientFollowQuestionnaire.ID = field.NewInt32(tableName, "id")
_patientFollowQuestionnaire.PatientID = field.NewInt32(tableName, "patient_id")
_patientFollowQuestionnaire.PlanID = field.NewInt32(tableName, "plan_id")
_patientFollowQuestionnaire.FollowName = field.NewString(tableName, "follow_name")
_patientFollowQuestionnaire.FollowDate = field.NewTime(tableName, "follow_date")
_patientFollowQuestionnaire.FollowHospital = field.NewString(tableName, "follow_hospital")
_patientFollowQuestionnaire.Height = field.NewString(tableName, "height")
_patientFollowQuestionnaire.Weight = field.NewString(tableName, "weight")
_patientFollowQuestionnaire.HeadCircumference = field.NewString(tableName, "head_circumference")
_patientFollowQuestionnaire.HighHip = field.NewString(tableName, "high_hip")
_patientFollowQuestionnaire.LiverFunctionImage = field.NewString(tableName, "liver_function_image")
_patientFollowQuestionnaire.TotalBilirubin = field.NewString(tableName, "total_bilirubin")
_patientFollowQuestionnaire.DirectBilirubin = field.NewString(tableName, "direct_bilirubin")
_patientFollowQuestionnaire.TotalBileAcid = field.NewString(tableName, "total_bile_acid")
_patientFollowQuestionnaire.Albumin = field.NewString(tableName, "albumin")
_patientFollowQuestionnaire.GrainGrass = field.NewString(tableName, "grain_grass")
_patientFollowQuestionnaire.GuBing = field.NewString(tableName, "gu_bing")
_patientFollowQuestionnaire.Ggt = field.NewString(tableName, "ggt")
_patientFollowQuestionnaire.Alp = field.NewString(tableName, "alp")
_patientFollowQuestionnaire.CoagulationFunctionImage = field.NewString(tableName, "coagulation_function_image")
_patientFollowQuestionnaire.Crp = field.NewString(tableName, "crp")
_patientFollowQuestionnaire.Ddr = field.NewString(tableName, "ddr")
_patientFollowQuestionnaire.Inr = field.NewString(tableName, "inr")
_patientFollowQuestionnaire.Pt = field.NewString(tableName, "pt")
_patientFollowQuestionnaire.Pta = field.NewString(tableName, "pta")
_patientFollowQuestionnaire.Aptt = field.NewString(tableName, "aptt")
_patientFollowQuestionnaire.Tt = field.NewString(tableName, "tt")
_patientFollowQuestionnaire.Fib = field.NewString(tableName, "fib")
_patientFollowQuestionnaire.Npdp = field.NewString(tableName, "npdp")
_patientFollowQuestionnaire.Mmp7 = field.NewString(tableName, "mmp_7")
_patientFollowQuestionnaire.BloodRoutineImage = field.NewString(tableName, "blood_routine_image")
_patientFollowQuestionnaire.Platelets = field.NewString(tableName, "platelets")
_patientFollowQuestionnaire.Hemoglobin = field.NewString(tableName, "hemoglobin")
_patientFollowQuestionnaire.WhiteBloodCells = field.NewString(tableName, "white_blood_cells")
_patientFollowQuestionnaire.RedBloodCells = field.NewString(tableName, "red_blood_cells")
_patientFollowQuestionnaire.NutritionalIndicatorImage = field.NewString(tableName, "nutritional_indicator_image")
_patientFollowQuestionnaire.OhD3 = field.NewString(tableName, "oh_d3")
_patientFollowQuestionnaire.OhD2 = field.NewString(tableName, "oh_d2")
_patientFollowQuestionnaire.OhD = field.NewString(tableName, "oh_d")
_patientFollowQuestionnaire.VitaminA = field.NewString(tableName, "vitamin_a")
_patientFollowQuestionnaire.VitaminK = field.NewString(tableName, "vitamin_k")
_patientFollowQuestionnaire.VitaminE = field.NewString(tableName, "vitamin_e")
_patientFollowQuestionnaire.BModeImage = field.NewString(tableName, "b_mode_image")
_patientFollowQuestionnaire.UnderTheLiverRib = field.NewString(tableName, "under_the_liver_rib")
_patientFollowQuestionnaire.UnderTheXiphoidLiver = field.NewString(tableName, "under_the_xiphoid_liver")
_patientFollowQuestionnaire.SpleenRibArea = field.NewString(tableName, "spleen_rib_area")
_patientFollowQuestionnaire.MainPortalVein = field.NewString(tableName, "main_portal_vein")
_patientFollowQuestionnaire.LiverEcho = field.NewString(tableName, "liver_echo")
_patientFollowQuestionnaire.GallbladderSize = field.NewString(tableName, "gallbladder_size")
_patientFollowQuestionnaire.CommonBileDuct = field.NewString(tableName, "common_bile_duct")
_patientFollowQuestionnaire.FiberBlockSize = field.NewString(tableName, "fiber_block_size")
_patientFollowQuestionnaire.Pvv = field.NewString(tableName, "pvv")
_patientFollowQuestionnaire.LiverElasticityValue = field.NewString(tableName, "liver_elasticity_value")
_patientFollowQuestionnaire.IsHaveCyst = field.NewInt32(tableName, "is_have_cyst")
_patientFollowQuestionnaire.IsHaveAscites = field.NewInt32(tableName, "is_have_ascites")
_patientFollowQuestionnaire.ElastographyMinimum = field.NewString(tableName, "elastography_minimum")
_patientFollowQuestionnaire.ElastographyMaximum = field.NewString(tableName, "elastography_maximum")
_patientFollowQuestionnaire.ElastographyMedian = field.NewString(tableName, "elastography_median")
_patientFollowQuestionnaire.MdtImage = field.NewString(tableName, "mdt_image")
_patientFollowQuestionnaire.CreatedUser = field.NewString(tableName, "created_user")
_patientFollowQuestionnaire.CreatedAt = field.NewTime(tableName, "created_at")
_patientFollowQuestionnaire.UpdatedUser = field.NewString(tableName, "updated_user")
_patientFollowQuestionnaire.UpdatedAt = field.NewTime(tableName, "updated_at")
_patientFollowQuestionnaire.fillFieldMap()
return _patientFollowQuestionnaire
}
// patientFollowQuestionnaire 患者随访问卷表
type patientFollowQuestionnaire struct {
patientFollowQuestionnaireDo
ALL field.Asterisk
ID field.Int32 // 主键
PatientID field.Int32 // 患者ID
PlanID field.Int32 // 随访计划ID
FollowName field.String // 随访名称
FollowDate field.Time // 随访日期
FollowHospital field.String // 随访医院
Height field.String // 身高(CM)
Weight field.String // 体重(KG)
HeadCircumference field.String // 头围(CM)
HighHip field.String // 上臀围(CM)
LiverFunctionImage field.String // 肝功能检查报告(多张用,分割)
TotalBilirubin field.String // 总胆红素µmol/L)
DirectBilirubin field.String // 直接胆红素µmol/L)
TotalBileAcid field.String // 总胆汁酸g/L
Albumin field.String // 白蛋白g/L
GrainGrass field.String // 谷草U/L
GuBing field.String // 谷丙U/L
Ggt field.String // GGTU/L
Alp field.String // ALPU/L
CoagulationFunctionImage field.String // 凝血功能检查报告(多张用,分割)
Crp field.String // CRPmg/L
Ddr field.String // DDR
Inr field.String // INR
Pt field.String // PTs
Pta field.String // PTA%
Aptt field.String // APTTs
Tt field.String // TTs
Fib field.String // FIBg/L
Npdp field.String // NPDPmg/L
Mmp7 field.String // MMP-7ng/mL
BloodRoutineImage field.String // 血常规检查报告(多张用,分割)
Platelets field.String // 血小板10^9/L)
Hemoglobin field.String // 血红蛋白 (g/L)
WhiteBloodCells field.String // 白细胞 (10^9/L)
RedBloodCells field.String // 红细胞 (10^9/L)
NutritionalIndicatorImage field.String // 营养指标检查报告(多张用,分割)
OhD3 field.String // 25OHD3 (ng/ml)
OhD2 field.String // 25OHD2 (ng/ml)
OhD field.String // 25OHD (ng/ml)
VitaminA field.String // 维生素A (ng/ml)
VitaminK field.String // 维生素K (ng/ml)
VitaminE field.String // 维生素E (ng/ml)
BModeImage field.String // B超报告(多张用,分割)
UnderTheLiverRib field.String // 肝肋下(mm)
UnderTheXiphoidLiver field.String // 肝剑突下(mm)
SpleenRibArea field.String // 脾肋下(mm)
MainPortalVein field.String // 门静脉主干内径(mm)
LiverEcho field.String // 肝回声
GallbladderSize field.String // 胆囊大小(mm)
CommonBileDuct field.String // 胆总管(mm)
FiberBlockSize field.String // 纤维块大小(mm)
Pvv field.String // 门静脉流速
LiverElasticityValue field.String // 肝弹性值
IsHaveCyst field.Int32 // 有无肝囊肿(1:是 2:否)
IsHaveAscites field.Int32 // 有无腹水(1:是 2:否)
ElastographyMinimum field.String // 弹性成像最小值(kPa)
ElastographyMaximum field.String // 弹性成像最大值(kPa)
ElastographyMedian field.String // 弹性成像中位数(kPa)
MdtImage field.String // MDT电子病历(多张用,分割)
CreatedUser field.String // 创建人
CreatedAt field.Time // 创建时间
UpdatedUser field.String // 更新人
UpdatedAt field.Time // 更新时间
fieldMap map[string]field.Expr
}
func (p patientFollowQuestionnaire) Table(newTableName string) *patientFollowQuestionnaire {
p.patientFollowQuestionnaireDo.UseTable(newTableName)
return p.updateTableName(newTableName)
}
func (p patientFollowQuestionnaire) As(alias string) *patientFollowQuestionnaire {
p.patientFollowQuestionnaireDo.DO = *(p.patientFollowQuestionnaireDo.As(alias).(*gen.DO))
return p.updateTableName(alias)
}
func (p *patientFollowQuestionnaire) updateTableName(table string) *patientFollowQuestionnaire {
p.ALL = field.NewAsterisk(table)
p.ID = field.NewInt32(table, "id")
p.PatientID = field.NewInt32(table, "patient_id")
p.PlanID = field.NewInt32(table, "plan_id")
p.FollowName = field.NewString(table, "follow_name")
p.FollowDate = field.NewTime(table, "follow_date")
p.FollowHospital = field.NewString(table, "follow_hospital")
p.Height = field.NewString(table, "height")
p.Weight = field.NewString(table, "weight")
p.HeadCircumference = field.NewString(table, "head_circumference")
p.HighHip = field.NewString(table, "high_hip")
p.LiverFunctionImage = field.NewString(table, "liver_function_image")
p.TotalBilirubin = field.NewString(table, "total_bilirubin")
p.DirectBilirubin = field.NewString(table, "direct_bilirubin")
p.TotalBileAcid = field.NewString(table, "total_bile_acid")
p.Albumin = field.NewString(table, "albumin")
p.GrainGrass = field.NewString(table, "grain_grass")
p.GuBing = field.NewString(table, "gu_bing")
p.Ggt = field.NewString(table, "ggt")
p.Alp = field.NewString(table, "alp")
p.CoagulationFunctionImage = field.NewString(table, "coagulation_function_image")
p.Crp = field.NewString(table, "crp")
p.Ddr = field.NewString(table, "ddr")
p.Inr = field.NewString(table, "inr")
p.Pt = field.NewString(table, "pt")
p.Pta = field.NewString(table, "pta")
p.Aptt = field.NewString(table, "aptt")
p.Tt = field.NewString(table, "tt")
p.Fib = field.NewString(table, "fib")
p.Npdp = field.NewString(table, "npdp")
p.Mmp7 = field.NewString(table, "mmp_7")
p.BloodRoutineImage = field.NewString(table, "blood_routine_image")
p.Platelets = field.NewString(table, "platelets")
p.Hemoglobin = field.NewString(table, "hemoglobin")
p.WhiteBloodCells = field.NewString(table, "white_blood_cells")
p.RedBloodCells = field.NewString(table, "red_blood_cells")
p.NutritionalIndicatorImage = field.NewString(table, "nutritional_indicator_image")
p.OhD3 = field.NewString(table, "oh_d3")
p.OhD2 = field.NewString(table, "oh_d2")
p.OhD = field.NewString(table, "oh_d")
p.VitaminA = field.NewString(table, "vitamin_a")
p.VitaminK = field.NewString(table, "vitamin_k")
p.VitaminE = field.NewString(table, "vitamin_e")
p.BModeImage = field.NewString(table, "b_mode_image")
p.UnderTheLiverRib = field.NewString(table, "under_the_liver_rib")
p.UnderTheXiphoidLiver = field.NewString(table, "under_the_xiphoid_liver")
p.SpleenRibArea = field.NewString(table, "spleen_rib_area")
p.MainPortalVein = field.NewString(table, "main_portal_vein")
p.LiverEcho = field.NewString(table, "liver_echo")
p.GallbladderSize = field.NewString(table, "gallbladder_size")
p.CommonBileDuct = field.NewString(table, "common_bile_duct")
p.FiberBlockSize = field.NewString(table, "fiber_block_size")
p.Pvv = field.NewString(table, "pvv")
p.LiverElasticityValue = field.NewString(table, "liver_elasticity_value")
p.IsHaveCyst = field.NewInt32(table, "is_have_cyst")
p.IsHaveAscites = field.NewInt32(table, "is_have_ascites")
p.ElastographyMinimum = field.NewString(table, "elastography_minimum")
p.ElastographyMaximum = field.NewString(table, "elastography_maximum")
p.ElastographyMedian = field.NewString(table, "elastography_median")
p.MdtImage = field.NewString(table, "mdt_image")
p.CreatedUser = field.NewString(table, "created_user")
p.CreatedAt = field.NewTime(table, "created_at")
p.UpdatedUser = field.NewString(table, "updated_user")
p.UpdatedAt = field.NewTime(table, "updated_at")
p.fillFieldMap()
return p
}
func (p *patientFollowQuestionnaire) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := p.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (p *patientFollowQuestionnaire) fillFieldMap() {
p.fieldMap = make(map[string]field.Expr, 63)
p.fieldMap["id"] = p.ID
p.fieldMap["patient_id"] = p.PatientID
p.fieldMap["plan_id"] = p.PlanID
p.fieldMap["follow_name"] = p.FollowName
p.fieldMap["follow_date"] = p.FollowDate
p.fieldMap["follow_hospital"] = p.FollowHospital
p.fieldMap["height"] = p.Height
p.fieldMap["weight"] = p.Weight
p.fieldMap["head_circumference"] = p.HeadCircumference
p.fieldMap["high_hip"] = p.HighHip
p.fieldMap["liver_function_image"] = p.LiverFunctionImage
p.fieldMap["total_bilirubin"] = p.TotalBilirubin
p.fieldMap["direct_bilirubin"] = p.DirectBilirubin
p.fieldMap["total_bile_acid"] = p.TotalBileAcid
p.fieldMap["albumin"] = p.Albumin
p.fieldMap["grain_grass"] = p.GrainGrass
p.fieldMap["gu_bing"] = p.GuBing
p.fieldMap["ggt"] = p.Ggt
p.fieldMap["alp"] = p.Alp
p.fieldMap["coagulation_function_image"] = p.CoagulationFunctionImage
p.fieldMap["crp"] = p.Crp
p.fieldMap["ddr"] = p.Ddr
p.fieldMap["inr"] = p.Inr
p.fieldMap["pt"] = p.Pt
p.fieldMap["pta"] = p.Pta
p.fieldMap["aptt"] = p.Aptt
p.fieldMap["tt"] = p.Tt
p.fieldMap["fib"] = p.Fib
p.fieldMap["npdp"] = p.Npdp
p.fieldMap["mmp_7"] = p.Mmp7
p.fieldMap["blood_routine_image"] = p.BloodRoutineImage
p.fieldMap["platelets"] = p.Platelets
p.fieldMap["hemoglobin"] = p.Hemoglobin
p.fieldMap["white_blood_cells"] = p.WhiteBloodCells
p.fieldMap["red_blood_cells"] = p.RedBloodCells
p.fieldMap["nutritional_indicator_image"] = p.NutritionalIndicatorImage
p.fieldMap["oh_d3"] = p.OhD3
p.fieldMap["oh_d2"] = p.OhD2
p.fieldMap["oh_d"] = p.OhD
p.fieldMap["vitamin_a"] = p.VitaminA
p.fieldMap["vitamin_k"] = p.VitaminK
p.fieldMap["vitamin_e"] = p.VitaminE
p.fieldMap["b_mode_image"] = p.BModeImage
p.fieldMap["under_the_liver_rib"] = p.UnderTheLiverRib
p.fieldMap["under_the_xiphoid_liver"] = p.UnderTheXiphoidLiver
p.fieldMap["spleen_rib_area"] = p.SpleenRibArea
p.fieldMap["main_portal_vein"] = p.MainPortalVein
p.fieldMap["liver_echo"] = p.LiverEcho
p.fieldMap["gallbladder_size"] = p.GallbladderSize
p.fieldMap["common_bile_duct"] = p.CommonBileDuct
p.fieldMap["fiber_block_size"] = p.FiberBlockSize
p.fieldMap["pvv"] = p.Pvv
p.fieldMap["liver_elasticity_value"] = p.LiverElasticityValue
p.fieldMap["is_have_cyst"] = p.IsHaveCyst
p.fieldMap["is_have_ascites"] = p.IsHaveAscites
p.fieldMap["elastography_minimum"] = p.ElastographyMinimum
p.fieldMap["elastography_maximum"] = p.ElastographyMaximum
p.fieldMap["elastography_median"] = p.ElastographyMedian
p.fieldMap["mdt_image"] = p.MdtImage
p.fieldMap["created_user"] = p.CreatedUser
p.fieldMap["created_at"] = p.CreatedAt
p.fieldMap["updated_user"] = p.UpdatedUser
p.fieldMap["updated_at"] = p.UpdatedAt
}
func (p patientFollowQuestionnaire) clone(db *gorm.DB) patientFollowQuestionnaire {
p.patientFollowQuestionnaireDo.ReplaceConnPool(db.Statement.ConnPool)
return p
}
func (p patientFollowQuestionnaire) replaceDB(db *gorm.DB) patientFollowQuestionnaire {
p.patientFollowQuestionnaireDo.ReplaceDB(db)
return p
}
type patientFollowQuestionnaireDo struct{ gen.DO }
func (p patientFollowQuestionnaireDo) Debug() *patientFollowQuestionnaireDo {
return p.withDO(p.DO.Debug())
}
func (p patientFollowQuestionnaireDo) WithContext(ctx context.Context) *patientFollowQuestionnaireDo {
return p.withDO(p.DO.WithContext(ctx))
}
func (p patientFollowQuestionnaireDo) ReadDB() *patientFollowQuestionnaireDo {
return p.Clauses(dbresolver.Read)
}
func (p patientFollowQuestionnaireDo) WriteDB() *patientFollowQuestionnaireDo {
return p.Clauses(dbresolver.Write)
}
func (p patientFollowQuestionnaireDo) Session(config *gorm.Session) *patientFollowQuestionnaireDo {
return p.withDO(p.DO.Session(config))
}
func (p patientFollowQuestionnaireDo) Clauses(conds ...clause.Expression) *patientFollowQuestionnaireDo {
return p.withDO(p.DO.Clauses(conds...))
}
func (p patientFollowQuestionnaireDo) Returning(value interface{}, columns ...string) *patientFollowQuestionnaireDo {
return p.withDO(p.DO.Returning(value, columns...))
}
func (p patientFollowQuestionnaireDo) Not(conds ...gen.Condition) *patientFollowQuestionnaireDo {
return p.withDO(p.DO.Not(conds...))
}
func (p patientFollowQuestionnaireDo) Or(conds ...gen.Condition) *patientFollowQuestionnaireDo {
return p.withDO(p.DO.Or(conds...))
}
func (p patientFollowQuestionnaireDo) Select(conds ...field.Expr) *patientFollowQuestionnaireDo {
return p.withDO(p.DO.Select(conds...))
}
func (p patientFollowQuestionnaireDo) Where(conds ...gen.Condition) *patientFollowQuestionnaireDo {
return p.withDO(p.DO.Where(conds...))
}
func (p patientFollowQuestionnaireDo) Order(conds ...field.Expr) *patientFollowQuestionnaireDo {
return p.withDO(p.DO.Order(conds...))
}
func (p patientFollowQuestionnaireDo) Distinct(cols ...field.Expr) *patientFollowQuestionnaireDo {
return p.withDO(p.DO.Distinct(cols...))
}
func (p patientFollowQuestionnaireDo) Omit(cols ...field.Expr) *patientFollowQuestionnaireDo {
return p.withDO(p.DO.Omit(cols...))
}
func (p patientFollowQuestionnaireDo) Join(table schema.Tabler, on ...field.Expr) *patientFollowQuestionnaireDo {
return p.withDO(p.DO.Join(table, on...))
}
func (p patientFollowQuestionnaireDo) LeftJoin(table schema.Tabler, on ...field.Expr) *patientFollowQuestionnaireDo {
return p.withDO(p.DO.LeftJoin(table, on...))
}
func (p patientFollowQuestionnaireDo) RightJoin(table schema.Tabler, on ...field.Expr) *patientFollowQuestionnaireDo {
return p.withDO(p.DO.RightJoin(table, on...))
}
func (p patientFollowQuestionnaireDo) Group(cols ...field.Expr) *patientFollowQuestionnaireDo {
return p.withDO(p.DO.Group(cols...))
}
func (p patientFollowQuestionnaireDo) Having(conds ...gen.Condition) *patientFollowQuestionnaireDo {
return p.withDO(p.DO.Having(conds...))
}
func (p patientFollowQuestionnaireDo) Limit(limit int) *patientFollowQuestionnaireDo {
return p.withDO(p.DO.Limit(limit))
}
func (p patientFollowQuestionnaireDo) Offset(offset int) *patientFollowQuestionnaireDo {
return p.withDO(p.DO.Offset(offset))
}
func (p patientFollowQuestionnaireDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *patientFollowQuestionnaireDo {
return p.withDO(p.DO.Scopes(funcs...))
}
func (p patientFollowQuestionnaireDo) Unscoped() *patientFollowQuestionnaireDo {
return p.withDO(p.DO.Unscoped())
}
func (p patientFollowQuestionnaireDo) Create(values ...*model.PatientFollowQuestionnaire) error {
if len(values) == 0 {
return nil
}
return p.DO.Create(values)
}
func (p patientFollowQuestionnaireDo) CreateInBatches(values []*model.PatientFollowQuestionnaire, batchSize int) error {
return p.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (p patientFollowQuestionnaireDo) Save(values ...*model.PatientFollowQuestionnaire) error {
if len(values) == 0 {
return nil
}
return p.DO.Save(values)
}
func (p patientFollowQuestionnaireDo) First() (*model.PatientFollowQuestionnaire, error) {
if result, err := p.DO.First(); err != nil {
return nil, err
} else {
return result.(*model.PatientFollowQuestionnaire), nil
}
}
func (p patientFollowQuestionnaireDo) Take() (*model.PatientFollowQuestionnaire, error) {
if result, err := p.DO.Take(); err != nil {
return nil, err
} else {
return result.(*model.PatientFollowQuestionnaire), nil
}
}
func (p patientFollowQuestionnaireDo) Last() (*model.PatientFollowQuestionnaire, error) {
if result, err := p.DO.Last(); err != nil {
return nil, err
} else {
return result.(*model.PatientFollowQuestionnaire), nil
}
}
func (p patientFollowQuestionnaireDo) Find() ([]*model.PatientFollowQuestionnaire, error) {
result, err := p.DO.Find()
return result.([]*model.PatientFollowQuestionnaire), err
}
func (p patientFollowQuestionnaireDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.PatientFollowQuestionnaire, err error) {
buf := make([]*model.PatientFollowQuestionnaire, 0, batchSize)
err = p.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (p patientFollowQuestionnaireDo) FindInBatches(result *[]*model.PatientFollowQuestionnaire, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return p.DO.FindInBatches(result, batchSize, fc)
}
func (p patientFollowQuestionnaireDo) Attrs(attrs ...field.AssignExpr) *patientFollowQuestionnaireDo {
return p.withDO(p.DO.Attrs(attrs...))
}
func (p patientFollowQuestionnaireDo) Assign(attrs ...field.AssignExpr) *patientFollowQuestionnaireDo {
return p.withDO(p.DO.Assign(attrs...))
}
func (p patientFollowQuestionnaireDo) Joins(fields ...field.RelationField) *patientFollowQuestionnaireDo {
for _, _f := range fields {
p = *p.withDO(p.DO.Joins(_f))
}
return &p
}
func (p patientFollowQuestionnaireDo) Preload(fields ...field.RelationField) *patientFollowQuestionnaireDo {
for _, _f := range fields {
p = *p.withDO(p.DO.Preload(_f))
}
return &p
}
func (p patientFollowQuestionnaireDo) FirstOrInit() (*model.PatientFollowQuestionnaire, error) {
if result, err := p.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*model.PatientFollowQuestionnaire), nil
}
}
func (p patientFollowQuestionnaireDo) FirstOrCreate() (*model.PatientFollowQuestionnaire, error) {
if result, err := p.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*model.PatientFollowQuestionnaire), nil
}
}
func (p patientFollowQuestionnaireDo) FindByPage(offset int, limit int) (result []*model.PatientFollowQuestionnaire, count int64, err error) {
result, err = p.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = p.Offset(-1).Limit(-1).Count()
return
}
func (p patientFollowQuestionnaireDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = p.Count()
if err != nil {
return
}
err = p.Offset(offset).Limit(limit).Scan(result)
return
}
func (p patientFollowQuestionnaireDo) Scan(result interface{}) (err error) {
return p.DO.Scan(result)
}
func (p patientFollowQuestionnaireDo) Delete(models ...*model.PatientFollowQuestionnaire) (result gen.ResultInfo, err error) {
return p.DO.Delete(models)
}
func (p *patientFollowQuestionnaireDo) withDO(do gen.Dao) *patientFollowQuestionnaireDo {
p.DO = *do.(*gen.DO)
return p
}

View File

@ -0,0 +1,368 @@
// 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 dao
import (
"context"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"mini-chat/internal/repository/mysql/model"
)
func newPatientMedicineRecord(db *gorm.DB, opts ...gen.DOOption) patientMedicineRecord {
_patientMedicineRecord := patientMedicineRecord{}
_patientMedicineRecord.patientMedicineRecordDo.UseDB(db, opts...)
_patientMedicineRecord.patientMedicineRecordDo.UseModel(&model.PatientMedicineRecord{})
tableName := _patientMedicineRecord.patientMedicineRecordDo.TableName()
_patientMedicineRecord.ALL = field.NewAsterisk(tableName)
_patientMedicineRecord.ID = field.NewInt32(tableName, "id")
_patientMedicineRecord.PatientID = field.NewInt32(tableName, "patient_id")
_patientMedicineRecord.SchemeID = field.NewInt32(tableName, "scheme_id")
_patientMedicineRecord.MedicineDate = field.NewTime(tableName, "medicine_date")
_patientMedicineRecord.MedicineTimeType = field.NewInt32(tableName, "medicine_time_type")
_patientMedicineRecord.MedicineTime = field.NewString(tableName, "medicine_time")
_patientMedicineRecord.Detail = field.NewString(tableName, "detail")
_patientMedicineRecord.Status = field.NewInt32(tableName, "status")
_patientMedicineRecord.StatusAt = field.NewTime(tableName, "status_at")
_patientMedicineRecord.CreatedUser = field.NewString(tableName, "created_user")
_patientMedicineRecord.CreatedAt = field.NewTime(tableName, "created_at")
_patientMedicineRecord.UpdatedUser = field.NewString(tableName, "updated_user")
_patientMedicineRecord.UpdatedAt = field.NewTime(tableName, "updated_at")
_patientMedicineRecord.fillFieldMap()
return _patientMedicineRecord
}
// patientMedicineRecord 患者用药记录表
type patientMedicineRecord struct {
patientMedicineRecordDo
ALL field.Asterisk
ID field.Int32 // 主键
PatientID field.Int32 // 患者ID
SchemeID field.Int32 // 用药方案ID
MedicineDate field.Time // 用药日期
MedicineTimeType field.Int32 // 用药时间类型(1:早上 2:中午 3:晚上)
MedicineTime field.String // 用药时间
Detail field.String // 药品信息(JSON格式)
Status field.Int32 // 用药状态(1:未完成 2:已完成)
StatusAt field.Time // 已完成时间(打卡时间)
CreatedUser field.String // 创建人
CreatedAt field.Time // 创建时间
UpdatedUser field.String // 更新人
UpdatedAt field.Time // 更新时间
fieldMap map[string]field.Expr
}
func (p patientMedicineRecord) Table(newTableName string) *patientMedicineRecord {
p.patientMedicineRecordDo.UseTable(newTableName)
return p.updateTableName(newTableName)
}
func (p patientMedicineRecord) As(alias string) *patientMedicineRecord {
p.patientMedicineRecordDo.DO = *(p.patientMedicineRecordDo.As(alias).(*gen.DO))
return p.updateTableName(alias)
}
func (p *patientMedicineRecord) updateTableName(table string) *patientMedicineRecord {
p.ALL = field.NewAsterisk(table)
p.ID = field.NewInt32(table, "id")
p.PatientID = field.NewInt32(table, "patient_id")
p.SchemeID = field.NewInt32(table, "scheme_id")
p.MedicineDate = field.NewTime(table, "medicine_date")
p.MedicineTimeType = field.NewInt32(table, "medicine_time_type")
p.MedicineTime = field.NewString(table, "medicine_time")
p.Detail = field.NewString(table, "detail")
p.Status = field.NewInt32(table, "status")
p.StatusAt = field.NewTime(table, "status_at")
p.CreatedUser = field.NewString(table, "created_user")
p.CreatedAt = field.NewTime(table, "created_at")
p.UpdatedUser = field.NewString(table, "updated_user")
p.UpdatedAt = field.NewTime(table, "updated_at")
p.fillFieldMap()
return p
}
func (p *patientMedicineRecord) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := p.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (p *patientMedicineRecord) fillFieldMap() {
p.fieldMap = make(map[string]field.Expr, 13)
p.fieldMap["id"] = p.ID
p.fieldMap["patient_id"] = p.PatientID
p.fieldMap["scheme_id"] = p.SchemeID
p.fieldMap["medicine_date"] = p.MedicineDate
p.fieldMap["medicine_time_type"] = p.MedicineTimeType
p.fieldMap["medicine_time"] = p.MedicineTime
p.fieldMap["detail"] = p.Detail
p.fieldMap["status"] = p.Status
p.fieldMap["status_at"] = p.StatusAt
p.fieldMap["created_user"] = p.CreatedUser
p.fieldMap["created_at"] = p.CreatedAt
p.fieldMap["updated_user"] = p.UpdatedUser
p.fieldMap["updated_at"] = p.UpdatedAt
}
func (p patientMedicineRecord) clone(db *gorm.DB) patientMedicineRecord {
p.patientMedicineRecordDo.ReplaceConnPool(db.Statement.ConnPool)
return p
}
func (p patientMedicineRecord) replaceDB(db *gorm.DB) patientMedicineRecord {
p.patientMedicineRecordDo.ReplaceDB(db)
return p
}
type patientMedicineRecordDo struct{ gen.DO }
func (p patientMedicineRecordDo) Debug() *patientMedicineRecordDo {
return p.withDO(p.DO.Debug())
}
func (p patientMedicineRecordDo) WithContext(ctx context.Context) *patientMedicineRecordDo {
return p.withDO(p.DO.WithContext(ctx))
}
func (p patientMedicineRecordDo) ReadDB() *patientMedicineRecordDo {
return p.Clauses(dbresolver.Read)
}
func (p patientMedicineRecordDo) WriteDB() *patientMedicineRecordDo {
return p.Clauses(dbresolver.Write)
}
func (p patientMedicineRecordDo) Session(config *gorm.Session) *patientMedicineRecordDo {
return p.withDO(p.DO.Session(config))
}
func (p patientMedicineRecordDo) Clauses(conds ...clause.Expression) *patientMedicineRecordDo {
return p.withDO(p.DO.Clauses(conds...))
}
func (p patientMedicineRecordDo) Returning(value interface{}, columns ...string) *patientMedicineRecordDo {
return p.withDO(p.DO.Returning(value, columns...))
}
func (p patientMedicineRecordDo) Not(conds ...gen.Condition) *patientMedicineRecordDo {
return p.withDO(p.DO.Not(conds...))
}
func (p patientMedicineRecordDo) Or(conds ...gen.Condition) *patientMedicineRecordDo {
return p.withDO(p.DO.Or(conds...))
}
func (p patientMedicineRecordDo) Select(conds ...field.Expr) *patientMedicineRecordDo {
return p.withDO(p.DO.Select(conds...))
}
func (p patientMedicineRecordDo) Where(conds ...gen.Condition) *patientMedicineRecordDo {
return p.withDO(p.DO.Where(conds...))
}
func (p patientMedicineRecordDo) Order(conds ...field.Expr) *patientMedicineRecordDo {
return p.withDO(p.DO.Order(conds...))
}
func (p patientMedicineRecordDo) Distinct(cols ...field.Expr) *patientMedicineRecordDo {
return p.withDO(p.DO.Distinct(cols...))
}
func (p patientMedicineRecordDo) Omit(cols ...field.Expr) *patientMedicineRecordDo {
return p.withDO(p.DO.Omit(cols...))
}
func (p patientMedicineRecordDo) Join(table schema.Tabler, on ...field.Expr) *patientMedicineRecordDo {
return p.withDO(p.DO.Join(table, on...))
}
func (p patientMedicineRecordDo) LeftJoin(table schema.Tabler, on ...field.Expr) *patientMedicineRecordDo {
return p.withDO(p.DO.LeftJoin(table, on...))
}
func (p patientMedicineRecordDo) RightJoin(table schema.Tabler, on ...field.Expr) *patientMedicineRecordDo {
return p.withDO(p.DO.RightJoin(table, on...))
}
func (p patientMedicineRecordDo) Group(cols ...field.Expr) *patientMedicineRecordDo {
return p.withDO(p.DO.Group(cols...))
}
func (p patientMedicineRecordDo) Having(conds ...gen.Condition) *patientMedicineRecordDo {
return p.withDO(p.DO.Having(conds...))
}
func (p patientMedicineRecordDo) Limit(limit int) *patientMedicineRecordDo {
return p.withDO(p.DO.Limit(limit))
}
func (p patientMedicineRecordDo) Offset(offset int) *patientMedicineRecordDo {
return p.withDO(p.DO.Offset(offset))
}
func (p patientMedicineRecordDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *patientMedicineRecordDo {
return p.withDO(p.DO.Scopes(funcs...))
}
func (p patientMedicineRecordDo) Unscoped() *patientMedicineRecordDo {
return p.withDO(p.DO.Unscoped())
}
func (p patientMedicineRecordDo) Create(values ...*model.PatientMedicineRecord) error {
if len(values) == 0 {
return nil
}
return p.DO.Create(values)
}
func (p patientMedicineRecordDo) CreateInBatches(values []*model.PatientMedicineRecord, batchSize int) error {
return p.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (p patientMedicineRecordDo) Save(values ...*model.PatientMedicineRecord) error {
if len(values) == 0 {
return nil
}
return p.DO.Save(values)
}
func (p patientMedicineRecordDo) First() (*model.PatientMedicineRecord, error) {
if result, err := p.DO.First(); err != nil {
return nil, err
} else {
return result.(*model.PatientMedicineRecord), nil
}
}
func (p patientMedicineRecordDo) Take() (*model.PatientMedicineRecord, error) {
if result, err := p.DO.Take(); err != nil {
return nil, err
} else {
return result.(*model.PatientMedicineRecord), nil
}
}
func (p patientMedicineRecordDo) Last() (*model.PatientMedicineRecord, error) {
if result, err := p.DO.Last(); err != nil {
return nil, err
} else {
return result.(*model.PatientMedicineRecord), nil
}
}
func (p patientMedicineRecordDo) Find() ([]*model.PatientMedicineRecord, error) {
result, err := p.DO.Find()
return result.([]*model.PatientMedicineRecord), err
}
func (p patientMedicineRecordDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.PatientMedicineRecord, err error) {
buf := make([]*model.PatientMedicineRecord, 0, batchSize)
err = p.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (p patientMedicineRecordDo) FindInBatches(result *[]*model.PatientMedicineRecord, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return p.DO.FindInBatches(result, batchSize, fc)
}
func (p patientMedicineRecordDo) Attrs(attrs ...field.AssignExpr) *patientMedicineRecordDo {
return p.withDO(p.DO.Attrs(attrs...))
}
func (p patientMedicineRecordDo) Assign(attrs ...field.AssignExpr) *patientMedicineRecordDo {
return p.withDO(p.DO.Assign(attrs...))
}
func (p patientMedicineRecordDo) Joins(fields ...field.RelationField) *patientMedicineRecordDo {
for _, _f := range fields {
p = *p.withDO(p.DO.Joins(_f))
}
return &p
}
func (p patientMedicineRecordDo) Preload(fields ...field.RelationField) *patientMedicineRecordDo {
for _, _f := range fields {
p = *p.withDO(p.DO.Preload(_f))
}
return &p
}
func (p patientMedicineRecordDo) FirstOrInit() (*model.PatientMedicineRecord, error) {
if result, err := p.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*model.PatientMedicineRecord), nil
}
}
func (p patientMedicineRecordDo) FirstOrCreate() (*model.PatientMedicineRecord, error) {
if result, err := p.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*model.PatientMedicineRecord), nil
}
}
func (p patientMedicineRecordDo) FindByPage(offset int, limit int) (result []*model.PatientMedicineRecord, count int64, err error) {
result, err = p.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = p.Offset(-1).Limit(-1).Count()
return
}
func (p patientMedicineRecordDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = p.Count()
if err != nil {
return
}
err = p.Offset(offset).Limit(limit).Scan(result)
return
}
func (p patientMedicineRecordDo) Scan(result interface{}) (err error) {
return p.DO.Scan(result)
}
func (p patientMedicineRecordDo) Delete(models ...*model.PatientMedicineRecord) (result gen.ResultInfo, err error) {
return p.DO.Delete(models)
}
func (p *patientMedicineRecordDo) withDO(do gen.Dao) *patientMedicineRecordDo {
p.DO = *do.(*gen.DO)
return p
}

View File

@ -0,0 +1,356 @@
// 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 dao
import (
"context"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"mini-chat/internal/repository/mysql/model"
)
func newPatientMedicineScheme(db *gorm.DB, opts ...gen.DOOption) patientMedicineScheme {
_patientMedicineScheme := patientMedicineScheme{}
_patientMedicineScheme.patientMedicineSchemeDo.UseDB(db, opts...)
_patientMedicineScheme.patientMedicineSchemeDo.UseModel(&model.PatientMedicineScheme{})
tableName := _patientMedicineScheme.patientMedicineSchemeDo.TableName()
_patientMedicineScheme.ALL = field.NewAsterisk(tableName)
_patientMedicineScheme.ID = field.NewInt32(tableName, "id")
_patientMedicineScheme.PatientID = field.NewInt32(tableName, "patient_id")
_patientMedicineScheme.StartDate = field.NewTime(tableName, "start_date")
_patientMedicineScheme.EndDate = field.NewTime(tableName, "end_date")
_patientMedicineScheme.Detail = field.NewString(tableName, "detail")
_patientMedicineScheme.Reminder = field.NewString(tableName, "reminder")
_patientMedicineScheme.CreatedUser = field.NewString(tableName, "created_user")
_patientMedicineScheme.CreatedAt = field.NewTime(tableName, "created_at")
_patientMedicineScheme.UpdatedUser = field.NewString(tableName, "updated_user")
_patientMedicineScheme.UpdatedAt = field.NewTime(tableName, "updated_at")
_patientMedicineScheme.fillFieldMap()
return _patientMedicineScheme
}
// patientMedicineScheme 患者用药方案表
type patientMedicineScheme struct {
patientMedicineSchemeDo
ALL field.Asterisk
ID field.Int32 // 主键
PatientID field.Int32 // 患者ID
StartDate field.Time // 用药开始日期
EndDate field.Time // 用药结束日期
Detail field.String // 药品信息(JSON格式)
Reminder field.String // 用药提醒(JSON格式)
CreatedUser field.String // 创建人
CreatedAt field.Time // 创建时间
UpdatedUser field.String // 更新人
UpdatedAt field.Time // 更新时间
fieldMap map[string]field.Expr
}
func (p patientMedicineScheme) Table(newTableName string) *patientMedicineScheme {
p.patientMedicineSchemeDo.UseTable(newTableName)
return p.updateTableName(newTableName)
}
func (p patientMedicineScheme) As(alias string) *patientMedicineScheme {
p.patientMedicineSchemeDo.DO = *(p.patientMedicineSchemeDo.As(alias).(*gen.DO))
return p.updateTableName(alias)
}
func (p *patientMedicineScheme) updateTableName(table string) *patientMedicineScheme {
p.ALL = field.NewAsterisk(table)
p.ID = field.NewInt32(table, "id")
p.PatientID = field.NewInt32(table, "patient_id")
p.StartDate = field.NewTime(table, "start_date")
p.EndDate = field.NewTime(table, "end_date")
p.Detail = field.NewString(table, "detail")
p.Reminder = field.NewString(table, "reminder")
p.CreatedUser = field.NewString(table, "created_user")
p.CreatedAt = field.NewTime(table, "created_at")
p.UpdatedUser = field.NewString(table, "updated_user")
p.UpdatedAt = field.NewTime(table, "updated_at")
p.fillFieldMap()
return p
}
func (p *patientMedicineScheme) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := p.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (p *patientMedicineScheme) fillFieldMap() {
p.fieldMap = make(map[string]field.Expr, 10)
p.fieldMap["id"] = p.ID
p.fieldMap["patient_id"] = p.PatientID
p.fieldMap["start_date"] = p.StartDate
p.fieldMap["end_date"] = p.EndDate
p.fieldMap["detail"] = p.Detail
p.fieldMap["reminder"] = p.Reminder
p.fieldMap["created_user"] = p.CreatedUser
p.fieldMap["created_at"] = p.CreatedAt
p.fieldMap["updated_user"] = p.UpdatedUser
p.fieldMap["updated_at"] = p.UpdatedAt
}
func (p patientMedicineScheme) clone(db *gorm.DB) patientMedicineScheme {
p.patientMedicineSchemeDo.ReplaceConnPool(db.Statement.ConnPool)
return p
}
func (p patientMedicineScheme) replaceDB(db *gorm.DB) patientMedicineScheme {
p.patientMedicineSchemeDo.ReplaceDB(db)
return p
}
type patientMedicineSchemeDo struct{ gen.DO }
func (p patientMedicineSchemeDo) Debug() *patientMedicineSchemeDo {
return p.withDO(p.DO.Debug())
}
func (p patientMedicineSchemeDo) WithContext(ctx context.Context) *patientMedicineSchemeDo {
return p.withDO(p.DO.WithContext(ctx))
}
func (p patientMedicineSchemeDo) ReadDB() *patientMedicineSchemeDo {
return p.Clauses(dbresolver.Read)
}
func (p patientMedicineSchemeDo) WriteDB() *patientMedicineSchemeDo {
return p.Clauses(dbresolver.Write)
}
func (p patientMedicineSchemeDo) Session(config *gorm.Session) *patientMedicineSchemeDo {
return p.withDO(p.DO.Session(config))
}
func (p patientMedicineSchemeDo) Clauses(conds ...clause.Expression) *patientMedicineSchemeDo {
return p.withDO(p.DO.Clauses(conds...))
}
func (p patientMedicineSchemeDo) Returning(value interface{}, columns ...string) *patientMedicineSchemeDo {
return p.withDO(p.DO.Returning(value, columns...))
}
func (p patientMedicineSchemeDo) Not(conds ...gen.Condition) *patientMedicineSchemeDo {
return p.withDO(p.DO.Not(conds...))
}
func (p patientMedicineSchemeDo) Or(conds ...gen.Condition) *patientMedicineSchemeDo {
return p.withDO(p.DO.Or(conds...))
}
func (p patientMedicineSchemeDo) Select(conds ...field.Expr) *patientMedicineSchemeDo {
return p.withDO(p.DO.Select(conds...))
}
func (p patientMedicineSchemeDo) Where(conds ...gen.Condition) *patientMedicineSchemeDo {
return p.withDO(p.DO.Where(conds...))
}
func (p patientMedicineSchemeDo) Order(conds ...field.Expr) *patientMedicineSchemeDo {
return p.withDO(p.DO.Order(conds...))
}
func (p patientMedicineSchemeDo) Distinct(cols ...field.Expr) *patientMedicineSchemeDo {
return p.withDO(p.DO.Distinct(cols...))
}
func (p patientMedicineSchemeDo) Omit(cols ...field.Expr) *patientMedicineSchemeDo {
return p.withDO(p.DO.Omit(cols...))
}
func (p patientMedicineSchemeDo) Join(table schema.Tabler, on ...field.Expr) *patientMedicineSchemeDo {
return p.withDO(p.DO.Join(table, on...))
}
func (p patientMedicineSchemeDo) LeftJoin(table schema.Tabler, on ...field.Expr) *patientMedicineSchemeDo {
return p.withDO(p.DO.LeftJoin(table, on...))
}
func (p patientMedicineSchemeDo) RightJoin(table schema.Tabler, on ...field.Expr) *patientMedicineSchemeDo {
return p.withDO(p.DO.RightJoin(table, on...))
}
func (p patientMedicineSchemeDo) Group(cols ...field.Expr) *patientMedicineSchemeDo {
return p.withDO(p.DO.Group(cols...))
}
func (p patientMedicineSchemeDo) Having(conds ...gen.Condition) *patientMedicineSchemeDo {
return p.withDO(p.DO.Having(conds...))
}
func (p patientMedicineSchemeDo) Limit(limit int) *patientMedicineSchemeDo {
return p.withDO(p.DO.Limit(limit))
}
func (p patientMedicineSchemeDo) Offset(offset int) *patientMedicineSchemeDo {
return p.withDO(p.DO.Offset(offset))
}
func (p patientMedicineSchemeDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *patientMedicineSchemeDo {
return p.withDO(p.DO.Scopes(funcs...))
}
func (p patientMedicineSchemeDo) Unscoped() *patientMedicineSchemeDo {
return p.withDO(p.DO.Unscoped())
}
func (p patientMedicineSchemeDo) Create(values ...*model.PatientMedicineScheme) error {
if len(values) == 0 {
return nil
}
return p.DO.Create(values)
}
func (p patientMedicineSchemeDo) CreateInBatches(values []*model.PatientMedicineScheme, batchSize int) error {
return p.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (p patientMedicineSchemeDo) Save(values ...*model.PatientMedicineScheme) error {
if len(values) == 0 {
return nil
}
return p.DO.Save(values)
}
func (p patientMedicineSchemeDo) First() (*model.PatientMedicineScheme, error) {
if result, err := p.DO.First(); err != nil {
return nil, err
} else {
return result.(*model.PatientMedicineScheme), nil
}
}
func (p patientMedicineSchemeDo) Take() (*model.PatientMedicineScheme, error) {
if result, err := p.DO.Take(); err != nil {
return nil, err
} else {
return result.(*model.PatientMedicineScheme), nil
}
}
func (p patientMedicineSchemeDo) Last() (*model.PatientMedicineScheme, error) {
if result, err := p.DO.Last(); err != nil {
return nil, err
} else {
return result.(*model.PatientMedicineScheme), nil
}
}
func (p patientMedicineSchemeDo) Find() ([]*model.PatientMedicineScheme, error) {
result, err := p.DO.Find()
return result.([]*model.PatientMedicineScheme), err
}
func (p patientMedicineSchemeDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.PatientMedicineScheme, err error) {
buf := make([]*model.PatientMedicineScheme, 0, batchSize)
err = p.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (p patientMedicineSchemeDo) FindInBatches(result *[]*model.PatientMedicineScheme, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return p.DO.FindInBatches(result, batchSize, fc)
}
func (p patientMedicineSchemeDo) Attrs(attrs ...field.AssignExpr) *patientMedicineSchemeDo {
return p.withDO(p.DO.Attrs(attrs...))
}
func (p patientMedicineSchemeDo) Assign(attrs ...field.AssignExpr) *patientMedicineSchemeDo {
return p.withDO(p.DO.Assign(attrs...))
}
func (p patientMedicineSchemeDo) Joins(fields ...field.RelationField) *patientMedicineSchemeDo {
for _, _f := range fields {
p = *p.withDO(p.DO.Joins(_f))
}
return &p
}
func (p patientMedicineSchemeDo) Preload(fields ...field.RelationField) *patientMedicineSchemeDo {
for _, _f := range fields {
p = *p.withDO(p.DO.Preload(_f))
}
return &p
}
func (p patientMedicineSchemeDo) FirstOrInit() (*model.PatientMedicineScheme, error) {
if result, err := p.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*model.PatientMedicineScheme), nil
}
}
func (p patientMedicineSchemeDo) FirstOrCreate() (*model.PatientMedicineScheme, error) {
if result, err := p.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*model.PatientMedicineScheme), nil
}
}
func (p patientMedicineSchemeDo) FindByPage(offset int, limit int) (result []*model.PatientMedicineScheme, count int64, err error) {
result, err = p.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = p.Offset(-1).Limit(-1).Count()
return
}
func (p patientMedicineSchemeDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = p.Count()
if err != nil {
return
}
err = p.Offset(offset).Limit(limit).Scan(result)
return
}
func (p patientMedicineSchemeDo) Scan(result interface{}) (err error) {
return p.DO.Scan(result)
}
func (p patientMedicineSchemeDo) Delete(models ...*model.PatientMedicineScheme) (result gen.ResultInfo, err error) {
return p.DO.Delete(models)
}
func (p *patientMedicineSchemeDo) withDO(do gen.Dao) *patientMedicineSchemeDo {
p.DO = *do.(*gen.DO)
return p
}

View File

@ -0,0 +1,376 @@
// 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 dao
import (
"context"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"mini-chat/internal/repository/mysql/model"
)
func newPatientMedicineTask(db *gorm.DB, opts ...gen.DOOption) patientMedicineTask {
_patientMedicineTask := patientMedicineTask{}
_patientMedicineTask.patientMedicineTaskDo.UseDB(db, opts...)
_patientMedicineTask.patientMedicineTaskDo.UseModel(&model.PatientMedicineTask{})
tableName := _patientMedicineTask.patientMedicineTaskDo.TableName()
_patientMedicineTask.ALL = field.NewAsterisk(tableName)
_patientMedicineTask.ID = field.NewInt32(tableName, "id")
_patientMedicineTask.Code = field.NewString(tableName, "code")
_patientMedicineTask.Title = field.NewString(tableName, "title")
_patientMedicineTask.Spec = field.NewString(tableName, "spec")
_patientMedicineTask.Status = field.NewInt32(tableName, "status")
_patientMedicineTask.IsRunning = field.NewInt32(tableName, "is_running")
_patientMedicineTask.RunTime = field.NewTime(tableName, "run_time")
_patientMedicineTask.RunStartTime = field.NewTime(tableName, "run_start_time")
_patientMedicineTask.RunEndTime = field.NewTime(tableName, "run_end_time")
_patientMedicineTask.PatientID = field.NewInt32(tableName, "patient_id")
_patientMedicineTask.MedicineRecordID = field.NewInt32(tableName, "medicine_record_id")
_patientMedicineTask.CreatedUser = field.NewString(tableName, "created_user")
_patientMedicineTask.CreatedAt = field.NewTime(tableName, "created_at")
_patientMedicineTask.UpdatedUser = field.NewString(tableName, "updated_user")
_patientMedicineTask.UpdatedAt = field.NewTime(tableName, "updated_at")
_patientMedicineTask.fillFieldMap()
return _patientMedicineTask
}
// patientMedicineTask 患者用药提醒(任务)表
type patientMedicineTask struct {
patientMedicineTaskDo
ALL field.Asterisk
ID field.Int32 // 主键ID
Code field.String // 任务编码
Title field.String // 标题
Spec field.String // 时间表达式
Status field.Int32 // 状态(1:禁用 2:启用)
IsRunning field.Int32 // 执行中(0:未执行 1:执行中 2:执行完毕)
RunTime field.Time // 预期执行时间
RunStartTime field.Time // 执行开始时间
RunEndTime field.Time // 执行结束时间
PatientID field.Int32 // 患者ID
MedicineRecordID field.Int32 // 用药记录ID
CreatedUser field.String // 创建人
CreatedAt field.Time // 创建时间
UpdatedUser field.String // 更新人
UpdatedAt field.Time // 更新时间
fieldMap map[string]field.Expr
}
func (p patientMedicineTask) Table(newTableName string) *patientMedicineTask {
p.patientMedicineTaskDo.UseTable(newTableName)
return p.updateTableName(newTableName)
}
func (p patientMedicineTask) As(alias string) *patientMedicineTask {
p.patientMedicineTaskDo.DO = *(p.patientMedicineTaskDo.As(alias).(*gen.DO))
return p.updateTableName(alias)
}
func (p *patientMedicineTask) updateTableName(table string) *patientMedicineTask {
p.ALL = field.NewAsterisk(table)
p.ID = field.NewInt32(table, "id")
p.Code = field.NewString(table, "code")
p.Title = field.NewString(table, "title")
p.Spec = field.NewString(table, "spec")
p.Status = field.NewInt32(table, "status")
p.IsRunning = field.NewInt32(table, "is_running")
p.RunTime = field.NewTime(table, "run_time")
p.RunStartTime = field.NewTime(table, "run_start_time")
p.RunEndTime = field.NewTime(table, "run_end_time")
p.PatientID = field.NewInt32(table, "patient_id")
p.MedicineRecordID = field.NewInt32(table, "medicine_record_id")
p.CreatedUser = field.NewString(table, "created_user")
p.CreatedAt = field.NewTime(table, "created_at")
p.UpdatedUser = field.NewString(table, "updated_user")
p.UpdatedAt = field.NewTime(table, "updated_at")
p.fillFieldMap()
return p
}
func (p *patientMedicineTask) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := p.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (p *patientMedicineTask) fillFieldMap() {
p.fieldMap = make(map[string]field.Expr, 15)
p.fieldMap["id"] = p.ID
p.fieldMap["code"] = p.Code
p.fieldMap["title"] = p.Title
p.fieldMap["spec"] = p.Spec
p.fieldMap["status"] = p.Status
p.fieldMap["is_running"] = p.IsRunning
p.fieldMap["run_time"] = p.RunTime
p.fieldMap["run_start_time"] = p.RunStartTime
p.fieldMap["run_end_time"] = p.RunEndTime
p.fieldMap["patient_id"] = p.PatientID
p.fieldMap["medicine_record_id"] = p.MedicineRecordID
p.fieldMap["created_user"] = p.CreatedUser
p.fieldMap["created_at"] = p.CreatedAt
p.fieldMap["updated_user"] = p.UpdatedUser
p.fieldMap["updated_at"] = p.UpdatedAt
}
func (p patientMedicineTask) clone(db *gorm.DB) patientMedicineTask {
p.patientMedicineTaskDo.ReplaceConnPool(db.Statement.ConnPool)
return p
}
func (p patientMedicineTask) replaceDB(db *gorm.DB) patientMedicineTask {
p.patientMedicineTaskDo.ReplaceDB(db)
return p
}
type patientMedicineTaskDo struct{ gen.DO }
func (p patientMedicineTaskDo) Debug() *patientMedicineTaskDo {
return p.withDO(p.DO.Debug())
}
func (p patientMedicineTaskDo) WithContext(ctx context.Context) *patientMedicineTaskDo {
return p.withDO(p.DO.WithContext(ctx))
}
func (p patientMedicineTaskDo) ReadDB() *patientMedicineTaskDo {
return p.Clauses(dbresolver.Read)
}
func (p patientMedicineTaskDo) WriteDB() *patientMedicineTaskDo {
return p.Clauses(dbresolver.Write)
}
func (p patientMedicineTaskDo) Session(config *gorm.Session) *patientMedicineTaskDo {
return p.withDO(p.DO.Session(config))
}
func (p patientMedicineTaskDo) Clauses(conds ...clause.Expression) *patientMedicineTaskDo {
return p.withDO(p.DO.Clauses(conds...))
}
func (p patientMedicineTaskDo) Returning(value interface{}, columns ...string) *patientMedicineTaskDo {
return p.withDO(p.DO.Returning(value, columns...))
}
func (p patientMedicineTaskDo) Not(conds ...gen.Condition) *patientMedicineTaskDo {
return p.withDO(p.DO.Not(conds...))
}
func (p patientMedicineTaskDo) Or(conds ...gen.Condition) *patientMedicineTaskDo {
return p.withDO(p.DO.Or(conds...))
}
func (p patientMedicineTaskDo) Select(conds ...field.Expr) *patientMedicineTaskDo {
return p.withDO(p.DO.Select(conds...))
}
func (p patientMedicineTaskDo) Where(conds ...gen.Condition) *patientMedicineTaskDo {
return p.withDO(p.DO.Where(conds...))
}
func (p patientMedicineTaskDo) Order(conds ...field.Expr) *patientMedicineTaskDo {
return p.withDO(p.DO.Order(conds...))
}
func (p patientMedicineTaskDo) Distinct(cols ...field.Expr) *patientMedicineTaskDo {
return p.withDO(p.DO.Distinct(cols...))
}
func (p patientMedicineTaskDo) Omit(cols ...field.Expr) *patientMedicineTaskDo {
return p.withDO(p.DO.Omit(cols...))
}
func (p patientMedicineTaskDo) Join(table schema.Tabler, on ...field.Expr) *patientMedicineTaskDo {
return p.withDO(p.DO.Join(table, on...))
}
func (p patientMedicineTaskDo) LeftJoin(table schema.Tabler, on ...field.Expr) *patientMedicineTaskDo {
return p.withDO(p.DO.LeftJoin(table, on...))
}
func (p patientMedicineTaskDo) RightJoin(table schema.Tabler, on ...field.Expr) *patientMedicineTaskDo {
return p.withDO(p.DO.RightJoin(table, on...))
}
func (p patientMedicineTaskDo) Group(cols ...field.Expr) *patientMedicineTaskDo {
return p.withDO(p.DO.Group(cols...))
}
func (p patientMedicineTaskDo) Having(conds ...gen.Condition) *patientMedicineTaskDo {
return p.withDO(p.DO.Having(conds...))
}
func (p patientMedicineTaskDo) Limit(limit int) *patientMedicineTaskDo {
return p.withDO(p.DO.Limit(limit))
}
func (p patientMedicineTaskDo) Offset(offset int) *patientMedicineTaskDo {
return p.withDO(p.DO.Offset(offset))
}
func (p patientMedicineTaskDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *patientMedicineTaskDo {
return p.withDO(p.DO.Scopes(funcs...))
}
func (p patientMedicineTaskDo) Unscoped() *patientMedicineTaskDo {
return p.withDO(p.DO.Unscoped())
}
func (p patientMedicineTaskDo) Create(values ...*model.PatientMedicineTask) error {
if len(values) == 0 {
return nil
}
return p.DO.Create(values)
}
func (p patientMedicineTaskDo) CreateInBatches(values []*model.PatientMedicineTask, batchSize int) error {
return p.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (p patientMedicineTaskDo) Save(values ...*model.PatientMedicineTask) error {
if len(values) == 0 {
return nil
}
return p.DO.Save(values)
}
func (p patientMedicineTaskDo) First() (*model.PatientMedicineTask, error) {
if result, err := p.DO.First(); err != nil {
return nil, err
} else {
return result.(*model.PatientMedicineTask), nil
}
}
func (p patientMedicineTaskDo) Take() (*model.PatientMedicineTask, error) {
if result, err := p.DO.Take(); err != nil {
return nil, err
} else {
return result.(*model.PatientMedicineTask), nil
}
}
func (p patientMedicineTaskDo) Last() (*model.PatientMedicineTask, error) {
if result, err := p.DO.Last(); err != nil {
return nil, err
} else {
return result.(*model.PatientMedicineTask), nil
}
}
func (p patientMedicineTaskDo) Find() ([]*model.PatientMedicineTask, error) {
result, err := p.DO.Find()
return result.([]*model.PatientMedicineTask), err
}
func (p patientMedicineTaskDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.PatientMedicineTask, err error) {
buf := make([]*model.PatientMedicineTask, 0, batchSize)
err = p.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (p patientMedicineTaskDo) FindInBatches(result *[]*model.PatientMedicineTask, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return p.DO.FindInBatches(result, batchSize, fc)
}
func (p patientMedicineTaskDo) Attrs(attrs ...field.AssignExpr) *patientMedicineTaskDo {
return p.withDO(p.DO.Attrs(attrs...))
}
func (p patientMedicineTaskDo) Assign(attrs ...field.AssignExpr) *patientMedicineTaskDo {
return p.withDO(p.DO.Assign(attrs...))
}
func (p patientMedicineTaskDo) Joins(fields ...field.RelationField) *patientMedicineTaskDo {
for _, _f := range fields {
p = *p.withDO(p.DO.Joins(_f))
}
return &p
}
func (p patientMedicineTaskDo) Preload(fields ...field.RelationField) *patientMedicineTaskDo {
for _, _f := range fields {
p = *p.withDO(p.DO.Preload(_f))
}
return &p
}
func (p patientMedicineTaskDo) FirstOrInit() (*model.PatientMedicineTask, error) {
if result, err := p.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*model.PatientMedicineTask), nil
}
}
func (p patientMedicineTaskDo) FirstOrCreate() (*model.PatientMedicineTask, error) {
if result, err := p.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*model.PatientMedicineTask), nil
}
}
func (p patientMedicineTaskDo) FindByPage(offset int, limit int) (result []*model.PatientMedicineTask, count int64, err error) {
result, err = p.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = p.Offset(-1).Limit(-1).Count()
return
}
func (p patientMedicineTaskDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = p.Count()
if err != nil {
return
}
err = p.Offset(offset).Limit(limit).Scan(result)
return
}
func (p patientMedicineTaskDo) Scan(result interface{}) (err error) {
return p.DO.Scan(result)
}
func (p patientMedicineTaskDo) Delete(models ...*model.PatientMedicineTask) (result gen.ResultInfo, err error) {
return p.DO.Delete(models)
}
func (p *patientMedicineTaskDo) withDO(do gen.Dao) *patientMedicineTaskDo {
p.DO = *do.(*gen.DO)
return p
}

View File

@ -0,0 +1,344 @@
// 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 dao
import (
"context"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"mini-chat/internal/repository/mysql/model"
)
func newSmsVerificationCode(db *gorm.DB, opts ...gen.DOOption) smsVerificationCode {
_smsVerificationCode := smsVerificationCode{}
_smsVerificationCode.smsVerificationCodeDo.UseDB(db, opts...)
_smsVerificationCode.smsVerificationCodeDo.UseModel(&model.SmsVerificationCode{})
tableName := _smsVerificationCode.smsVerificationCodeDo.TableName()
_smsVerificationCode.ALL = field.NewAsterisk(tableName)
_smsVerificationCode.ID = field.NewInt32(tableName, "id")
_smsVerificationCode.PhoneNumber = field.NewString(tableName, "phone_number")
_smsVerificationCode.VerificationCode = field.NewString(tableName, "verification_code")
_smsVerificationCode.Type = field.NewInt32(tableName, "type")
_smsVerificationCode.IsUsed = field.NewInt32(tableName, "is_used")
_smsVerificationCode.CreatedUser = field.NewString(tableName, "created_user")
_smsVerificationCode.CreatedAt = field.NewTime(tableName, "created_at")
_smsVerificationCode.fillFieldMap()
return _smsVerificationCode
}
// smsVerificationCode 短信验证码表
type smsVerificationCode struct {
smsVerificationCodeDo
ALL field.Asterisk
ID field.Int32 // 主键
PhoneNumber field.String // 手机号码
VerificationCode field.String // 验证码
Type field.Int32 // 类型(1=登录 2=忘记密码)
IsUsed field.Int32 // 是否已使用(0:未使用,1:已使用)
CreatedUser field.String // 创建人
CreatedAt field.Time // 创建时间
fieldMap map[string]field.Expr
}
func (s smsVerificationCode) Table(newTableName string) *smsVerificationCode {
s.smsVerificationCodeDo.UseTable(newTableName)
return s.updateTableName(newTableName)
}
func (s smsVerificationCode) As(alias string) *smsVerificationCode {
s.smsVerificationCodeDo.DO = *(s.smsVerificationCodeDo.As(alias).(*gen.DO))
return s.updateTableName(alias)
}
func (s *smsVerificationCode) updateTableName(table string) *smsVerificationCode {
s.ALL = field.NewAsterisk(table)
s.ID = field.NewInt32(table, "id")
s.PhoneNumber = field.NewString(table, "phone_number")
s.VerificationCode = field.NewString(table, "verification_code")
s.Type = field.NewInt32(table, "type")
s.IsUsed = field.NewInt32(table, "is_used")
s.CreatedUser = field.NewString(table, "created_user")
s.CreatedAt = field.NewTime(table, "created_at")
s.fillFieldMap()
return s
}
func (s *smsVerificationCode) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := s.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (s *smsVerificationCode) fillFieldMap() {
s.fieldMap = make(map[string]field.Expr, 7)
s.fieldMap["id"] = s.ID
s.fieldMap["phone_number"] = s.PhoneNumber
s.fieldMap["verification_code"] = s.VerificationCode
s.fieldMap["type"] = s.Type
s.fieldMap["is_used"] = s.IsUsed
s.fieldMap["created_user"] = s.CreatedUser
s.fieldMap["created_at"] = s.CreatedAt
}
func (s smsVerificationCode) clone(db *gorm.DB) smsVerificationCode {
s.smsVerificationCodeDo.ReplaceConnPool(db.Statement.ConnPool)
return s
}
func (s smsVerificationCode) replaceDB(db *gorm.DB) smsVerificationCode {
s.smsVerificationCodeDo.ReplaceDB(db)
return s
}
type smsVerificationCodeDo struct{ gen.DO }
func (s smsVerificationCodeDo) Debug() *smsVerificationCodeDo {
return s.withDO(s.DO.Debug())
}
func (s smsVerificationCodeDo) WithContext(ctx context.Context) *smsVerificationCodeDo {
return s.withDO(s.DO.WithContext(ctx))
}
func (s smsVerificationCodeDo) ReadDB() *smsVerificationCodeDo {
return s.Clauses(dbresolver.Read)
}
func (s smsVerificationCodeDo) WriteDB() *smsVerificationCodeDo {
return s.Clauses(dbresolver.Write)
}
func (s smsVerificationCodeDo) Session(config *gorm.Session) *smsVerificationCodeDo {
return s.withDO(s.DO.Session(config))
}
func (s smsVerificationCodeDo) Clauses(conds ...clause.Expression) *smsVerificationCodeDo {
return s.withDO(s.DO.Clauses(conds...))
}
func (s smsVerificationCodeDo) Returning(value interface{}, columns ...string) *smsVerificationCodeDo {
return s.withDO(s.DO.Returning(value, columns...))
}
func (s smsVerificationCodeDo) Not(conds ...gen.Condition) *smsVerificationCodeDo {
return s.withDO(s.DO.Not(conds...))
}
func (s smsVerificationCodeDo) Or(conds ...gen.Condition) *smsVerificationCodeDo {
return s.withDO(s.DO.Or(conds...))
}
func (s smsVerificationCodeDo) Select(conds ...field.Expr) *smsVerificationCodeDo {
return s.withDO(s.DO.Select(conds...))
}
func (s smsVerificationCodeDo) Where(conds ...gen.Condition) *smsVerificationCodeDo {
return s.withDO(s.DO.Where(conds...))
}
func (s smsVerificationCodeDo) Order(conds ...field.Expr) *smsVerificationCodeDo {
return s.withDO(s.DO.Order(conds...))
}
func (s smsVerificationCodeDo) Distinct(cols ...field.Expr) *smsVerificationCodeDo {
return s.withDO(s.DO.Distinct(cols...))
}
func (s smsVerificationCodeDo) Omit(cols ...field.Expr) *smsVerificationCodeDo {
return s.withDO(s.DO.Omit(cols...))
}
func (s smsVerificationCodeDo) Join(table schema.Tabler, on ...field.Expr) *smsVerificationCodeDo {
return s.withDO(s.DO.Join(table, on...))
}
func (s smsVerificationCodeDo) LeftJoin(table schema.Tabler, on ...field.Expr) *smsVerificationCodeDo {
return s.withDO(s.DO.LeftJoin(table, on...))
}
func (s smsVerificationCodeDo) RightJoin(table schema.Tabler, on ...field.Expr) *smsVerificationCodeDo {
return s.withDO(s.DO.RightJoin(table, on...))
}
func (s smsVerificationCodeDo) Group(cols ...field.Expr) *smsVerificationCodeDo {
return s.withDO(s.DO.Group(cols...))
}
func (s smsVerificationCodeDo) Having(conds ...gen.Condition) *smsVerificationCodeDo {
return s.withDO(s.DO.Having(conds...))
}
func (s smsVerificationCodeDo) Limit(limit int) *smsVerificationCodeDo {
return s.withDO(s.DO.Limit(limit))
}
func (s smsVerificationCodeDo) Offset(offset int) *smsVerificationCodeDo {
return s.withDO(s.DO.Offset(offset))
}
func (s smsVerificationCodeDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *smsVerificationCodeDo {
return s.withDO(s.DO.Scopes(funcs...))
}
func (s smsVerificationCodeDo) Unscoped() *smsVerificationCodeDo {
return s.withDO(s.DO.Unscoped())
}
func (s smsVerificationCodeDo) Create(values ...*model.SmsVerificationCode) error {
if len(values) == 0 {
return nil
}
return s.DO.Create(values)
}
func (s smsVerificationCodeDo) CreateInBatches(values []*model.SmsVerificationCode, batchSize int) error {
return s.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (s smsVerificationCodeDo) Save(values ...*model.SmsVerificationCode) error {
if len(values) == 0 {
return nil
}
return s.DO.Save(values)
}
func (s smsVerificationCodeDo) First() (*model.SmsVerificationCode, error) {
if result, err := s.DO.First(); err != nil {
return nil, err
} else {
return result.(*model.SmsVerificationCode), nil
}
}
func (s smsVerificationCodeDo) Take() (*model.SmsVerificationCode, error) {
if result, err := s.DO.Take(); err != nil {
return nil, err
} else {
return result.(*model.SmsVerificationCode), nil
}
}
func (s smsVerificationCodeDo) Last() (*model.SmsVerificationCode, error) {
if result, err := s.DO.Last(); err != nil {
return nil, err
} else {
return result.(*model.SmsVerificationCode), nil
}
}
func (s smsVerificationCodeDo) Find() ([]*model.SmsVerificationCode, error) {
result, err := s.DO.Find()
return result.([]*model.SmsVerificationCode), err
}
func (s smsVerificationCodeDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.SmsVerificationCode, err error) {
buf := make([]*model.SmsVerificationCode, 0, batchSize)
err = s.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (s smsVerificationCodeDo) FindInBatches(result *[]*model.SmsVerificationCode, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return s.DO.FindInBatches(result, batchSize, fc)
}
func (s smsVerificationCodeDo) Attrs(attrs ...field.AssignExpr) *smsVerificationCodeDo {
return s.withDO(s.DO.Attrs(attrs...))
}
func (s smsVerificationCodeDo) Assign(attrs ...field.AssignExpr) *smsVerificationCodeDo {
return s.withDO(s.DO.Assign(attrs...))
}
func (s smsVerificationCodeDo) Joins(fields ...field.RelationField) *smsVerificationCodeDo {
for _, _f := range fields {
s = *s.withDO(s.DO.Joins(_f))
}
return &s
}
func (s smsVerificationCodeDo) Preload(fields ...field.RelationField) *smsVerificationCodeDo {
for _, _f := range fields {
s = *s.withDO(s.DO.Preload(_f))
}
return &s
}
func (s smsVerificationCodeDo) FirstOrInit() (*model.SmsVerificationCode, error) {
if result, err := s.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*model.SmsVerificationCode), nil
}
}
func (s smsVerificationCodeDo) FirstOrCreate() (*model.SmsVerificationCode, error) {
if result, err := s.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*model.SmsVerificationCode), nil
}
}
func (s smsVerificationCodeDo) FindByPage(offset int, limit int) (result []*model.SmsVerificationCode, count int64, err error) {
result, err = s.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = s.Offset(-1).Limit(-1).Count()
return
}
func (s smsVerificationCodeDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = s.Count()
if err != nil {
return
}
err = s.Offset(offset).Limit(limit).Scan(result)
return
}
func (s smsVerificationCodeDo) Scan(result interface{}) (err error) {
return s.DO.Scan(result)
}
func (s smsVerificationCodeDo) Delete(models ...*model.SmsVerificationCode) (result gen.ResultInfo, err error) {
return s.DO.Delete(models)
}
func (s *smsVerificationCodeDo) withDO(do gen.Dao) *smsVerificationCodeDo {
s.DO = *do.(*gen.DO)
return s
}

View File

@ -0,0 +1,344 @@
// 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 dao
import (
"context"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"mini-chat/internal/repository/mysql/model"
)
func newSymptom(db *gorm.DB, opts ...gen.DOOption) symptom {
_symptom := symptom{}
_symptom.symptomDo.UseDB(db, opts...)
_symptom.symptomDo.UseModel(&model.Symptom{})
tableName := _symptom.symptomDo.TableName()
_symptom.ALL = field.NewAsterisk(tableName)
_symptom.ID = field.NewInt32(tableName, "id")
_symptom.Title = field.NewString(tableName, "title")
_symptom.Description = field.NewString(tableName, "description")
_symptom.CreatedUser = field.NewString(tableName, "created_user")
_symptom.CreatedAt = field.NewTime(tableName, "created_at")
_symptom.UpdatedUser = field.NewString(tableName, "updated_user")
_symptom.UpdatedAt = field.NewTime(tableName, "updated_at")
_symptom.fillFieldMap()
return _symptom
}
// symptom 症状表
type symptom struct {
symptomDo
ALL field.Asterisk
ID field.Int32 // 主键
Title field.String // 症状
Description field.String // 描述
CreatedUser field.String // 创建人
CreatedAt field.Time // 创建时间
UpdatedUser field.String // 更新人
UpdatedAt field.Time // 更新时间
fieldMap map[string]field.Expr
}
func (s symptom) Table(newTableName string) *symptom {
s.symptomDo.UseTable(newTableName)
return s.updateTableName(newTableName)
}
func (s symptom) As(alias string) *symptom {
s.symptomDo.DO = *(s.symptomDo.As(alias).(*gen.DO))
return s.updateTableName(alias)
}
func (s *symptom) updateTableName(table string) *symptom {
s.ALL = field.NewAsterisk(table)
s.ID = field.NewInt32(table, "id")
s.Title = field.NewString(table, "title")
s.Description = field.NewString(table, "description")
s.CreatedUser = field.NewString(table, "created_user")
s.CreatedAt = field.NewTime(table, "created_at")
s.UpdatedUser = field.NewString(table, "updated_user")
s.UpdatedAt = field.NewTime(table, "updated_at")
s.fillFieldMap()
return s
}
func (s *symptom) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := s.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (s *symptom) fillFieldMap() {
s.fieldMap = make(map[string]field.Expr, 7)
s.fieldMap["id"] = s.ID
s.fieldMap["title"] = s.Title
s.fieldMap["description"] = s.Description
s.fieldMap["created_user"] = s.CreatedUser
s.fieldMap["created_at"] = s.CreatedAt
s.fieldMap["updated_user"] = s.UpdatedUser
s.fieldMap["updated_at"] = s.UpdatedAt
}
func (s symptom) clone(db *gorm.DB) symptom {
s.symptomDo.ReplaceConnPool(db.Statement.ConnPool)
return s
}
func (s symptom) replaceDB(db *gorm.DB) symptom {
s.symptomDo.ReplaceDB(db)
return s
}
type symptomDo struct{ gen.DO }
func (s symptomDo) Debug() *symptomDo {
return s.withDO(s.DO.Debug())
}
func (s symptomDo) WithContext(ctx context.Context) *symptomDo {
return s.withDO(s.DO.WithContext(ctx))
}
func (s symptomDo) ReadDB() *symptomDo {
return s.Clauses(dbresolver.Read)
}
func (s symptomDo) WriteDB() *symptomDo {
return s.Clauses(dbresolver.Write)
}
func (s symptomDo) Session(config *gorm.Session) *symptomDo {
return s.withDO(s.DO.Session(config))
}
func (s symptomDo) Clauses(conds ...clause.Expression) *symptomDo {
return s.withDO(s.DO.Clauses(conds...))
}
func (s symptomDo) Returning(value interface{}, columns ...string) *symptomDo {
return s.withDO(s.DO.Returning(value, columns...))
}
func (s symptomDo) Not(conds ...gen.Condition) *symptomDo {
return s.withDO(s.DO.Not(conds...))
}
func (s symptomDo) Or(conds ...gen.Condition) *symptomDo {
return s.withDO(s.DO.Or(conds...))
}
func (s symptomDo) Select(conds ...field.Expr) *symptomDo {
return s.withDO(s.DO.Select(conds...))
}
func (s symptomDo) Where(conds ...gen.Condition) *symptomDo {
return s.withDO(s.DO.Where(conds...))
}
func (s symptomDo) Order(conds ...field.Expr) *symptomDo {
return s.withDO(s.DO.Order(conds...))
}
func (s symptomDo) Distinct(cols ...field.Expr) *symptomDo {
return s.withDO(s.DO.Distinct(cols...))
}
func (s symptomDo) Omit(cols ...field.Expr) *symptomDo {
return s.withDO(s.DO.Omit(cols...))
}
func (s symptomDo) Join(table schema.Tabler, on ...field.Expr) *symptomDo {
return s.withDO(s.DO.Join(table, on...))
}
func (s symptomDo) LeftJoin(table schema.Tabler, on ...field.Expr) *symptomDo {
return s.withDO(s.DO.LeftJoin(table, on...))
}
func (s symptomDo) RightJoin(table schema.Tabler, on ...field.Expr) *symptomDo {
return s.withDO(s.DO.RightJoin(table, on...))
}
func (s symptomDo) Group(cols ...field.Expr) *symptomDo {
return s.withDO(s.DO.Group(cols...))
}
func (s symptomDo) Having(conds ...gen.Condition) *symptomDo {
return s.withDO(s.DO.Having(conds...))
}
func (s symptomDo) Limit(limit int) *symptomDo {
return s.withDO(s.DO.Limit(limit))
}
func (s symptomDo) Offset(offset int) *symptomDo {
return s.withDO(s.DO.Offset(offset))
}
func (s symptomDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *symptomDo {
return s.withDO(s.DO.Scopes(funcs...))
}
func (s symptomDo) Unscoped() *symptomDo {
return s.withDO(s.DO.Unscoped())
}
func (s symptomDo) Create(values ...*model.Symptom) error {
if len(values) == 0 {
return nil
}
return s.DO.Create(values)
}
func (s symptomDo) CreateInBatches(values []*model.Symptom, batchSize int) error {
return s.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (s symptomDo) Save(values ...*model.Symptom) error {
if len(values) == 0 {
return nil
}
return s.DO.Save(values)
}
func (s symptomDo) First() (*model.Symptom, error) {
if result, err := s.DO.First(); err != nil {
return nil, err
} else {
return result.(*model.Symptom), nil
}
}
func (s symptomDo) Take() (*model.Symptom, error) {
if result, err := s.DO.Take(); err != nil {
return nil, err
} else {
return result.(*model.Symptom), nil
}
}
func (s symptomDo) Last() (*model.Symptom, error) {
if result, err := s.DO.Last(); err != nil {
return nil, err
} else {
return result.(*model.Symptom), nil
}
}
func (s symptomDo) Find() ([]*model.Symptom, error) {
result, err := s.DO.Find()
return result.([]*model.Symptom), err
}
func (s symptomDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.Symptom, err error) {
buf := make([]*model.Symptom, 0, batchSize)
err = s.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (s symptomDo) FindInBatches(result *[]*model.Symptom, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return s.DO.FindInBatches(result, batchSize, fc)
}
func (s symptomDo) Attrs(attrs ...field.AssignExpr) *symptomDo {
return s.withDO(s.DO.Attrs(attrs...))
}
func (s symptomDo) Assign(attrs ...field.AssignExpr) *symptomDo {
return s.withDO(s.DO.Assign(attrs...))
}
func (s symptomDo) Joins(fields ...field.RelationField) *symptomDo {
for _, _f := range fields {
s = *s.withDO(s.DO.Joins(_f))
}
return &s
}
func (s symptomDo) Preload(fields ...field.RelationField) *symptomDo {
for _, _f := range fields {
s = *s.withDO(s.DO.Preload(_f))
}
return &s
}
func (s symptomDo) FirstOrInit() (*model.Symptom, error) {
if result, err := s.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*model.Symptom), nil
}
}
func (s symptomDo) FirstOrCreate() (*model.Symptom, error) {
if result, err := s.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*model.Symptom), nil
}
}
func (s symptomDo) FindByPage(offset int, limit int) (result []*model.Symptom, count int64, err error) {
result, err = s.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = s.Offset(-1).Limit(-1).Count()
return
}
func (s symptomDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = s.Count()
if err != nil {
return
}
err = s.Offset(offset).Limit(limit).Scan(result)
return
}
func (s symptomDo) Scan(result interface{}) (err error) {
return s.DO.Scan(result)
}
func (s symptomDo) Delete(models ...*model.Symptom) (result gen.ResultInfo, err error) {
return s.DO.Delete(models)
}
func (s *symptomDo) withDO(do gen.Dao) *symptomDo {
s.DO = *do.(*gen.DO)
return s
}

View File

@ -0,0 +1,33 @@
// 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 TableNameAdmin = "admin"
// Admin 管理员表
type Admin struct {
ID int32 `gorm:"column:id;primaryKey;autoIncrement:true;comment:主键" json:"id"` // 主键
Username string `gorm:"column:username;not null;comment:用户名" json:"username"` // 用户名
Nickname string `gorm:"column:nickname;not null;comment:昵称" json:"nickname"` // 昵称
Mobile string `gorm:"column:mobile;not null;comment:手机号" json:"mobile"` // 手机号
Password string `gorm:"column:password;not null;comment:密码" json:"password"` // 密码
LoginStatus int32 `gorm:"column:login_status;not null;default:1;comment:登录状态(1:启用 0:禁用)" json:"login_status"` // 登录状态(1:启用 0:禁用)
LastLoginTime time.Time `gorm:"column:last_login_time;not null;default:CURRENT_TIMESTAMP;comment:最后一次登录时间" json:"last_login_time"` // 最后一次登录时间
LastLoginIP string `gorm:"column:last_login_ip;not null;comment:最后一次登录IP" json:"last_login_ip"` // 最后一次登录IP
LastLoginHash string `gorm:"column:last_login_hash;not null;comment:最后一次登录 Hash" json:"last_login_hash"` // 最后一次登录 Hash
CreatedUser string `gorm:"column:created_user;not null;comment:创建人" json:"created_user"` // 创建人
CreatedAt time.Time `gorm:"column:created_at;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` // 创建时间
UpdatedUser string `gorm:"column:updated_user;not null;comment:更新人" json:"updated_user"` // 更新人
UpdatedAt time.Time `gorm:"column:updated_at;not null;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` // 更新时间
}
// TableName Admin's table name
func (*Admin) TableName() string {
return TableNameAdmin
}

View File

@ -0,0 +1,27 @@
// 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 TableNameAppKeyword = "app_keyword"
// AppKeyword 关键字表
type AppKeyword struct {
ID int32 `gorm:"column:id;primaryKey;autoIncrement:true;comment:主键ID" json:"id"` // 主键ID
AppID string `gorm:"column:app_id;not null;comment:小程序ID" json:"app_id"` // 小程序ID
Keyword string `gorm:"column:keyword;not null;comment:关键字" json:"keyword"` // 关键字
CreatedUser string `gorm:"column:created_user;not null;comment:创建人" json:"created_user"` // 创建人
CreatedAt time.Time `gorm:"column:created_at;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` // 创建时间
UpdatedUser string `gorm:"column:updated_user;not null;comment:更新人" json:"updated_user"` // 更新人
UpdatedAt time.Time `gorm:"column:updated_at;not null;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` // 更新时间
}
// TableName AppKeyword's table name
func (*AppKeyword) TableName() string {
return TableNameAppKeyword
}

Some files were not shown because too many files have changed in this diff Show More