mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2025-09-05 22:25:49 +08:00
feat: 增删改查接口实现
This commit is contained in:
parent
3ba1283b88
commit
8573a99a27
43 changed files with 681 additions and 187 deletions
|
@ -10,11 +10,11 @@ jwt:
|
|||
|
||||
|
||||
mysql:
|
||||
path: '127.0.0.1'
|
||||
path: 'localhost'
|
||||
port: '3306'
|
||||
db_name: '1panel'
|
||||
db_name: '1Panel'
|
||||
username: 'root'
|
||||
password: 'Calong@2015'
|
||||
password: 'KubeOperator123@mysql'
|
||||
max_idle_conns: 10
|
||||
max_open_conns: 100
|
||||
|
||||
|
|
13
backend/app/api/v1/entry.go
Normal file
13
backend/app/api/v1/entry.go
Normal file
|
@ -0,0 +1,13 @@
|
|||
package v1
|
||||
|
||||
import "1Panel/app/service"
|
||||
|
||||
type ApiGroup struct {
|
||||
BaseApi
|
||||
}
|
||||
|
||||
var ApiGroupApp = new(ApiGroup)
|
||||
|
||||
var (
|
||||
userService = service.ServiceGroupApp.UserService
|
||||
)
|
114
backend/app/api/v1/user.go
Normal file
114
backend/app/api/v1/user.go
Normal file
|
@ -0,0 +1,114 @@
|
|||
package v1
|
||||
|
||||
import (
|
||||
"1Panel/app/dto"
|
||||
"1Panel/global"
|
||||
"strconv"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
type BaseApi struct{}
|
||||
|
||||
func (b *BaseApi) Login(c *gin.Context) {
|
||||
|
||||
}
|
||||
|
||||
func (b *BaseApi) Register(c *gin.Context) {
|
||||
var req dto.UserCreate
|
||||
_ = c.ShouldBindJSON(&req)
|
||||
|
||||
if err := global.Validator.Struct(req); err != nil {
|
||||
dto.NewResult(c).ErrorCode(500, err.Error())
|
||||
return
|
||||
}
|
||||
if err := userService.Register(req); err != nil {
|
||||
global.Logger.Error("注册失败!", err)
|
||||
dto.NewResult(c).ErrorCode(500, err.Error())
|
||||
return
|
||||
}
|
||||
dto.NewResult(c).Success()
|
||||
}
|
||||
|
||||
func (b *BaseApi) GetUserList(c *gin.Context) {
|
||||
// 这里到时候一起拦截一下
|
||||
p, ok1 := c.GetQuery("page")
|
||||
ps, ok2 := c.GetQuery("pageSize")
|
||||
if !(ok1 && ok2) {
|
||||
dto.NewResult(c).ErrorCode(500, "参数错误")
|
||||
return
|
||||
}
|
||||
page, err := strconv.Atoi(p)
|
||||
if err != nil {
|
||||
global.Logger.Error("获取失败!", err)
|
||||
dto.NewResult(c).ErrorCode(500, err.Error())
|
||||
return
|
||||
}
|
||||
pageSize, err := strconv.Atoi(ps)
|
||||
if err != nil {
|
||||
global.Logger.Error("获取失败!", err)
|
||||
dto.NewResult(c).ErrorCode(500, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
total, list, err := userService.Page(page, pageSize)
|
||||
if err != nil {
|
||||
global.Logger.Error("获取失败!", err)
|
||||
dto.NewResult(c).ErrorCode(500, err.Error())
|
||||
return
|
||||
}
|
||||
dto.NewResult(c).SuccessWithData(dto.PageResult{
|
||||
Items: list,
|
||||
Total: total,
|
||||
})
|
||||
}
|
||||
|
||||
func (b *BaseApi) DeleteUser(c *gin.Context) {
|
||||
var req dto.OperationWithName
|
||||
_ = c.ShouldBindJSON(&req)
|
||||
|
||||
if err := global.Validator.Struct(req); err != nil {
|
||||
dto.NewResult(c).ErrorCode(500, err.Error())
|
||||
return
|
||||
}
|
||||
if err := userService.Delete(req.Name); err != nil {
|
||||
global.Logger.Error("删除失败!", err)
|
||||
dto.NewResult(c).ErrorCode(500, err.Error())
|
||||
return
|
||||
}
|
||||
dto.NewResult(c).Success()
|
||||
}
|
||||
|
||||
func (b *BaseApi) UpdateUser(c *gin.Context) {
|
||||
var req dto.UserUpdate
|
||||
_ = c.ShouldBindJSON(&req)
|
||||
|
||||
if err := global.Validator.Struct(req); err != nil {
|
||||
dto.NewResult(c).ErrorCode(500, err.Error())
|
||||
return
|
||||
}
|
||||
upMap := make(map[string]interface{})
|
||||
upMap["email"] = req.Email
|
||||
if err := userService.Update(upMap); err != nil {
|
||||
global.Logger.Error("更新失败!", err)
|
||||
dto.NewResult(c).ErrorCode(500, err.Error())
|
||||
return
|
||||
}
|
||||
dto.NewResult(c).Success()
|
||||
}
|
||||
|
||||
func (b *BaseApi) GetUserInfo(c *gin.Context) {
|
||||
name, ok := c.Params.Get("name")
|
||||
if !ok {
|
||||
dto.NewResult(c).ErrorCode(500, "参数错误")
|
||||
return
|
||||
}
|
||||
|
||||
user, err := userService.Get(name)
|
||||
if err != nil {
|
||||
global.Logger.Error("更新失败!", err)
|
||||
dto.NewResult(c).ErrorCode(500, err.Error())
|
||||
return
|
||||
}
|
||||
dto.NewResult(c).SuccessWithData(user)
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
package v1
|
||||
|
||||
import "github.com/1Panel-dev/1Panel/app/service"
|
||||
|
||||
type UserController interface {
|
||||
}
|
||||
|
||||
type userController struct {
|
||||
userService service.UserService
|
||||
}
|
||||
|
||||
func NewUserController() UserController {
|
||||
return &userController{
|
||||
userService: service.NewUserService(),
|
||||
}
|
||||
}
|
||||
|
||||
func (u userController) GetUser() {
|
||||
|
||||
}
|
15
backend/app/dto/common_req.go
Normal file
15
backend/app/dto/common_req.go
Normal file
|
@ -0,0 +1,15 @@
|
|||
package dto
|
||||
|
||||
type PageInfo struct {
|
||||
Page int `json:"page" validate:"required,number"`
|
||||
PageSize int `json:"pageSize" validate:"required,number"`
|
||||
}
|
||||
|
||||
type OperationWithName struct {
|
||||
Name string `json:"name" validate:"required"`
|
||||
}
|
||||
|
||||
type OperationWithNameAndType struct {
|
||||
Name string `json:"name" validate:"required"`
|
||||
Type string `json:"type" validate:"required"`
|
||||
}
|
|
@ -1,11 +1,17 @@
|
|||
package result
|
||||
package dto
|
||||
|
||||
import (
|
||||
"github.com/1Panel-dev/1Panel/app/i18n"
|
||||
"github.com/gin-gonic/gin"
|
||||
"1Panel/i18n"
|
||||
"net/http"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
type PageResult struct {
|
||||
Total int64 `json:"total"`
|
||||
Items interface{} `json:"items"`
|
||||
}
|
||||
|
||||
type Response struct {
|
||||
Code int `json:"code"` //提示代码
|
||||
Msg string `json:"msg"` //提示信息
|
30
backend/app/dto/user.go
Normal file
30
backend/app/dto/user.go
Normal file
|
@ -0,0 +1,30 @@
|
|||
package dto
|
||||
|
||||
import (
|
||||
"1Panel/app/model"
|
||||
"time"
|
||||
)
|
||||
|
||||
type UserCreate struct {
|
||||
Name string `json:"name" validate:"name,required"`
|
||||
Password string `json:"password" validate:"password,required"`
|
||||
Email string `json:"email" validate:"required,email"`
|
||||
}
|
||||
|
||||
type UserUpdate struct {
|
||||
Email string `json:"email" validate:"required,email"`
|
||||
}
|
||||
|
||||
type UserBack struct {
|
||||
Name string `json:"name"`
|
||||
Email string `json:"email"`
|
||||
CreatedAt time.Time `json:"createdAt"`
|
||||
}
|
||||
|
||||
func (u UserCreate) UserCreateToMo() model.User {
|
||||
return model.User{
|
||||
Name: u.Name,
|
||||
Password: u.Password,
|
||||
Email: u.Email,
|
||||
}
|
||||
}
|
|
@ -1,9 +0,0 @@
|
|||
package common
|
||||
|
||||
import "time"
|
||||
|
||||
type BaseModel struct {
|
||||
ID uint `gorm:"primarykey"`
|
||||
CreatedAt time.Time `gorm:"autoCreateTime"`
|
||||
UpdatedAt time.Time `gorm:"autoUpdateTime"`
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
package entity
|
||||
|
||||
import "github.com/1Panel-dev/1Panel/app/entity/common"
|
||||
|
||||
type User struct {
|
||||
common.BaseModel
|
||||
Name string `gorm:"primarykey"`
|
||||
Email string
|
||||
Tel string
|
||||
NickName string
|
||||
Password string
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
package i18n
|
||||
|
||||
import ginI18n "github.com/gin-contrib/i18n"
|
||||
|
||||
func GetMsg(msg string) string {
|
||||
content := ginI18n.MustGetMessage(msg)
|
||||
if content == "" {
|
||||
return msg
|
||||
} else {
|
||||
return content
|
||||
}
|
||||
}
|
|
@ -1,9 +1,9 @@
|
|||
package entity
|
||||
package model
|
||||
|
||||
import "github.com/1Panel-dev/1Panel/app/entity/common"
|
||||
import "gorm.io/gorm"
|
||||
|
||||
type OperateLog struct {
|
||||
common.BaseModel
|
||||
gorm.Model
|
||||
Name string `gorm:"type:varchar(64)"`
|
||||
Type string `gorm:"type:varchar(64)"`
|
||||
User string `gorm:"type:varchar(64)"`
|
10
backend/app/model/user.go
Normal file
10
backend/app/model/user.go
Normal file
|
@ -0,0 +1,10 @@
|
|||
package model
|
||||
|
||||
import "gorm.io/gorm"
|
||||
|
||||
type User struct {
|
||||
gorm.Model
|
||||
Name string `json:"name" gorm:"type:varchar(64);not null;"`
|
||||
Password string `json:"password" gorm:"type:varchar(64)"`
|
||||
Email string `json:"email" gorm:"type:varchar(64);not null;"`
|
||||
}
|
31
backend/app/repo/common.go
Normal file
31
backend/app/repo/common.go
Normal file
|
@ -0,0 +1,31 @@
|
|||
package repo
|
||||
|
||||
import "gorm.io/gorm"
|
||||
|
||||
type DBOption func(*gorm.DB) *gorm.DB
|
||||
|
||||
type ICommonRepo interface {
|
||||
WithByID(id uint) DBOption
|
||||
WithByName(name string) DBOption
|
||||
WithOrderBy(orderStr string) DBOption
|
||||
}
|
||||
|
||||
type CommonRepo struct{}
|
||||
|
||||
func (c *CommonRepo) WithByID(id uint) DBOption {
|
||||
return func(g *gorm.DB) *gorm.DB {
|
||||
return g.Where("id = ?", id)
|
||||
}
|
||||
}
|
||||
|
||||
func (c *CommonRepo) WithByName(name string) DBOption {
|
||||
return func(g *gorm.DB) *gorm.DB {
|
||||
return g.Where("name = ?", name)
|
||||
}
|
||||
}
|
||||
|
||||
func (c *CommonRepo) WithOrderBy(orderStr string) DBOption {
|
||||
return func(g *gorm.DB) *gorm.DB {
|
||||
return g.Order(orderStr)
|
||||
}
|
||||
}
|
8
backend/app/repo/entry.go
Normal file
8
backend/app/repo/entry.go
Normal file
|
@ -0,0 +1,8 @@
|
|||
package repo
|
||||
|
||||
type RepoGroup struct {
|
||||
UserRepo
|
||||
CommonRepo
|
||||
}
|
||||
|
||||
var RepoGroupApp = new(RepoGroup)
|
|
@ -1,30 +1,75 @@
|
|||
package repo
|
||||
|
||||
import (
|
||||
"github.com/1Panel-dev/1Panel/global"
|
||||
"github.com/1Panel-dev/1Panel/internal/entity"
|
||||
"1Panel/app/model"
|
||||
"1Panel/global"
|
||||
)
|
||||
|
||||
type UserRepo interface {
|
||||
CreateUser(user *entity.User) error
|
||||
ListUser() (entity.User, error)
|
||||
type UserRepo struct{}
|
||||
|
||||
type IUserRepo interface {
|
||||
Get(opts ...DBOption) (model.User, error)
|
||||
GetList(opts ...DBOption) ([]model.User, error)
|
||||
Page(limit, offset int, opts ...DBOption) (int64, []model.User, error)
|
||||
Create(user *model.User) error
|
||||
Update(vars map[string]interface{}) error
|
||||
Save(user model.User) error
|
||||
Delete(opts ...DBOption) error
|
||||
}
|
||||
|
||||
func NewUserRepo() UserRepo {
|
||||
return &userRepo{}
|
||||
func NewIUserService() IUserRepo {
|
||||
return &UserRepo{}
|
||||
}
|
||||
|
||||
type userRepo struct {
|
||||
func (u *UserRepo) Get(opts ...DBOption) (model.User, error) {
|
||||
var user model.User
|
||||
db := global.DB
|
||||
for _, opt := range opts {
|
||||
db = opt(db)
|
||||
}
|
||||
err := db.First(&user).Error
|
||||
return user, err
|
||||
}
|
||||
|
||||
func (u *userRepo) CreateUser(user *entity.User) error {
|
||||
func (u *UserRepo) GetList(opts ...DBOption) ([]model.User, error) {
|
||||
var users []model.User
|
||||
db := global.DB
|
||||
for _, opt := range opts {
|
||||
db = opt(db)
|
||||
}
|
||||
err := db.Find(&users).Error
|
||||
return users, err
|
||||
}
|
||||
|
||||
func (u *UserRepo) Page(page, size int, opts ...DBOption) (int64, []model.User, error) {
|
||||
var users []model.User
|
||||
db := global.DB.Model(&model.User{})
|
||||
for _, opt := range opts {
|
||||
db = opt(db)
|
||||
}
|
||||
count := int64(0)
|
||||
db = db.Count(&count)
|
||||
err := db.Limit(page).Offset(size * (page - 1)).Find(&users).Error
|
||||
return count, users, err
|
||||
}
|
||||
|
||||
func (u *UserRepo) Create(user *model.User) error {
|
||||
return global.DB.Create(user).Error
|
||||
}
|
||||
|
||||
func (u *userRepo) ListUser() (entity.User, error) {
|
||||
var user entity.User
|
||||
if err := global.DB.Model(&entity.User{}).First(&user).Error; err != nil {
|
||||
return user, err
|
||||
}
|
||||
return user, nil
|
||||
func (u *UserRepo) Update(vars map[string]interface{}) error {
|
||||
return global.DB.Model(&model.User{}).Updates(vars).Error
|
||||
}
|
||||
|
||||
func (u *UserRepo) Save(user model.User) error {
|
||||
return global.DB.Save(user).Error
|
||||
}
|
||||
|
||||
func (u *UserRepo) Delete(opts ...DBOption) error {
|
||||
db := global.DB
|
||||
for _, opt := range opts {
|
||||
db = opt(db)
|
||||
}
|
||||
|
||||
return db.Delete(&model.User{}).Error
|
||||
}
|
||||
|
|
14
backend/app/service/entry.go
Normal file
14
backend/app/service/entry.go
Normal file
|
@ -0,0 +1,14 @@
|
|||
package service
|
||||
|
||||
import "1Panel/app/repo"
|
||||
|
||||
type ServiceGroup struct {
|
||||
UserService
|
||||
}
|
||||
|
||||
var ServiceGroupApp = new(ServiceGroup)
|
||||
|
||||
var (
|
||||
userRepo = repo.RepoGroupApp.UserRepo
|
||||
commonRepo = repo.RepoGroupApp.CommonRepo
|
||||
)
|
88
backend/app/service/user.go
Normal file
88
backend/app/service/user.go
Normal file
|
@ -0,0 +1,88 @@
|
|||
package service
|
||||
|
||||
import (
|
||||
"1Panel/app/dto"
|
||||
"1Panel/app/model"
|
||||
"1Panel/global"
|
||||
"errors"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type UserService struct{}
|
||||
|
||||
type IUserService interface {
|
||||
Get(name string) (*dto.UserBack, error)
|
||||
Page(page, size int) (int64, interface{}, error)
|
||||
Register(userDto dto.UserCreate) error
|
||||
Login(info *model.User) (*dto.UserBack, error)
|
||||
Delete(name string) error
|
||||
Save(req model.User) error
|
||||
Update(upMap map[string]interface{}) error
|
||||
}
|
||||
|
||||
func NewIUserService() IUserService {
|
||||
return &UserService{}
|
||||
}
|
||||
|
||||
func (u *UserService) Get(name string) (*dto.UserBack, error) {
|
||||
user, err := userRepo.Get(commonRepo.WithByName(name))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
dtoUser := &dto.UserBack{
|
||||
Name: user.Name,
|
||||
Email: user.Email,
|
||||
CreatedAt: user.CreatedAt,
|
||||
}
|
||||
return dtoUser, nil
|
||||
}
|
||||
|
||||
func (u *UserService) Page(page, size int) (int64, interface{}, error) {
|
||||
total, users, err := userRepo.Page(page, size)
|
||||
var dtoUsers []dto.UserBack
|
||||
for _, user := range users {
|
||||
dtoUsers = append(dtoUsers, dto.UserBack{
|
||||
Name: user.Name,
|
||||
Email: user.Email,
|
||||
CreatedAt: user.CreatedAt,
|
||||
})
|
||||
}
|
||||
return total, dtoUsers, err
|
||||
}
|
||||
|
||||
func (u *UserService) Register(userDto dto.UserCreate) error {
|
||||
user := userDto.UserCreateToMo()
|
||||
if !errors.Is(global.DB.Where("name = ?", user.Name).First(&user).Error, gorm.ErrRecordNotFound) {
|
||||
return errors.New("用户名已注册")
|
||||
}
|
||||
return userRepo.Create(&user)
|
||||
}
|
||||
|
||||
func (u *UserService) Login(info *model.User) (*dto.UserBack, error) {
|
||||
user, err := userRepo.Get(commonRepo.WithByName(info.Name))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if user.Password != info.Password {
|
||||
return nil, errors.New("登录失败")
|
||||
}
|
||||
dtoUser := &dto.UserBack{
|
||||
Name: user.Name,
|
||||
Email: user.Email,
|
||||
CreatedAt: user.CreatedAt,
|
||||
}
|
||||
return dtoUser, err
|
||||
}
|
||||
|
||||
func (u *UserService) Delete(name string) error {
|
||||
return userRepo.Delete(commonRepo.WithByName(name))
|
||||
}
|
||||
|
||||
func (u *UserService) Save(req model.User) error {
|
||||
return userRepo.Save(req)
|
||||
}
|
||||
|
||||
func (u *UserService) Update(upMap map[string]interface{}) error {
|
||||
return userRepo.Update(upMap)
|
||||
}
|
|
@ -1,17 +0,0 @@
|
|||
package service
|
||||
|
||||
import "github.com/1Panel-dev/1Panel/internal/repo"
|
||||
|
||||
type UserService interface {
|
||||
}
|
||||
|
||||
func NewUserService() UserService {
|
||||
return &userService{}
|
||||
}
|
||||
|
||||
type userService struct {
|
||||
userRepo repo.UserRepo
|
||||
}
|
||||
|
||||
func (u *userService) Get() {
|
||||
}
|
|
@ -1,8 +1,8 @@
|
|||
package errres
|
||||
|
||||
import (
|
||||
"1Panel/app/dto"
|
||||
"errors"
|
||||
"github.com/1Panel-dev/1Panel/app/result"
|
||||
)
|
||||
|
||||
const (
|
||||
|
@ -15,10 +15,10 @@ const (
|
|||
)
|
||||
|
||||
var (
|
||||
OK = result.NewSuccess(Success, "Ok")
|
||||
InvalidParam = result.NewError(InvalidParams, "InvalidParams")
|
||||
JwtExpired = result.NewError(InvalidJwtExpired, "JwtExpired")
|
||||
JwtNotFound = result.NewError(InvalidJwtNotFound, "JwtNotFound")
|
||||
OK = dto.NewSuccess(Success, "Ok")
|
||||
InvalidParam = dto.NewError(InvalidParams, "InvalidParams")
|
||||
JwtExpired = dto.NewError(InvalidJwtExpired, "JwtExpired")
|
||||
JwtNotFound = dto.NewError(InvalidJwtNotFound, "JwtNotFound")
|
||||
)
|
||||
|
||||
var (
|
|
@ -1,13 +1,16 @@
|
|||
package global
|
||||
|
||||
import (
|
||||
"github.com/1Panel-dev/1Panel/configs"
|
||||
"1Panel/configs"
|
||||
|
||||
"github.com/go-playground/validator/v10"
|
||||
"github.com/sirupsen/logrus"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
var (
|
||||
DB *gorm.DB
|
||||
Logger *logrus.Logger
|
||||
Config configs.ServerConfig
|
||||
DB *gorm.DB
|
||||
Logger *logrus.Logger
|
||||
Config configs.ServerConfig
|
||||
Validator *validator.Validate
|
||||
)
|
||||
|
|
|
@ -1,32 +1,34 @@
|
|||
module github.com/1Panel-dev/1Panel
|
||||
module 1Panel
|
||||
|
||||
go 1.18
|
||||
|
||||
require (
|
||||
github.com/fsnotify/fsnotify v1.5.4
|
||||
github.com/fvbock/endless v0.0.0-20170109170031-447134032cb6
|
||||
github.com/gin-contrib/i18n v0.0.1
|
||||
github.com/gin-gonic/gin v1.8.1
|
||||
github.com/go-gormigrate/gormigrate/v2 v2.0.2
|
||||
github.com/go-playground/validator/v10 v10.11.0
|
||||
github.com/golang-jwt/jwt/v4 v4.4.2
|
||||
github.com/jinzhu/copier v0.3.5
|
||||
github.com/natefinch/lumberjack v2.0.0+incompatible
|
||||
github.com/pelletier/go-toml/v2 v2.0.2
|
||||
github.com/pkg/errors v0.9.1
|
||||
github.com/sirupsen/logrus v1.9.0
|
||||
github.com/spf13/viper v1.12.0
|
||||
golang.org/x/text v0.3.7
|
||||
gorm.io/driver/mysql v1.3.5
|
||||
gorm.io/driver/sqlite v1.3.6
|
||||
gorm.io/gorm v1.23.8
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/gin-contrib/i18n v0.0.1 // indirect
|
||||
github.com/gin-contrib/sse v0.1.0 // indirect
|
||||
github.com/go-bindata/go-bindata v3.1.2+incompatible // indirect
|
||||
github.com/go-gormigrate/gormigrate/v2 v2.0.2 // indirect
|
||||
github.com/go-playground/locales v0.14.0 // indirect
|
||||
github.com/go-playground/universal-translator v0.18.0 // indirect
|
||||
github.com/go-playground/validator/v10 v10.11.0 // indirect
|
||||
github.com/go-sql-driver/mysql v1.6.0 // indirect
|
||||
github.com/goccy/go-json v0.9.10 // indirect
|
||||
github.com/golang-jwt/jwt/v4 v4.4.2 // indirect
|
||||
github.com/goccy/go-json v0.9.7 // indirect
|
||||
github.com/hashicorp/hcl v1.0.0 // indirect
|
||||
github.com/jinzhu/copier v0.3.5 // indirect
|
||||
github.com/jinzhu/inflection v1.0.0 // indirect
|
||||
github.com/jinzhu/now v1.1.5 // indirect
|
||||
github.com/json-iterator/go v1.1.12 // indirect
|
||||
|
@ -37,22 +39,19 @@ require (
|
|||
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/nicksnyder/go-i18n/v2 v2.2.0 // indirect
|
||||
github.com/nicksnyder/go-i18n/v2 v2.1.2 // indirect
|
||||
github.com/pelletier/go-toml v1.9.5 // indirect
|
||||
github.com/pelletier/go-toml/v2 v2.0.2 // indirect
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
github.com/spf13/afero v1.9.2 // indirect
|
||||
github.com/spf13/afero v1.8.2 // indirect
|
||||
github.com/spf13/cast v1.5.0 // indirect
|
||||
github.com/spf13/jwalterweatherman v1.1.0 // indirect
|
||||
github.com/spf13/pflag v1.0.5 // indirect
|
||||
github.com/subosito/gotenv v1.4.0 // indirect
|
||||
github.com/subosito/gotenv v1.3.0 // indirect
|
||||
github.com/ugorji/go/codec v1.2.7 // indirect
|
||||
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa // indirect
|
||||
golang.org/x/net v0.0.0-20220802222814-0bcc04d9c69b // indirect
|
||||
golang.org/x/sys v0.0.0-20220803195053-6e608f9ce704 // indirect
|
||||
golang.org/x/text v0.3.7 // indirect
|
||||
google.golang.org/protobuf v1.28.1 // indirect
|
||||
gopkg.in/ini.v1 v1.66.6 // indirect
|
||||
golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 // indirect
|
||||
golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2 // indirect
|
||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect
|
||||
google.golang.org/protobuf v1.28.0 // indirect
|
||||
gopkg.in/ini.v1 v1.66.4 // indirect
|
||||
gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect
|
||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
|
|
|
@ -38,8 +38,6 @@ cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3f
|
|||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
||||
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/BurntSushi/toml v1.0.0 h1:dtDWrepsVPfW9H/4y7dDgFc2MBUSeJhlaDtK13CxFlU=
|
||||
github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
|
||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
||||
|
@ -53,6 +51,7 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3
|
|||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/denisenkom/go-mssqldb v0.12.0 h1:VtrkII767ttSPNRfFekePK3sctr+joXgO58stqQbtUA=
|
||||
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=
|
||||
|
@ -71,8 +70,6 @@ github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm
|
|||
github.com/gin-gonic/gin v1.7.4/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY=
|
||||
github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8=
|
||||
github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk=
|
||||
github.com/go-bindata/go-bindata v3.1.2+incompatible h1:5vjJMVhowQdPzjE1LdxyFF7YFTXg5IgGVW4gBr5IbvE=
|
||||
github.com/go-bindata/go-bindata v3.1.2+incompatible/go.mod h1:xK8Dsgwmeed+BBsSy2XTopBn/8uK2HWuGSnA11C3Joo=
|
||||
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=
|
||||
|
@ -91,10 +88,12 @@ github.com/go-playground/validator/v10 v10.11.0 h1:0W+xRM511GY47Yy3bZUbJVitCNg2B
|
|||
github.com/go-playground/validator/v10 v10.11.0/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU=
|
||||
github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
|
||||
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||
github.com/goccy/go-json v0.9.10 h1:hCeNmprSNLB8B8vQKWl6DpuH0t60oEs+TAk9a7CScKc=
|
||||
github.com/goccy/go-json v0.9.10/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
|
||||
github.com/goccy/go-json v0.9.7 h1:IcB+Aqpx/iMHu5Yooh7jEzJk1JZ7Pjtmys2ukPr7EeM=
|
||||
github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
|
||||
github.com/golang-jwt/jwt/v4 v4.4.2 h1:rcc4lwaZgFMCZ5jxF9ABolDcIHdBytAFgqFPbSJQAYs=
|
||||
github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
|
||||
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY=
|
||||
github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188 h1:+eHOFJl1BaXrQxKX+T06f78590z4qA2ZzBTqahsKSE4=
|
||||
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=
|
||||
|
@ -159,6 +158,14 @@ 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.12.1 h1:rsDFzIpRk7xT4B8FufgpCCeyjdNpKyghZeSefViE5W8=
|
||||
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.0 h1:brH0pCGBDkBW07HWlN/oSBXrmo3WB0UvZd1pIuDcL8Y=
|
||||
github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg=
|
||||
github.com/jackc/pgtype v1.11.0 h1:u4uiGPz/1hryuXzyaBhSk6dnIyyG2683olG2OV+UUgs=
|
||||
github.com/jackc/pgx/v4 v4.16.1 h1:JzTglcal01DrghUqt+PmzWsZx/Yh7SC/CTQmSBMTd0Y=
|
||||
github.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg=
|
||||
github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg=
|
||||
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
|
||||
|
@ -166,6 +173,7 @@ github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkr
|
|||
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/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg=
|
||||
github.com/json-iterator/go v1.1.9/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=
|
||||
|
@ -201,9 +209,8 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G
|
|||
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
|
||||
github.com/natefinch/lumberjack v2.0.0+incompatible h1:4QJd3OLAMgj7ph+yZTuX13Ld4UpgHp07nNdFX7mqFfM=
|
||||
github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk=
|
||||
github.com/nicksnyder/go-i18n/v2 v2.1.2 h1:QHYxcUJnGHBaq7XbvgunmZ2Pn0focXFqTD61CkH146c=
|
||||
github.com/nicksnyder/go-i18n/v2 v2.1.2/go.mod h1:d++QJC9ZVf7pa48qrsRWhMJ5pSHIPmS3OLqK1niyLxs=
|
||||
github.com/nicksnyder/go-i18n/v2 v2.2.0 h1:MNXbyPvd141JJqlU6gJKrczThxJy+kdCNivxZpBQFkw=
|
||||
github.com/nicksnyder/go-i18n/v2 v2.2.0/go.mod h1:4OtLfzqyAxsscyCb//3gfqSvBc81gImX91LrZzczN1o=
|
||||
github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=
|
||||
github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
|
||||
github.com/pelletier/go-toml/v2 v2.0.2 h1:+jQXlF3scKIcSEKkdHzXhCTDLPFi5r1wnK6yPS+49Gw=
|
||||
|
@ -221,8 +228,8 @@ github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUA
|
|||
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
|
||||
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
|
||||
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
||||
github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw=
|
||||
github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y=
|
||||
github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo=
|
||||
github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo=
|
||||
github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w=
|
||||
github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU=
|
||||
github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
|
||||
|
@ -240,10 +247,9 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
|
|||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s=
|
||||
github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
|
||||
github.com/subosito/gotenv v1.4.0 h1:yAzM1+SmVcz5R4tXGsNMu1jUl2aOJXoiWUCEwwnGrvs=
|
||||
github.com/subosito/gotenv v1.4.0/go.mod h1:mZd6rFysKEcUhUHXJk0C/08wAgyDBFuwEYL7vWWGaGo=
|
||||
github.com/subosito/gotenv v1.3.0 h1:mjC+YW8QpAdXibNi+vNWgzmgBH4+5l5dCXv8cNysBLI=
|
||||
github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs=
|
||||
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
|
||||
github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo=
|
||||
github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M=
|
||||
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
|
||||
github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0=
|
||||
|
@ -266,8 +272,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
|
|||
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
||||
golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa h1:zuSxTR4o9y82ebqCUJYNGJbGPo6sKVl54f/TVDObg1c=
|
||||
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 h1:kUhD7nTDoI3fVd9G4ORWrbV5NY0liEs/Jg2pv5f+bBA=
|
||||
golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
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=
|
||||
|
@ -333,8 +339,8 @@ golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v
|
|||
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-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20220802222814-0bcc04d9c69b h1:3ogNYyK4oIQdIKzTu68hQrr4iuVxF3AxKl9Aj/eDrw0=
|
||||
golang.org/x/net v0.0.0-20220802222814-0bcc04d9c69b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
|
||||
golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2 h1:NWy5+hlRbC7HK+PmcXVUmW1IMyFce7to56IUvhUFm7Y=
|
||||
golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||
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=
|
||||
|
@ -393,11 +399,8 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc
|
|||
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-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ=
|
||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220731174439-a90be440212d h1:Sv5ogFZatcgIMMtBSTTAgMYsicp25MXBubjXNDKwm80=
|
||||
golang.org/x/sys v0.0.0-20220731174439-a90be440212d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220803195053-6e608f9ce704 h1:Y7NOhdqIOU8kYI7BxsgL38d0ot0raxvcW+EMQU2QrT4=
|
||||
golang.org/x/sys v0.0.0-20220803195053-6e608f9ce704/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
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=
|
||||
|
@ -551,15 +554,15 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD
|
|||
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.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
|
||||
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||
google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
|
||||
google.golang.org/protobuf v1.28.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-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.66.6 h1:LATuAqN/shcYAOkv3wl2L4rkaKqkcgTBQjOyYDvcPKI=
|
||||
gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||
gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4=
|
||||
gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||
gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
|
||||
gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
|
@ -573,8 +576,10 @@ 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/driver/mysql v1.3.5 h1:iWBTVW/8Ij5AG4e0G/zqzaJblYkBI1VIL1LG2HUGsvY=
|
||||
gorm.io/driver/mysql v1.3.5/go.mod h1:sSIebwZAVPiT+27jK9HIwvsqOGKx3YMPmrA3mBJR10c=
|
||||
gorm.io/driver/postgres v1.3.7 h1:FKF6sIMDHDEvvMF/XJvbnCl0nu6KSKUaPXevJ4r+VYQ=
|
||||
gorm.io/driver/sqlite v1.3.6 h1:Fi8xNYCUplOqWiPa3/GuCeowRNBRGTf62DEmhMDHeQQ=
|
||||
gorm.io/driver/sqlite v1.3.6/go.mod h1:Sg1/pvnKtbQ7jLXxfZa+jSHvoX8hoZA8cn4xllOMTgE=
|
||||
gorm.io/driver/sqlserver v1.3.2 h1:yYt8f/xdAKLY7lCCyXxIUEgZ/WsURos3dHrx8MKFGAk=
|
||||
gorm.io/gorm v1.23.4/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=
|
||||
gorm.io/gorm v1.23.8 h1:h8sGJ+biDgBA1AD1Ha9gFCx7h8npU7AsLdlkX0n2TpE=
|
||||
gorm.io/gorm v1.23.8/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=
|
||||
|
|
11
backend/i18n/i18n.go
Normal file
11
backend/i18n/i18n.go
Normal file
|
@ -0,0 +1,11 @@
|
|||
package i18n
|
||||
|
||||
func GetMsg(msg string) string {
|
||||
// content := ginI18n.MustGetMessage(msg)
|
||||
// if content == "" {
|
||||
// return msg
|
||||
// } else {
|
||||
// return content
|
||||
// }
|
||||
return ""
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
package db
|
||||
|
||||
import "github.com/1Panel-dev/1Panel/global"
|
||||
import "1Panel/global"
|
||||
|
||||
func Init() {
|
||||
switch global.Config.System.DbType {
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
package db
|
||||
|
||||
import (
|
||||
"github.com/1Panel-dev/1Panel/global"
|
||||
"1Panel/global"
|
||||
|
||||
"gorm.io/driver/mysql"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
package db
|
||||
|
||||
import (
|
||||
"github.com/1Panel-dev/1Panel/global"
|
||||
"1Panel/global"
|
||||
|
||||
"gorm.io/driver/sqlite"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
package log
|
||||
|
||||
import (
|
||||
"github.com/1Panel-dev/1Panel/configs"
|
||||
"github.com/1Panel-dev/1Panel/global"
|
||||
"1Panel/configs"
|
||||
"1Panel/global"
|
||||
"path"
|
||||
|
||||
"github.com/natefinch/lumberjack"
|
||||
"github.com/sirupsen/logrus"
|
||||
"path"
|
||||
)
|
||||
|
||||
func Init() {
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
package migration
|
||||
|
||||
import (
|
||||
"github.com/1Panel-dev/1Panel/global"
|
||||
"github.com/1Panel-dev/1Panel/init/migration/migrations"
|
||||
"1Panel/global"
|
||||
"1Panel/init/migration/migrations"
|
||||
|
||||
"github.com/go-gormigrate/gormigrate/v2"
|
||||
)
|
||||
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
package migrations
|
||||
|
||||
import (
|
||||
"github.com/1Panel-dev/1Panel/app/entity"
|
||||
"1Panel/app/model"
|
||||
|
||||
"github.com/go-gormigrate/gormigrate/v2"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
@ -9,12 +10,12 @@ import (
|
|||
var InitTable = &gormigrate.Migration{
|
||||
ID: "20220803-init-table",
|
||||
Migrate: func(tx *gorm.DB) error {
|
||||
return tx.AutoMigrate(&entity.User{})
|
||||
return tx.AutoMigrate(&model.User{})
|
||||
},
|
||||
}
|
||||
|
||||
var user = entity.User{
|
||||
Name: "admin", Email: "admin@fit2cloud.com", NickName: "admin", Password: "Calong@2015",
|
||||
var user = model.User{
|
||||
Name: "admin", Email: "admin@fit2cloud.com", Password: "Calong@2015",
|
||||
}
|
||||
|
||||
var AddData = &gormigrate.Migration{
|
||||
|
|
27
backend/init/router/router.go
Normal file
27
backend/init/router/router.go
Normal file
|
@ -0,0 +1,27 @@
|
|||
package router
|
||||
|
||||
import (
|
||||
rou "1Panel/router"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func Routers() *gin.Engine {
|
||||
Router := gin.Default()
|
||||
systemRouter := rou.RouterGroupApp
|
||||
|
||||
PublicGroup := Router.Group("")
|
||||
{
|
||||
PublicGroup.GET("/health", func(c *gin.Context) {
|
||||
c.JSON(200, "ok")
|
||||
})
|
||||
}
|
||||
{
|
||||
systemRouter.InitBaseRouter(PublicGroup) // 注册基础功能路由 不做鉴权
|
||||
}
|
||||
PrivateGroup := Router.Group("")
|
||||
{
|
||||
systemRouter.InitUserRouter(PrivateGroup) // 注册用户路由
|
||||
}
|
||||
|
||||
return Router
|
||||
}
|
64
backend/init/validator/validator.go
Normal file
64
backend/init/validator/validator.go
Normal file
|
@ -0,0 +1,64 @@
|
|||
package validator
|
||||
|
||||
import (
|
||||
"1Panel/global"
|
||||
"regexp"
|
||||
"unicode"
|
||||
|
||||
"github.com/go-playground/validator/v10"
|
||||
)
|
||||
|
||||
func Init() {
|
||||
validator := validator.New()
|
||||
if err := validator.RegisterValidation("name", checkNamePattern); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
if err := validator.RegisterValidation("ip", checkIpPattern); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
if err := validator.RegisterValidation("password", checkPasswordPattern); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
global.Validator = validator
|
||||
}
|
||||
|
||||
func checkNamePattern(fl validator.FieldLevel) bool {
|
||||
value := fl.Field().String()
|
||||
result, err := regexp.MatchString("^[a-zA-Z\u4e00-\u9fa5]{1}[a-zA-Z0-9_\u4e00-\u9fa5]{0,30}$", value)
|
||||
if err != nil {
|
||||
global.Logger.Errorf("regexp matchString failed, %v", err)
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func checkIpPattern(fl validator.FieldLevel) bool {
|
||||
value := fl.Field().String()
|
||||
result, err := regexp.MatchString(`^((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}$`, value)
|
||||
if err != nil {
|
||||
global.Logger.Errorf("regexp check ip matchString failed, %v", err)
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func checkPasswordPattern(fl validator.FieldLevel) bool {
|
||||
value := fl.Field().String()
|
||||
if len(value) < 8 || len(value) > 30 {
|
||||
return false
|
||||
}
|
||||
|
||||
hasNum := false
|
||||
hasLetter := false
|
||||
for _, r := range value {
|
||||
if unicode.IsLetter(r) && !hasLetter {
|
||||
hasLetter = true
|
||||
}
|
||||
if unicode.IsNumber(r) && !hasNum {
|
||||
hasNum = true
|
||||
}
|
||||
if hasLetter && hasNum {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
|
@ -1,9 +1,10 @@
|
|||
package viper
|
||||
|
||||
import (
|
||||
"1Panel/configs"
|
||||
"1Panel/global"
|
||||
"fmt"
|
||||
"github.com/1Panel-dev/1Panel/configs"
|
||||
"github.com/1Panel-dev/1Panel/global"
|
||||
|
||||
"github.com/fsnotify/fsnotify"
|
||||
"github.com/spf13/viper"
|
||||
)
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package main
|
||||
|
||||
import "github.com/1Panel-dev/1Panel/server"
|
||||
import "1Panel/server"
|
||||
|
||||
func main() {
|
||||
server.Start()
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
package middlerware
|
||||
|
||||
import (
|
||||
"github.com/1Panel-dev/1Panel/configs"
|
||||
"github.com/1Panel-dev/1Panel/global"
|
||||
"github.com/gin-gonic/gin"
|
||||
"1Panel/configs"
|
||||
"1Panel/global"
|
||||
"net/http"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func Cors() gin.HandlerFunc {
|
||||
|
|
|
@ -1,18 +1,19 @@
|
|||
package middlerware
|
||||
|
||||
import (
|
||||
"1Panel/app/dto"
|
||||
"1Panel/constant/errres"
|
||||
"1Panel/utils"
|
||||
"errors"
|
||||
"github.com/1Panel-dev/1Panel/app/constant/errres"
|
||||
"github.com/1Panel-dev/1Panel/app/result"
|
||||
"github.com/1Panel-dev/1Panel/utils"
|
||||
"github.com/gin-gonic/gin"
|
||||
"time"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func JwtAuth() gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
token := c.Request.Header.Get("Authorization")
|
||||
re := result.NewResult(c)
|
||||
re := dto.NewResult(c)
|
||||
if token == "" {
|
||||
re.Error(errres.JwtNotFound)
|
||||
return
|
||||
|
|
|
@ -1,20 +1,21 @@
|
|||
package middlerware
|
||||
|
||||
import (
|
||||
"github.com/1Panel-dev/1Panel/app/entity"
|
||||
"github.com/1Panel-dev/1Panel/global"
|
||||
"1Panel/app/model"
|
||||
"1Panel/global"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func Logger() gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
path := c.Request.URL.Path
|
||||
operateLog := entity.OperateLog{
|
||||
operateLog := model.OperateLog{
|
||||
Path: path,
|
||||
IP: c.ClientIP(),
|
||||
UserAgent: c.Request.UserAgent(),
|
||||
}
|
||||
global.DB.Model(entity.OperateLog{}).Save(&operateLog)
|
||||
global.DB.Model(model.OperateLog{}).Save(&operateLog)
|
||||
c.Next()
|
||||
}
|
||||
}
|
||||
|
|
8
backend/router/entry.go
Normal file
8
backend/router/entry.go
Normal file
|
@ -0,0 +1,8 @@
|
|||
package router
|
||||
|
||||
type RouterGroup struct {
|
||||
BaseRouter
|
||||
UserRouter
|
||||
}
|
||||
|
||||
var RouterGroupApp = new(RouterGroup)
|
17
backend/router/ro_base.go
Normal file
17
backend/router/ro_base.go
Normal file
|
@ -0,0 +1,17 @@
|
|||
package router
|
||||
|
||||
import (
|
||||
v1 "1Panel/app/api/v1"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
type BaseRouter struct{}
|
||||
|
||||
func (s *BaseRouter) InitBaseRouter(Router *gin.RouterGroup) (R gin.IRoutes) {
|
||||
baseRouter := Router.Group("base")
|
||||
baseApi := v1.ApiGroupApp.BaseApi
|
||||
{
|
||||
baseRouter.POST("login", baseApi.Login)
|
||||
}
|
||||
return baseRouter
|
||||
}
|
20
backend/router/ro_user.go
Normal file
20
backend/router/ro_user.go
Normal file
|
@ -0,0 +1,20 @@
|
|||
package router
|
||||
|
||||
import (
|
||||
v1 "1Panel/app/api/v1"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
type UserRouter struct{}
|
||||
|
||||
func (s *UserRouter) InitUserRouter(Router *gin.RouterGroup) {
|
||||
userRouter := Router.Group("users")
|
||||
baseApi := v1.ApiGroupApp.BaseApi
|
||||
{
|
||||
userRouter.POST("", baseApi.Register)
|
||||
userRouter.DELETE("", baseApi.DeleteUser)
|
||||
userRouter.GET("", baseApi.GetUserList)
|
||||
userRouter.GET(":name", baseApi.GetUserInfo)
|
||||
}
|
||||
}
|
|
@ -1,10 +1,11 @@
|
|||
package router
|
||||
|
||||
import (
|
||||
"github.com/1Panel-dev/1Panel/middlerware"
|
||||
"1Panel/middlerware"
|
||||
"html/template"
|
||||
|
||||
ginI18n "github.com/gin-contrib/i18n"
|
||||
"github.com/gin-gonic/gin"
|
||||
"html/template"
|
||||
)
|
||||
|
||||
func Routers() *gin.Engine {
|
||||
|
|
|
@ -1,16 +1,18 @@
|
|||
package server
|
||||
|
||||
import (
|
||||
"1Panel/global"
|
||||
"1Panel/init/db"
|
||||
"1Panel/init/log"
|
||||
"1Panel/init/migration"
|
||||
"1Panel/init/router"
|
||||
"1Panel/init/validator"
|
||||
"1Panel/init/viper"
|
||||
"fmt"
|
||||
"github.com/1Panel-dev/1Panel/global"
|
||||
"github.com/1Panel-dev/1Panel/init/db"
|
||||
"github.com/1Panel-dev/1Panel/init/log"
|
||||
"github.com/1Panel-dev/1Panel/init/migration"
|
||||
"github.com/1Panel-dev/1Panel/init/viper"
|
||||
"github.com/1Panel-dev/1Panel/router"
|
||||
"time"
|
||||
|
||||
"github.com/fvbock/endless"
|
||||
"github.com/gin-gonic/gin"
|
||||
"time"
|
||||
)
|
||||
|
||||
func Start() {
|
||||
|
@ -18,6 +20,7 @@ func Start() {
|
|||
log.Init()
|
||||
db.Init()
|
||||
migration.Init()
|
||||
validator.Init()
|
||||
routers := router.Routers()
|
||||
address := fmt.Sprintf(":%d", global.Config.System.Port)
|
||||
s := initServer(address, routers)
|
||||
|
|
22
backend/utils/copier/copier.go
Normal file
22
backend/utils/copier/copier.go
Normal file
|
@ -0,0 +1,22 @@
|
|||
package copier
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
// Copy 从一个结构体复制到另一个结构体
|
||||
func Copy(to, from interface{}) error {
|
||||
b, err := json.Marshal(from)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "marshal from data err")
|
||||
}
|
||||
|
||||
err = json.Unmarshal(b, to)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "unmarshal to data err")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
|
@ -1,11 +1,12 @@
|
|||
package utils
|
||||
|
||||
import (
|
||||
"github.com/1Panel-dev/1Panel/app/constant/errres"
|
||||
"github.com/1Panel-dev/1Panel/app/dto"
|
||||
"github.com/1Panel-dev/1Panel/global"
|
||||
"github.com/golang-jwt/jwt/v4"
|
||||
"1Panel/app/dto"
|
||||
"1Panel/constant/errres"
|
||||
"1Panel/global"
|
||||
"time"
|
||||
|
||||
"github.com/golang-jwt/jwt/v4"
|
||||
)
|
||||
|
||||
type JWT struct {
|
||||
|
|
Loading…
Add table
Reference in a new issue