2.7.9beta (#1993)
* 媒体库增加分类,图库多选择时优化。 * 重构 JWT token 生成,使用 `New()` 函数代替直接创建实例 * 上传组件支持查看大图 (#1982) * 将参数缓存,媒体库增加分类,图库多选择时优化。 (#1978) * 媒体库增加分类,图库多选择时优化。 *修复文件上传进度显示bug&按钮样式优化 (#1986) * fix:添加内部 iframe 展示网页,优化 permission 代码 * 俩个uuid库合并一个,更新库到当前版本。 * 优化关于我们界面 * feat: 个人中心头像调整,媒体库兼容性调整。 * feat: 自动化代码前端页面美化,多余按钮收入专家模式 * feat: 增加单独生成server功能 * feat: 限制单独生成前后端的情况下的细节配置 * feat: 修复全选失败报错的问题 --------- Co-authored-by: task <121913992@qq.com> Co-authored-by: Feng.YJ <32027253+huiyifyj@users.noreply.github.com> Co-authored-by: will0523 <dygsunshine@163.com> Co-authored-by: task <ms.yangdan@gmail.com> Co-authored-by: sslee <57312216+GIS142857@users.noreply.github.com> Co-authored-by: bypanghu <bypanghu@163.com> Co-authored-by: Azir <2075125282@qq.com> Co-authored-by: piexlMax(奇淼 <qimiaojiangjizhao@gmail.com> Co-authored-by: krank <emosick@qq.com>
This commit is contained in:
@@ -5,9 +5,11 @@ import "github.com/flipped-aurora/gin-vue-admin/server/service"
|
|||||||
type ApiGroup struct {
|
type ApiGroup struct {
|
||||||
CustomerApi
|
CustomerApi
|
||||||
FileUploadAndDownloadApi
|
FileUploadAndDownloadApi
|
||||||
|
AttachmentCategoryApi
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
customerService = service.ServiceGroupApp.ExampleServiceGroup.CustomerService
|
customerService = service.ServiceGroupApp.ExampleServiceGroup.CustomerService
|
||||||
fileUploadAndDownloadService = service.ServiceGroupApp.ExampleServiceGroup.FileUploadAndDownloadService
|
fileUploadAndDownloadService = service.ServiceGroupApp.ExampleServiceGroup.FileUploadAndDownloadService
|
||||||
|
attachmentCategoryService = service.ServiceGroupApp.ExampleServiceGroup.AttachmentCategoryService
|
||||||
)
|
)
|
||||||
|
83
server/api/v1/example/exa_attachment_category.go
Normal file
83
server/api/v1/example/exa_attachment_category.go
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
package example
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/flipped-aurora/gin-vue-admin/server/global"
|
||||||
|
common "github.com/flipped-aurora/gin-vue-admin/server/model/common/request"
|
||||||
|
"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
|
||||||
|
"github.com/flipped-aurora/gin-vue-admin/server/model/example"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"go.uber.org/zap"
|
||||||
|
)
|
||||||
|
|
||||||
|
type AttachmentCategoryApi struct{}
|
||||||
|
|
||||||
|
// GetCategoryList
|
||||||
|
// @Tags GetCategoryList
|
||||||
|
// @Summary 媒体库分类列表
|
||||||
|
// @Security AttachmentCategory
|
||||||
|
// @Produce application/json
|
||||||
|
// @Success 200 {object} response.Response{data=systemRes.SysAttachmentCategoryResponse,msg=string} "媒体库分类列表"
|
||||||
|
// @Router /attachmentCategory/getCategoryList [get]
|
||||||
|
func (a *AttachmentCategoryApi) GetCategoryList(c *gin.Context) {
|
||||||
|
res, err := attachmentCategoryService.GetCategoryList()
|
||||||
|
if err != nil {
|
||||||
|
global.GVA_LOG.Error("获取分类列表失败!", zap.Error(err))
|
||||||
|
response.FailWithMessage("获取分类列表失败", c)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
response.OkWithData(res, c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddCategory
|
||||||
|
// @Tags AddCategory
|
||||||
|
// @Summary 添加媒体库分类
|
||||||
|
// @Security AttachmentCategory
|
||||||
|
// @accept application/json
|
||||||
|
// @Produce application/json
|
||||||
|
// @Param data body example.ExaAttachmentCategory true ""
|
||||||
|
// @Success 200 {object} response.Response{msg=string} "添加媒体库分类"
|
||||||
|
// @Router /attachmentCategory/addCategory [post]
|
||||||
|
func (a *AttachmentCategoryApi) AddCategory(c *gin.Context) {
|
||||||
|
var req example.ExaAttachmentCategory
|
||||||
|
if err := c.ShouldBindJSON(&req); err != nil {
|
||||||
|
global.GVA_LOG.Error("参数错误!", zap.Error(err))
|
||||||
|
response.FailWithMessage("参数错误", c)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := attachmentCategoryService.AddCategory(&req); err != nil {
|
||||||
|
global.GVA_LOG.Error("创建/更新失败!", zap.Error(err))
|
||||||
|
response.FailWithMessage("创建/更新失败:"+err.Error(), c)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
response.OkWithMessage("创建/更新成功", c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteCategory
|
||||||
|
// @Tags DeleteCategory
|
||||||
|
// @Summary 删除分类
|
||||||
|
// @Security AttachmentCategory
|
||||||
|
// @accept application/json
|
||||||
|
// @Produce application/json
|
||||||
|
// @Param data body common.GetById true "分类id"
|
||||||
|
// @Success 200 {object} response.Response{msg=string} "删除分类"
|
||||||
|
// @Router /attachmentCategory/deleteCategory [post]
|
||||||
|
func (a *AttachmentCategoryApi) DeleteCategory(c *gin.Context) {
|
||||||
|
var req common.GetById
|
||||||
|
if err := c.ShouldBindJSON(&req); err != nil {
|
||||||
|
response.FailWithMessage("参数错误", c)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if req.ID == 0 {
|
||||||
|
response.FailWithMessage("参数错误", c)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := attachmentCategoryService.DeleteCategory(&req.ID); err != nil {
|
||||||
|
response.FailWithMessage("删除失败", c)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
response.OkWithMessage("删除成功", c)
|
||||||
|
}
|
@@ -2,12 +2,13 @@ package example
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/global"
|
"github.com/flipped-aurora/gin-vue-admin/server/global"
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/model/common/request"
|
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
|
"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/model/example"
|
"github.com/flipped-aurora/gin-vue-admin/server/model/example"
|
||||||
|
"github.com/flipped-aurora/gin-vue-admin/server/model/example/request"
|
||||||
exampleRes "github.com/flipped-aurora/gin-vue-admin/server/model/example/response"
|
exampleRes "github.com/flipped-aurora/gin-vue-admin/server/model/example/response"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
type FileUploadAndDownloadApi struct{}
|
type FileUploadAndDownloadApi struct{}
|
||||||
@@ -25,12 +26,13 @@ func (b *FileUploadAndDownloadApi) UploadFile(c *gin.Context) {
|
|||||||
var file example.ExaFileUploadAndDownload
|
var file example.ExaFileUploadAndDownload
|
||||||
noSave := c.DefaultQuery("noSave", "0")
|
noSave := c.DefaultQuery("noSave", "0")
|
||||||
_, header, err := c.Request.FormFile("file")
|
_, header, err := c.Request.FormFile("file")
|
||||||
|
classId, _ := strconv.Atoi(c.DefaultPostForm("classId", "0"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
global.GVA_LOG.Error("接收文件失败!", zap.Error(err))
|
global.GVA_LOG.Error("接收文件失败!", zap.Error(err))
|
||||||
response.FailWithMessage("接收文件失败", c)
|
response.FailWithMessage("接收文件失败", c)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
file, err = fileUploadAndDownloadService.UploadFile(header, noSave) // 文件上传后拿到文件路径
|
file, err = fileUploadAndDownloadService.UploadFile(header, noSave, classId) // 文件上传后拿到文件路径
|
||||||
if err != nil {
|
if err != nil {
|
||||||
global.GVA_LOG.Error("上传文件失败!", zap.Error(err))
|
global.GVA_LOG.Error("上传文件失败!", zap.Error(err))
|
||||||
response.FailWithMessage("上传文件失败", c)
|
response.FailWithMessage("上传文件失败", c)
|
||||||
@@ -85,11 +87,11 @@ func (b *FileUploadAndDownloadApi) DeleteFile(c *gin.Context) {
|
|||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @accept application/json
|
// @accept application/json
|
||||||
// @Produce application/json
|
// @Produce application/json
|
||||||
// @Param data body request.PageInfo true "页码, 每页大小"
|
// @Param data body request.ExaAttachmentCategorySearch true "页码, 每页大小, 分类id"
|
||||||
// @Success 200 {object} response.Response{data=response.PageResult,msg=string} "分页文件列表,返回包括列表,总数,页码,每页数量"
|
// @Success 200 {object} response.Response{data=response.PageResult,msg=string} "分页文件列表,返回包括列表,总数,页码,每页数量"
|
||||||
// @Router /fileUploadAndDownload/getFileList [post]
|
// @Router /fileUploadAndDownload/getFileList [post]
|
||||||
func (b *FileUploadAndDownloadApi) GetFileList(c *gin.Context) {
|
func (b *FileUploadAndDownloadApi) GetFileList(c *gin.Context) {
|
||||||
var pageInfo request.PageInfo
|
var pageInfo request.ExaAttachmentCategorySearch
|
||||||
err := c.ShouldBindJSON(&pageInfo)
|
err := c.ShouldBindJSON(&pageInfo)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
response.FailWithMessage(err.Error(), c)
|
response.FailWithMessage(err.Error(), c)
|
||||||
|
@@ -1,18 +1,17 @@
|
|||||||
package system
|
package system
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/model/common"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/global"
|
"github.com/flipped-aurora/gin-vue-admin/server/global"
|
||||||
|
"github.com/flipped-aurora/gin-vue-admin/server/model/common"
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/model/common/request"
|
"github.com/flipped-aurora/gin-vue-admin/server/model/common/request"
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
|
"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/model/system"
|
"github.com/flipped-aurora/gin-vue-admin/server/model/system"
|
||||||
systemReq "github.com/flipped-aurora/gin-vue-admin/server/model/system/request"
|
systemReq "github.com/flipped-aurora/gin-vue-admin/server/model/system/request"
|
||||||
systemRes "github.com/flipped-aurora/gin-vue-admin/server/model/system/response"
|
systemRes "github.com/flipped-aurora/gin-vue-admin/server/model/system/response"
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/utils"
|
"github.com/flipped-aurora/gin-vue-admin/server/utils"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/redis/go-redis/v9"
|
"github.com/redis/go-redis/v9"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
@@ -257,17 +256,17 @@ func (b *BaseApi) SetUserAuthority(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
claims := utils.GetUserInfo(c)
|
claims := utils.GetUserInfo(c)
|
||||||
j := &utils.JWT{SigningKey: []byte(global.GVA_CONFIG.JWT.SigningKey)} // 唯一签名
|
|
||||||
claims.AuthorityId = sua.AuthorityId
|
claims.AuthorityId = sua.AuthorityId
|
||||||
if token, err := j.CreateToken(*claims); err != nil {
|
token, err := utils.NewJWT().CreateToken(*claims)
|
||||||
|
if err != nil {
|
||||||
global.GVA_LOG.Error("修改失败!", zap.Error(err))
|
global.GVA_LOG.Error("修改失败!", zap.Error(err))
|
||||||
response.FailWithMessage(err.Error(), c)
|
response.FailWithMessage(err.Error(), c)
|
||||||
} else {
|
return
|
||||||
c.Header("new-token", token)
|
|
||||||
c.Header("new-expires-at", strconv.FormatInt(claims.ExpiresAt.Unix(), 10))
|
|
||||||
utils.SetToken(c, token, int((claims.ExpiresAt.Unix()-time.Now().Unix())/60))
|
|
||||||
response.OkWithMessage("修改成功", c)
|
|
||||||
}
|
}
|
||||||
|
c.Header("new-token", token)
|
||||||
|
c.Header("new-expires-at", strconv.FormatInt(claims.ExpiresAt.Unix(), 10))
|
||||||
|
utils.SetToken(c, token, int((claims.ExpiresAt.Unix()-time.Now().Unix())/60))
|
||||||
|
response.OkWithMessage("修改成功", c)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetUserAuthorities
|
// SetUserAuthorities
|
||||||
|
133
server/go.mod
133
server/go.mod
@@ -1,54 +1,52 @@
|
|||||||
module github.com/flipped-aurora/gin-vue-admin/server
|
module github.com/flipped-aurora/gin-vue-admin/server
|
||||||
|
|
||||||
go 1.22.0
|
go 1.22.2
|
||||||
|
|
||||||
toolchain go1.22.2
|
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible
|
github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible
|
||||||
github.com/aws/aws-sdk-go v1.55.5
|
github.com/aws/aws-sdk-go v1.55.6
|
||||||
github.com/casbin/casbin/v2 v2.100.0
|
github.com/casbin/casbin/v2 v2.103.0
|
||||||
github.com/casbin/gorm-adapter/v3 v3.28.0
|
github.com/casbin/gorm-adapter/v3 v3.32.0
|
||||||
github.com/fsnotify/fsnotify v1.7.0
|
github.com/fsnotify/fsnotify v1.8.0
|
||||||
github.com/fvbock/endless v0.0.0-20170109170031-447134032cb6
|
github.com/fvbock/endless v0.0.0-20170109170031-447134032cb6
|
||||||
github.com/gin-gonic/gin v1.10.0
|
github.com/gin-gonic/gin v1.10.0
|
||||||
github.com/glebarez/sqlite v1.11.0
|
github.com/glebarez/sqlite v1.11.0
|
||||||
github.com/go-sql-driver/mysql v1.8.1
|
github.com/go-sql-driver/mysql v1.8.1
|
||||||
github.com/goccy/go-json v0.10.3
|
github.com/goccy/go-json v0.10.4
|
||||||
github.com/gofrs/uuid/v5 v5.3.0
|
github.com/golang-jwt/jwt/v5 v5.2.1
|
||||||
github.com/golang-jwt/jwt/v4 v4.5.0
|
github.com/google/uuid v1.6.0
|
||||||
github.com/gookit/color v1.5.4
|
github.com/gookit/color v1.5.4
|
||||||
github.com/huaweicloud/huaweicloud-sdk-go-obs v3.24.9+incompatible
|
github.com/huaweicloud/huaweicloud-sdk-go-obs v3.24.9+incompatible
|
||||||
github.com/jordan-wright/email v4.0.1-0.20210109023952-943e75fe5223+incompatible
|
github.com/jordan-wright/email v4.0.1-0.20210109023952-943e75fe5223+incompatible
|
||||||
github.com/mholt/archiver/v4 v4.0.0-alpha.8
|
github.com/mholt/archiver/v4 v4.0.0-alpha.9
|
||||||
github.com/minio/minio-go/v7 v7.0.78
|
github.com/minio/minio-go/v7 v7.0.84
|
||||||
github.com/mojocn/base64Captcha v1.3.6
|
github.com/mojocn/base64Captcha v1.3.8
|
||||||
github.com/otiai10/copy v1.14.0
|
github.com/otiai10/copy v1.14.1
|
||||||
github.com/pkg/errors v0.9.1
|
github.com/pkg/errors v0.9.1
|
||||||
github.com/qiniu/go-sdk/v7 v7.23.0
|
github.com/qiniu/go-sdk/v7 v7.25.2
|
||||||
github.com/qiniu/qmgo v1.1.8
|
github.com/qiniu/qmgo v1.1.9
|
||||||
github.com/redis/go-redis/v9 v9.6.2
|
github.com/redis/go-redis/v9 v9.7.0
|
||||||
github.com/robfig/cron/v3 v3.0.1
|
github.com/robfig/cron/v3 v3.0.1
|
||||||
github.com/shirou/gopsutil/v3 v3.24.5
|
github.com/shirou/gopsutil/v3 v3.24.5
|
||||||
github.com/songzhibin97/gkit v1.2.13
|
github.com/songzhibin97/gkit v1.2.13
|
||||||
github.com/spf13/viper v1.19.0
|
github.com/spf13/viper v1.19.0
|
||||||
github.com/stretchr/testify v1.9.0
|
github.com/stretchr/testify v1.10.0
|
||||||
github.com/swaggo/files v1.0.1
|
github.com/swaggo/files v1.0.1
|
||||||
github.com/swaggo/gin-swagger v1.6.0
|
github.com/swaggo/gin-swagger v1.6.0
|
||||||
github.com/swaggo/swag v1.16.3
|
github.com/swaggo/swag v1.16.4
|
||||||
github.com/tencentyun/cos-go-sdk-v5 v0.7.55
|
github.com/tencentyun/cos-go-sdk-v5 v0.7.60
|
||||||
github.com/unrolled/secure v1.16.0
|
github.com/unrolled/secure v1.17.0
|
||||||
github.com/xuri/excelize/v2 v2.9.0
|
github.com/xuri/excelize/v2 v2.9.0
|
||||||
go.mongodb.org/mongo-driver v1.17.1
|
go.mongodb.org/mongo-driver v1.17.2
|
||||||
go.uber.org/automaxprocs v1.6.0
|
go.uber.org/automaxprocs v1.6.0
|
||||||
go.uber.org/zap v1.27.0
|
go.uber.org/zap v1.27.0
|
||||||
golang.org/x/crypto v0.28.0
|
golang.org/x/crypto v0.32.0
|
||||||
golang.org/x/sync v0.8.0
|
golang.org/x/sync v0.10.0
|
||||||
golang.org/x/text v0.19.0
|
golang.org/x/text v0.21.0
|
||||||
gorm.io/datatypes v1.2.3
|
gorm.io/datatypes v1.2.5
|
||||||
gorm.io/driver/mysql v1.5.7
|
gorm.io/driver/mysql v1.5.7
|
||||||
gorm.io/driver/postgres v1.5.9
|
gorm.io/driver/postgres v1.5.11
|
||||||
gorm.io/driver/sqlserver v1.5.3
|
gorm.io/driver/sqlserver v1.5.4
|
||||||
gorm.io/gen v0.3.26
|
gorm.io/gen v0.3.26
|
||||||
gorm.io/gorm v1.25.12
|
gorm.io/gorm v1.25.12
|
||||||
)
|
)
|
||||||
@@ -57,28 +55,26 @@ require (
|
|||||||
filippo.io/edwards25519 v1.1.0 // indirect
|
filippo.io/edwards25519 v1.1.0 // indirect
|
||||||
github.com/BurntSushi/toml v1.4.0 // indirect
|
github.com/BurntSushi/toml v1.4.0 // indirect
|
||||||
github.com/KyleBanks/depth v1.2.1 // indirect
|
github.com/KyleBanks/depth v1.2.1 // indirect
|
||||||
|
github.com/STARRY-S/zip v0.1.0 // indirect
|
||||||
github.com/alex-ant/gomath v0.0.0-20160516115720-89013a210a82 // indirect
|
github.com/alex-ant/gomath v0.0.0-20160516115720-89013a210a82 // indirect
|
||||||
github.com/andybalholm/brotli v1.1.1 // indirect
|
github.com/andybalholm/brotli v1.1.1 // indirect
|
||||||
github.com/bmatcuk/doublestar/v4 v4.7.1 // indirect
|
github.com/bmatcuk/doublestar/v4 v4.8.0 // indirect
|
||||||
github.com/bodgit/plumbing v1.3.0 // indirect
|
github.com/bodgit/plumbing v1.3.0 // indirect
|
||||||
github.com/bodgit/sevenzip v1.5.2 // indirect
|
github.com/bodgit/sevenzip v1.6.0 // indirect
|
||||||
github.com/bodgit/windows v1.0.1 // indirect
|
github.com/bodgit/windows v1.0.1 // indirect
|
||||||
github.com/bytedance/sonic v1.12.3 // indirect
|
github.com/bytedance/sonic v1.12.7 // indirect
|
||||||
github.com/bytedance/sonic/loader v0.2.0 // indirect
|
github.com/bytedance/sonic/loader v0.2.3 // indirect
|
||||||
github.com/casbin/govaluate v1.2.0 // indirect
|
github.com/casbin/govaluate v1.3.0 // indirect
|
||||||
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
||||||
github.com/clbanning/mxj v1.8.4 // indirect
|
github.com/clbanning/mxj v1.8.4 // indirect
|
||||||
github.com/cloudwego/base64x v0.1.4 // indirect
|
github.com/cloudwego/base64x v0.1.5 // indirect
|
||||||
github.com/cloudwego/iasm v0.2.0 // indirect
|
|
||||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
||||||
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
|
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
|
||||||
github.com/dsnet/compress v0.0.1 // indirect
|
github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707 // indirect
|
||||||
github.com/dustin/go-humanize v1.0.1 // indirect
|
github.com/dustin/go-humanize v1.0.1 // indirect
|
||||||
github.com/elastic/go-sysinfo v1.14.2 // indirect
|
github.com/gabriel-vasile/mimetype v1.4.8 // indirect
|
||||||
github.com/elastic/go-windows v1.0.2 // indirect
|
|
||||||
github.com/gabriel-vasile/mimetype v1.4.6 // indirect
|
|
||||||
github.com/gammazero/toposort v0.1.1 // indirect
|
github.com/gammazero/toposort v0.1.1 // indirect
|
||||||
github.com/gin-contrib/sse v0.1.0 // indirect
|
github.com/gin-contrib/sse v1.0.0 // indirect
|
||||||
github.com/glebarez/go-sqlite v1.22.0 // indirect
|
github.com/glebarez/go-sqlite v1.22.0 // indirect
|
||||||
github.com/go-ini/ini v1.67.0 // indirect
|
github.com/go-ini/ini v1.67.0 // indirect
|
||||||
github.com/go-ole/go-ole v1.3.0 // indirect
|
github.com/go-ole/go-ole v1.3.0 // indirect
|
||||||
@@ -88,21 +84,20 @@ require (
|
|||||||
github.com/go-openapi/swag v0.23.0 // indirect
|
github.com/go-openapi/swag v0.23.0 // indirect
|
||||||
github.com/go-playground/locales v0.14.1 // indirect
|
github.com/go-playground/locales v0.14.1 // indirect
|
||||||
github.com/go-playground/universal-translator v0.18.1 // indirect
|
github.com/go-playground/universal-translator v0.18.1 // indirect
|
||||||
github.com/go-playground/validator/v10 v10.22.1 // indirect
|
github.com/go-playground/validator/v10 v10.24.0 // indirect
|
||||||
github.com/gofrs/flock v0.12.1 // indirect
|
github.com/gofrs/flock v0.12.1 // indirect
|
||||||
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect
|
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect
|
||||||
github.com/golang-sql/sqlexp v0.1.0 // indirect
|
github.com/golang-sql/sqlexp v0.1.0 // indirect
|
||||||
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
|
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
|
||||||
github.com/golang/snappy v0.0.4 // indirect
|
github.com/golang/snappy v0.0.4 // indirect
|
||||||
github.com/google/go-querystring v1.1.0 // indirect
|
github.com/google/go-querystring v1.1.0 // indirect
|
||||||
github.com/google/uuid v1.6.0 // indirect
|
|
||||||
github.com/hashicorp/errwrap v1.1.0 // indirect
|
github.com/hashicorp/errwrap v1.1.0 // indirect
|
||||||
github.com/hashicorp/go-multierror v1.1.1 // indirect
|
github.com/hashicorp/go-multierror v1.1.1 // indirect
|
||||||
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
|
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
|
||||||
github.com/hashicorp/hcl v1.0.0 // indirect
|
github.com/hashicorp/hcl v1.0.0 // indirect
|
||||||
github.com/jackc/pgpassfile v1.0.0 // indirect
|
github.com/jackc/pgpassfile v1.0.0 // indirect
|
||||||
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
|
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
|
||||||
github.com/jackc/pgx/v5 v5.7.1 // indirect
|
github.com/jackc/pgx/v5 v5.7.2 // indirect
|
||||||
github.com/jackc/puddle/v2 v2.2.2 // indirect
|
github.com/jackc/puddle/v2 v2.2.2 // indirect
|
||||||
github.com/jinzhu/inflection v1.0.0 // indirect
|
github.com/jinzhu/inflection v1.0.0 // indirect
|
||||||
github.com/jinzhu/now v1.1.5 // indirect
|
github.com/jinzhu/now v1.1.5 // indirect
|
||||||
@@ -110,14 +105,14 @@ require (
|
|||||||
github.com/josharian/intern v1.0.0 // indirect
|
github.com/josharian/intern v1.0.0 // indirect
|
||||||
github.com/json-iterator/go v1.1.12 // indirect
|
github.com/json-iterator/go v1.1.12 // indirect
|
||||||
github.com/klauspost/compress v1.17.11 // indirect
|
github.com/klauspost/compress v1.17.11 // indirect
|
||||||
github.com/klauspost/cpuid/v2 v2.2.8 // indirect
|
github.com/klauspost/cpuid/v2 v2.2.9 // indirect
|
||||||
github.com/klauspost/pgzip v1.2.6 // indirect
|
github.com/klauspost/pgzip v1.2.6 // indirect
|
||||||
github.com/leodido/go-urn v1.4.0 // indirect
|
github.com/leodido/go-urn v1.4.0 // indirect
|
||||||
github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 // indirect
|
github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 // indirect
|
||||||
github.com/magiconair/properties v1.8.7 // indirect
|
github.com/magiconair/properties v1.8.9 // indirect
|
||||||
github.com/mailru/easyjson v0.7.7 // indirect
|
github.com/mailru/easyjson v0.9.0 // indirect
|
||||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||||
github.com/microsoft/go-mssqldb v1.7.2 // indirect
|
github.com/microsoft/go-mssqldb v1.8.0 // indirect
|
||||||
github.com/minio/md5-simd v1.1.2 // indirect
|
github.com/minio/md5-simd v1.1.2 // indirect
|
||||||
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||||
@@ -126,22 +121,23 @@ require (
|
|||||||
github.com/montanaflynn/stats v0.7.1 // indirect
|
github.com/montanaflynn/stats v0.7.1 // indirect
|
||||||
github.com/mozillazg/go-httpheader v0.4.0 // indirect
|
github.com/mozillazg/go-httpheader v0.4.0 // indirect
|
||||||
github.com/ncruces/go-strftime v0.1.9 // indirect
|
github.com/ncruces/go-strftime v0.1.9 // indirect
|
||||||
github.com/nwaples/rardecode/v2 v2.0.0-beta.3 // indirect
|
github.com/nwaples/rardecode/v2 v2.0.1 // indirect
|
||||||
|
github.com/otiai10/mint v1.6.3 // indirect
|
||||||
github.com/pelletier/go-toml/v2 v2.2.3 // indirect
|
github.com/pelletier/go-toml/v2 v2.2.3 // indirect
|
||||||
github.com/pierrec/lz4/v4 v4.1.21 // indirect
|
github.com/pierrec/lz4/v4 v4.1.22 // indirect
|
||||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
||||||
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect
|
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect
|
||||||
github.com/prometheus/procfs v0.15.1 // indirect
|
|
||||||
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
|
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
|
||||||
github.com/richardlehane/mscfb v1.0.4 // indirect
|
github.com/richardlehane/mscfb v1.0.4 // indirect
|
||||||
github.com/richardlehane/msoleps v1.0.4 // indirect
|
github.com/richardlehane/msoleps v1.0.4 // indirect
|
||||||
github.com/rs/xid v1.6.0 // indirect
|
github.com/rs/xid v1.6.0 // indirect
|
||||||
github.com/sagikazarmark/locafero v0.6.0 // indirect
|
github.com/sagikazarmark/locafero v0.7.0 // indirect
|
||||||
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
|
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
|
||||||
github.com/shoenig/go-m1cpu v0.1.6 // indirect
|
github.com/shoenig/go-m1cpu v0.1.6 // indirect
|
||||||
|
github.com/sorairolake/lzip-go v0.3.5 // indirect
|
||||||
github.com/sourcegraph/conc v0.3.0 // indirect
|
github.com/sourcegraph/conc v0.3.0 // indirect
|
||||||
github.com/spf13/afero v1.11.0 // indirect
|
github.com/spf13/afero v1.12.0 // indirect
|
||||||
github.com/spf13/cast v1.7.0 // indirect
|
github.com/spf13/cast v1.7.1 // indirect
|
||||||
github.com/spf13/pflag v1.0.5 // indirect
|
github.com/spf13/pflag v1.0.5 // indirect
|
||||||
github.com/subosito/gotenv v1.6.0 // indirect
|
github.com/subosito/gotenv v1.6.0 // indirect
|
||||||
github.com/therootcompany/xz v1.0.1 // indirect
|
github.com/therootcompany/xz v1.0.1 // indirect
|
||||||
@@ -154,29 +150,28 @@ require (
|
|||||||
github.com/xdg-go/scram v1.1.2 // indirect
|
github.com/xdg-go/scram v1.1.2 // indirect
|
||||||
github.com/xdg-go/stringprep v1.0.4 // indirect
|
github.com/xdg-go/stringprep v1.0.4 // indirect
|
||||||
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
|
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
|
||||||
github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d // indirect
|
github.com/xuri/efp v0.0.0-20241211021726-c4e992084aa6 // indirect
|
||||||
github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7 // indirect
|
github.com/xuri/nfp v0.0.0-20250111060730-82a408b9aa71 // indirect
|
||||||
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect
|
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect
|
||||||
github.com/yusufpapurcu/wmi v1.2.4 // indirect
|
github.com/yusufpapurcu/wmi v1.2.4 // indirect
|
||||||
go.uber.org/multierr v1.11.0 // indirect
|
go.uber.org/multierr v1.11.0 // indirect
|
||||||
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
|
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
|
||||||
golang.org/x/arch v0.11.0 // indirect
|
golang.org/x/arch v0.13.0 // indirect
|
||||||
golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c // indirect
|
golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 // indirect
|
||||||
golang.org/x/image v0.21.0 // indirect
|
golang.org/x/image v0.23.0 // indirect
|
||||||
golang.org/x/mod v0.21.0 // indirect
|
golang.org/x/mod v0.22.0 // indirect
|
||||||
golang.org/x/net v0.30.0 // indirect
|
golang.org/x/net v0.34.0 // indirect
|
||||||
golang.org/x/sys v0.26.0 // indirect
|
golang.org/x/sys v0.29.0 // indirect
|
||||||
golang.org/x/time v0.7.0 // indirect
|
golang.org/x/time v0.9.0 // indirect
|
||||||
golang.org/x/tools v0.26.0 // indirect
|
golang.org/x/tools v0.29.0 // indirect
|
||||||
google.golang.org/protobuf v1.35.1 // indirect
|
google.golang.org/protobuf v1.36.3 // indirect
|
||||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
gorm.io/hints v1.1.2 // indirect
|
gorm.io/hints v1.1.2 // indirect
|
||||||
gorm.io/plugin/dbresolver v1.5.3 // indirect
|
gorm.io/plugin/dbresolver v1.5.3 // indirect
|
||||||
howett.net/plist v1.0.1 // indirect
|
|
||||||
modernc.org/fileutil v1.3.0 // indirect
|
modernc.org/fileutil v1.3.0 // indirect
|
||||||
modernc.org/libc v1.61.0 // indirect
|
modernc.org/libc v1.61.9 // indirect
|
||||||
modernc.org/mathutil v1.6.0 // indirect
|
modernc.org/mathutil v1.7.1 // indirect
|
||||||
modernc.org/memory v1.8.0 // indirect
|
modernc.org/memory v1.8.2 // indirect
|
||||||
modernc.org/sqlite v1.33.1 // indirect
|
modernc.org/sqlite v1.34.5 // indirect
|
||||||
)
|
)
|
||||||
|
383
server/go.sum
383
server/go.sum
@@ -17,30 +17,27 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo
|
|||||||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
||||||
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
|
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
|
||||||
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
|
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.4.0/go.mod h1:ON4tFdPTwRcgWEaVDrN3584Ef+b7GgSJaXxe5fW9t4M=
|
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q=
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q=
|
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.1/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q=
|
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.1/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q=
|
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.1/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q=
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1 h1:lGlwhPtrX6EVml1hO0ivjkUxsSyl4dsiw9qcA1k/3IQ=
|
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1/go.mod h1:RKUqNu35KJYcVG/fqTRqmuXJZYNhYkBrnC/hX7yGbTA=
|
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1/go.mod h1:RKUqNu35KJYcVG/fqTRqmuXJZYNhYkBrnC/hX7yGbTA=
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U=
|
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 h1:E+OJmp2tPvt1W+amx48v1eqbjDYsgN+RzP4q16yV5eM=
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1 h1:sO0/P7g68FrryJzljemN+6GTssUXdANk6aJ7T1ZxnsQ=
|
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo=
|
||||||
|
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1/go.mod h1:uE9zaUfEQT/nbQjVi2IblCG9iaLtZsuYZ8ne+PuQ02M=
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1/go.mod h1:h8hyGFDsU5HMivxiS2iYFZsgDbU9OnnJ163x5UGVKYo=
|
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1/go.mod h1:h8hyGFDsU5HMivxiS2iYFZsgDbU9OnnJ163x5UGVKYo=
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.2/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w=
|
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0 h1:U2rTu3Ef+7w9FHKIAXM6ZyqF3UOWJZ12zIm8zECAFfg=
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.2.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w=
|
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg=
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM=
|
github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM=
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1 h1:6oNBlSdi1QqM1PNW7FPA6xOGA5UNsXnkaYZz9vdPGhA=
|
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1/go.mod h1:s4kgfzA0covAXNicZHDMN58jExvcng2mC/DepXiF1EI=
|
github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1/go.mod h1:s4kgfzA0covAXNicZHDMN58jExvcng2mC/DepXiF1EI=
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.0/go.mod h1:Q28U+75mpCaSCDowNEmhIo/rmgdkqmkmzI7N6TGR4UY=
|
github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0 h1:jBQA3cKT4L2rWMpgE7Yt3Hwh2aUj8KXjIGLxjHeYNNo=
|
||||||
|
github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0/go.mod h1:4OG6tQ9EOP/MT0NMjDlRzWoVFxfu9rN9B2X+tlSVktg=
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1 h1:MyVTgWR8qd/Jw1Le0NZebGBUCLbtak3bJ3z1OlqZBpw=
|
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1 h1:MyVTgWR8qd/Jw1Le0NZebGBUCLbtak3bJ3z1OlqZBpw=
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1/go.mod h1:GpPjLhVR9dnUoJMyHWSPy71xY9/lcmpzIPZXmF0FCVY=
|
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1/go.mod h1:GpPjLhVR9dnUoJMyHWSPy71xY9/lcmpzIPZXmF0FCVY=
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v0.8.0/go.mod h1:cw4zVQgBby0Z5f2v0itn6se2dDP17nTjbZFXW5uPyHA=
|
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0 h1:D3occbWoio4EBLkbkevetNMAVX197GkzbUMtqjGWn80=
|
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0 h1:D3occbWoio4EBLkbkevetNMAVX197GkzbUMtqjGWn80=
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0/go.mod h1:bTSOgj05NGRuHHhQwAdPnYr9TOdNmKlZTgGLL6nyAdI=
|
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0/go.mod h1:bTSOgj05NGRuHHhQwAdPnYr9TOdNmKlZTgGLL6nyAdI=
|
||||||
github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o=
|
github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
|
||||||
github.com/AzureAD/microsoft-authentication-library-for-go v1.1.0/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
|
|
||||||
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 h1:DzHpqpoJVaCgOUdVHxE8QB52S6NiVdDQvGlny1qvPqA=
|
|
||||||
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
|
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
|
||||||
|
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU=
|
||||||
|
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
|
||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
|
github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
|
||||||
github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0=
|
github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0=
|
||||||
@@ -49,38 +46,40 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym
|
|||||||
github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
|
github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
|
||||||
github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
|
github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
|
||||||
github.com/QcloudApi/qcloud_sign_golang v0.0.0-20141224014652-e4130a326409/go.mod h1:1pk82RBxDY/JZnPQrtqHlUFfCctgdorsd9M06fMynOM=
|
github.com/QcloudApi/qcloud_sign_golang v0.0.0-20141224014652-e4130a326409/go.mod h1:1pk82RBxDY/JZnPQrtqHlUFfCctgdorsd9M06fMynOM=
|
||||||
|
github.com/STARRY-S/zip v0.1.0 h1:eUER3jKmHKXjv+iy3BekLa+QnNSo1Lqz4eTzYBcGDqo=
|
||||||
|
github.com/STARRY-S/zip v0.1.0/go.mod h1:qj/mTZkvb3AvfGQ2e775/3AODRvB4peSw8KNMvrM8/I=
|
||||||
github.com/alex-ant/gomath v0.0.0-20160516115720-89013a210a82 h1:7dONQ3WNZ1zy960TmkxJPuwoolZwL7xKtpcM04MBnt4=
|
github.com/alex-ant/gomath v0.0.0-20160516115720-89013a210a82 h1:7dONQ3WNZ1zy960TmkxJPuwoolZwL7xKtpcM04MBnt4=
|
||||||
github.com/alex-ant/gomath v0.0.0-20160516115720-89013a210a82/go.mod h1:nLnM0KdK1CmygvjpDUO6m1TjSsiQtL61juhNsvV/JVI=
|
github.com/alex-ant/gomath v0.0.0-20160516115720-89013a210a82/go.mod h1:nLnM0KdK1CmygvjpDUO6m1TjSsiQtL61juhNsvV/JVI=
|
||||||
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 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/aliyun-oss-go-sdk v3.0.2+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
|
||||||
github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA=
|
github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA=
|
||||||
github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA=
|
github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA=
|
||||||
github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU=
|
github.com/aws/aws-sdk-go v1.55.6 h1:cSg4pvZ3m8dgYcgqB97MrcdjUmZ1BeMYKUxMMB89IPk=
|
||||||
github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
|
github.com/aws/aws-sdk-go v1.55.6/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
|
||||||
github.com/bmatcuk/doublestar/v4 v4.6.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc=
|
github.com/bmatcuk/doublestar/v4 v4.6.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc=
|
||||||
github.com/bmatcuk/doublestar/v4 v4.7.1 h1:fdDeAqgT47acgwd9bd9HxJRDmc9UAmPpc+2m0CXv75Q=
|
github.com/bmatcuk/doublestar/v4 v4.8.0 h1:DSXtrypQddoug1459viM9X9D3dp1Z7993fw36I2kNcQ=
|
||||||
github.com/bmatcuk/doublestar/v4 v4.7.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc=
|
github.com/bmatcuk/doublestar/v4 v4.8.0/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc=
|
||||||
github.com/bodgit/plumbing v1.3.0 h1:pf9Itz1JOQgn7vEOE7v7nlEfBykYqvUYioC61TwWCFU=
|
github.com/bodgit/plumbing v1.3.0 h1:pf9Itz1JOQgn7vEOE7v7nlEfBykYqvUYioC61TwWCFU=
|
||||||
github.com/bodgit/plumbing v1.3.0/go.mod h1:JOTb4XiRu5xfnmdnDJo6GmSbSbtSyufrsyZFByMtKEs=
|
github.com/bodgit/plumbing v1.3.0/go.mod h1:JOTb4XiRu5xfnmdnDJo6GmSbSbtSyufrsyZFByMtKEs=
|
||||||
github.com/bodgit/sevenzip v1.5.2 h1:acMIYRaqoHAdeu9LhEGGjL9UzBD4RNf9z7+kWDNignI=
|
github.com/bodgit/sevenzip v1.6.0 h1:a4R0Wu6/P1o1pP/3VV++aEOcyeBxeO/xE2Y9NSTrr6A=
|
||||||
github.com/bodgit/sevenzip v1.5.2/go.mod h1:gTGzXA67Yko6/HLSD0iK4kWaWzPlPmLfDO73jTjSRqc=
|
github.com/bodgit/sevenzip v1.6.0/go.mod h1:zOBh9nJUof7tcrlqJFv1koWRrhz3LbDbUNngkuZxLMc=
|
||||||
github.com/bodgit/windows v1.0.1 h1:tF7K6KOluPYygXa3Z2594zxlkbKPAOvqr97etrGNIz4=
|
github.com/bodgit/windows v1.0.1 h1:tF7K6KOluPYygXa3Z2594zxlkbKPAOvqr97etrGNIz4=
|
||||||
github.com/bodgit/windows v1.0.1/go.mod h1:a6JLwrB4KrTR5hBpp8FI9/9W9jJfeQ2h4XDXU74ZCdM=
|
github.com/bodgit/windows v1.0.1/go.mod h1:a6JLwrB4KrTR5hBpp8FI9/9W9jJfeQ2h4XDXU74ZCdM=
|
||||||
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
|
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
|
||||||
github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
|
github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
|
||||||
github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
|
github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
|
||||||
github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
|
github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
|
||||||
github.com/bytedance/sonic v1.12.3 h1:W2MGa7RCU1QTeYRTPE3+88mVC0yXmsRQRChiyVocVjU=
|
github.com/bytedance/sonic v1.12.7 h1:CQU8pxOy9HToxhndH0Kx/S1qU/CuS9GnKYrGioDcU1Q=
|
||||||
github.com/bytedance/sonic v1.12.3/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk=
|
github.com/bytedance/sonic v1.12.7/go.mod h1:tnbal4mxOMju17EGfknm2XyYcpyCnIROYOEYuemj13I=
|
||||||
github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
|
github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
|
||||||
github.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM=
|
github.com/bytedance/sonic/loader v0.2.3 h1:yctD0Q3v2NOGfSWPLPvG2ggA2kV6TS6s4wioyEqssH0=
|
||||||
github.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
|
github.com/bytedance/sonic/loader v0.2.3/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=
|
||||||
github.com/casbin/casbin/v2 v2.100.0 h1:aeugSNjjHfCrgA22nHkVvw2xsscboHv5r0a13ljQKGQ=
|
github.com/casbin/casbin/v2 v2.103.0 h1:dHElatNXNrr8XcseUov0ZSiWjauwmZZE6YMV3eU1yic=
|
||||||
github.com/casbin/casbin/v2 v2.100.0/go.mod h1:LO7YPez4dX3LgoTCqSQAleQDo0S0BeZBDxYnPUl95Ng=
|
github.com/casbin/casbin/v2 v2.103.0/go.mod h1:Ee33aqGrmES+GNL17L0h9X28wXuo829wnNUnS0edAco=
|
||||||
github.com/casbin/gorm-adapter/v3 v3.28.0 h1:ORF8prF6SfaipdgT1fud+r1Tp5J0uul8QaKJHqCPY/o=
|
github.com/casbin/gorm-adapter/v3 v3.32.0 h1:Au+IOILBIE9clox5BJhI2nA3p9t7Ep1ePlupdGbGfus=
|
||||||
github.com/casbin/gorm-adapter/v3 v3.28.0/go.mod h1:aftWi0cla0CC1bHQVrSFzBcX/98IFK28AvuPppCQgTs=
|
github.com/casbin/gorm-adapter/v3 v3.32.0/go.mod h1:Zre/H8p17mpv5U3EaWgPoxLILLdXO3gHW5aoQQpUDZI=
|
||||||
github.com/casbin/govaluate v1.2.0 h1:wXCXFmqyY+1RwiKfYo3jMKyrtZmOL3kHwaqDyCPOYak=
|
github.com/casbin/govaluate v1.3.0 h1:VA0eSY0M2lA86dYd5kPPuNZMUD9QkWnOCnavGrw9myc=
|
||||||
github.com/casbin/govaluate v1.2.0/go.mod h1:G/UnbIjZk/0uMNaLwZZmFQrR72tYRZWQkO70si/iR7A=
|
github.com/casbin/govaluate v1.3.0/go.mod h1:G/UnbIjZk/0uMNaLwZZmFQrR72tYRZWQkO70si/iR7A=
|
||||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||||
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
||||||
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
@@ -90,9 +89,8 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn
|
|||||||
github.com/clbanning/mxj v1.8.4 h1:HuhwZtbyvyOw+3Z1AowPkU87JkJUSv751ELWaiTpj8I=
|
github.com/clbanning/mxj v1.8.4 h1:HuhwZtbyvyOw+3Z1AowPkU87JkJUSv751ELWaiTpj8I=
|
||||||
github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng=
|
github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng=
|
||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||||
github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y=
|
github.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=
|
||||||
github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
|
github.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
|
||||||
github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=
|
|
||||||
github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
|
github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
|
||||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||||
github.com/dave/jennifer v1.6.1/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3RmGZc=
|
github.com/dave/jennifer v1.6.1/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3RmGZc=
|
||||||
@@ -104,33 +102,27 @@ github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/r
|
|||||||
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
|
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
|
||||||
github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko=
|
github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko=
|
||||||
github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ=
|
github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ=
|
||||||
github.com/dsnet/compress v0.0.1 h1:PlZu0n3Tuv04TzpfPbrnI0HW/YwodEXDS+oPKahKF0Q=
|
github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707 h1:2tV76y6Q9BB+NEBasnqvs7e49aEBFI8ejC89PSnWH+4=
|
||||||
github.com/dsnet/compress v0.0.1/go.mod h1:Aw8dCMJ7RioblQeTqt88akK31OvO8Dhf5JflhBbQEHo=
|
github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707/go.mod h1:qssHWj60/X5sZFNxpG4HBPDHVqxNm4DfnCKgrbZOT+s=
|
||||||
github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY=
|
github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY=
|
||||||
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
|
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
|
||||||
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
|
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
|
||||||
github.com/elastic/go-sysinfo v1.0.2/go.mod h1:O/D5m1VpYLwGjCYzEt63g3Z1uO3jXfwyzzjiW90t8cY=
|
|
||||||
github.com/elastic/go-sysinfo v1.14.2 h1:DeIy+pVfdRsd08Nx2Xjh+dUS+jrEEI7LGc29U/BKVWo=
|
|
||||||
github.com/elastic/go-sysinfo v1.14.2/go.mod h1:jPSuTgXG+dhhh0GKIyI2Cso+w5lPJ5PvVqKlL8LV/Hk=
|
|
||||||
github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU=
|
|
||||||
github.com/elastic/go-windows v1.0.2 h1:yoLLsAsV5cfg9FLhZ9EXZ2n2sQFKeDYrHenkcivY4vI=
|
|
||||||
github.com/elastic/go-windows v1.0.2/go.mod h1:bGcDpBzXgYSqM0Gx3DM4+UxFj300SZLixie9u9ixLM8=
|
|
||||||
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.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||||
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
|
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
|
||||||
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
|
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
|
||||||
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
|
github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M=
|
||||||
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
|
github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
|
||||||
github.com/fvbock/endless v0.0.0-20170109170031-447134032cb6 h1:6VSn3hB5U5GeA6kQw4TwWIWbOhtvR2hmbBJnTOtqTWc=
|
github.com/fvbock/endless v0.0.0-20170109170031-447134032cb6 h1:6VSn3hB5U5GeA6kQw4TwWIWbOhtvR2hmbBJnTOtqTWc=
|
||||||
github.com/fvbock/endless v0.0.0-20170109170031-447134032cb6/go.mod h1:YxOVT5+yHzKvwhsiSIWmbAYM3Dr9AEEbER2dVayfBkg=
|
github.com/fvbock/endless v0.0.0-20170109170031-447134032cb6/go.mod h1:YxOVT5+yHzKvwhsiSIWmbAYM3Dr9AEEbER2dVayfBkg=
|
||||||
github.com/gabriel-vasile/mimetype v1.4.6 h1:3+PzJTKLkvgjeTbts6msPJt4DixhT4YtFNf1gtGe3zc=
|
github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM=
|
||||||
github.com/gabriel-vasile/mimetype v1.4.6/go.mod h1:JX1qVKqZd40hUPpAfiNTe0Sne7hdfKSbOqqmkq8GCXc=
|
github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8=
|
||||||
github.com/gammazero/toposort v0.1.1 h1:OivGxsWxF3U3+U80VoLJ+f50HcPU1MIqE1JlKzoJ2Eg=
|
github.com/gammazero/toposort v0.1.1 h1:OivGxsWxF3U3+U80VoLJ+f50HcPU1MIqE1JlKzoJ2Eg=
|
||||||
github.com/gammazero/toposort v0.1.1/go.mod h1:H2cozTnNpMw0hg2VHAYsAxmkHXBYroNangj2NTBQDvw=
|
github.com/gammazero/toposort v0.1.1/go.mod h1:H2cozTnNpMw0hg2VHAYsAxmkHXBYroNangj2NTBQDvw=
|
||||||
github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4=
|
github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4=
|
||||||
github.com/gin-contrib/gzip v0.0.6/go.mod h1:QOJlmV2xmayAjkNS2Y8NQsMneuRShOU/kjovCXNuzzk=
|
github.com/gin-contrib/gzip v0.0.6/go.mod h1:QOJlmV2xmayAjkNS2Y8NQsMneuRShOU/kjovCXNuzzk=
|
||||||
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
|
github.com/gin-contrib/sse v1.0.0 h1:y3bT1mUWUxDpW4JLQg/HnTqV4rozuW4tC9eFKTxYI9E=
|
||||||
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
|
github.com/gin-contrib/sse v1.0.0/go.mod h1:zNuFdwarAygJBht0NTKiSi3jRf6RbqeILZ9Sp6Slhe0=
|
||||||
github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU=
|
github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU=
|
||||||
github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y=
|
github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y=
|
||||||
github.com/glebarez/go-sqlite v1.22.0 h1:uAcMJhaA6r3LHMTFgP0SifzgXg46yJkgxqyuyec+ruQ=
|
github.com/glebarez/go-sqlite v1.22.0 h1:uAcMJhaA6r3LHMTFgP0SifzgXg46yJkgxqyuyec+ruQ=
|
||||||
@@ -165,22 +157,20 @@ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJn
|
|||||||
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
|
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
|
||||||
github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
|
github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
|
||||||
github.com/go-playground/validator/v10 v10.7.0/go.mod h1:xm76BBt941f7yWdGnI2DVPFFg1UK3YY04qifoXU3lOk=
|
github.com/go-playground/validator/v10 v10.7.0/go.mod h1:xm76BBt941f7yWdGnI2DVPFFg1UK3YY04qifoXU3lOk=
|
||||||
github.com/go-playground/validator/v10 v10.22.1 h1:40JcKH+bBNGFczGuoBYgX4I6m/i27HYW8P9FDk5PbgA=
|
github.com/go-playground/validator/v10 v10.24.0 h1:KHQckvo8G6hlWnrPX4NJJ+aBfWNAE/HH+qdL2cBpCmg=
|
||||||
github.com/go-playground/validator/v10 v10.22.1/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
|
github.com/go-playground/validator/v10 v10.24.0/go.mod h1:GGzBIJMuE98Ic/kJsBXbz1x/7cByt++cQ+YOuDM5wus=
|
||||||
github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
|
github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
|
||||||
github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
|
github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
|
||||||
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
|
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
|
||||||
github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA=
|
github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM=
|
||||||
github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
|
github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
|
||||||
github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
|
github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
|
||||||
github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E=
|
github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E=
|
||||||
github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0=
|
github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0=
|
||||||
github.com/gofrs/uuid/v5 v5.3.0 h1:m0mUMr+oVYUdxpMLgSYCZiXe7PuVPnI94+OMeVBNedk=
|
github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo=
|
||||||
github.com/gofrs/uuid/v5 v5.3.0/go.mod h1:CDOjlDMVAtN56jqyRUZh58JT31Tiw7/oQyEXZV+9bD8=
|
github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
|
||||||
github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
|
|
||||||
github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
|
|
||||||
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
|
|
||||||
github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
|
github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
|
||||||
|
github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
|
||||||
github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk=
|
github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk=
|
||||||
github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
|
github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
|
||||||
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA=
|
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA=
|
||||||
@@ -203,7 +193,6 @@ github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y
|
|||||||
github.com/golang/protobuf v1.3.1/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.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.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
||||||
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
|
||||||
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
|
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
|
||||||
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||||
@@ -213,6 +202,7 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw
|
|||||||
github.com/google/go-cmp v0.3.1/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.0/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.2/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 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||||
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
|
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
|
||||||
@@ -228,6 +218,7 @@ github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd/go.mod h1:kf6iHlnVGwg
|
|||||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
||||||
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.6.0/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.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
||||||
@@ -259,8 +250,8 @@ github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsI
|
|||||||
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
|
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
|
||||||
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo=
|
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo=
|
||||||
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
|
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
|
||||||
github.com/jackc/pgx/v5 v5.7.1 h1:x7SYsPBYDkHDksogeSmZZ5xzThcTgRz++I5E+ePFUcs=
|
github.com/jackc/pgx/v5 v5.7.2 h1:mLoDLV6sonKlvjIEsV56SkWNCnuNv531l94GaIzO+XI=
|
||||||
github.com/jackc/pgx/v5 v5.7.1/go.mod h1:e7O26IywZZ+naJtWWos6i6fvWK+29etgITqrqHLfoZA=
|
github.com/jackc/pgx/v5 v5.7.2/go.mod h1:ncY89UGWxg82EykZUwSpUKEfccBGGYq1xjrOpsbsfGQ=
|
||||||
github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo=
|
github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo=
|
||||||
github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
|
github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
|
||||||
github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs=
|
github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs=
|
||||||
@@ -278,7 +269,6 @@ github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9Y
|
|||||||
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
|
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
|
||||||
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
|
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
|
||||||
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
|
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
|
||||||
github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak=
|
|
||||||
github.com/jordan-wright/email v4.0.1-0.20210109023952-943e75fe5223+incompatible h1:jdpOPRN1zP63Td1hDQbZW73xKmzDvZHzVdNYxhnTMDA=
|
github.com/jordan-wright/email v4.0.1-0.20210109023952-943e75fe5223+incompatible h1:jdpOPRN1zP63Td1hDQbZW73xKmzDvZHzVdNYxhnTMDA=
|
||||||
github.com/jordan-wright/email v4.0.1-0.20210109023952-943e75fe5223+incompatible/go.mod h1:1c7szIrayyPPB/987hsnvNzLushdWf4o/79s3P08L8A=
|
github.com/jordan-wright/email v4.0.1-0.20210109023952-943e75fe5223+incompatible/go.mod h1:1c7szIrayyPPB/987hsnvNzLushdWf4o/79s3P08L8A=
|
||||||
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
|
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
|
||||||
@@ -295,8 +285,8 @@ github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90
|
|||||||
github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
|
github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
|
||||||
github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
||||||
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
||||||
github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM=
|
github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=
|
||||||
github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
|
github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=
|
||||||
github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU=
|
github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU=
|
||||||
github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
|
github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
|
||||||
github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
|
github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
|
||||||
@@ -319,25 +309,24 @@ github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8=
|
|||||||
github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||||
github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 h1:7UMa6KCCMjZEMDtTVdcGu0B1GmmC7QJKiCCjyTAWQy0=
|
github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 h1:7UMa6KCCMjZEMDtTVdcGu0B1GmmC7QJKiCCjyTAWQy0=
|
||||||
github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k=
|
github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k=
|
||||||
github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
|
github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM=
|
||||||
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
|
github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
|
||||||
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
|
github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4=
|
||||||
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU=
|
||||||
github.com/matishsiao/goInfo v0.0.0-20210923090445-da2e3fa8d45f/go.mod h1:aEt7p9Rvh67BYApmZwNDPpgircTO2kgdmDUoF/1QmwA=
|
|
||||||
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
||||||
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||||
github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
|
github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
|
||||||
github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y=
|
github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y=
|
||||||
github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
|
github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
|
||||||
github.com/mholt/archiver/v4 v4.0.0-alpha.8 h1:tRGQuDVPh66WCOelqe6LIGh0gwmfwxUrSSDunscGsRM=
|
github.com/mholt/archiver/v4 v4.0.0-alpha.9 h1:EZgAsW6DsuawxDgTtIdjCUBa2TQ6AOe9pnCidofSRtE=
|
||||||
github.com/mholt/archiver/v4 v4.0.0-alpha.8/go.mod h1:5f7FUYGXdJWUjESffJaYR4R60VhnHxb2X3T1teMyv5A=
|
github.com/mholt/archiver/v4 v4.0.0-alpha.9/go.mod h1:5D3uct315OMkMRXKwEuMB+wQi/2m5NQngKDmApqwVlo=
|
||||||
github.com/microsoft/go-mssqldb v1.6.0/go.mod h1:00mDtPbeQCRGC1HwOOR5K/gr30P1NcEG0vx6Kbv2aJU=
|
|
||||||
github.com/microsoft/go-mssqldb v1.7.2 h1:CHkFJiObW7ItKTJfHo1QX7QBBD1iV+mn1eOyRP3b/PA=
|
|
||||||
github.com/microsoft/go-mssqldb v1.7.2/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpthMITIb2Ko1IoA=
|
github.com/microsoft/go-mssqldb v1.7.2/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpthMITIb2Ko1IoA=
|
||||||
|
github.com/microsoft/go-mssqldb v1.8.0 h1:7cyZ/AT7ycDsEoWPIXibd+aVKFtteUNhDGf3aobP+tw=
|
||||||
|
github.com/microsoft/go-mssqldb v1.8.0/go.mod h1:6znkekS3T2vp0waiMhen4GPU1BiAsrP+iXHcE7a7rFo=
|
||||||
github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=
|
github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=
|
||||||
github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM=
|
github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM=
|
||||||
github.com/minio/minio-go/v7 v7.0.78 h1:LqW2zy52fxnI4gg8C2oZviTaKHcBV36scS+RzJnxUFs=
|
github.com/minio/minio-go/v7 v7.0.84 h1:D1HVmAF8JF8Bpi6IU4V9vIEj+8pc+xU88EWMs2yed0E=
|
||||||
github.com/minio/minio-go/v7 v7.0.78/go.mod h1:84gmIilaX4zcvAWWzJ5Z1WI5axN+hAbM5w25xf8xvC0=
|
github.com/minio/minio-go/v7 v7.0.84/go.mod h1:57YXpvc5l3rjPdhqNrDsvVlY0qPI6UTk1bflAe+9doY=
|
||||||
github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||||
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
|
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/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||||
@@ -349,9 +338,8 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY
|
|||||||
github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8=
|
github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8=
|
||||||
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=
|
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=
|
||||||
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
|
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
|
||||||
github.com/mojocn/base64Captcha v1.3.6 h1:gZEKu1nsKpttuIAQgWHO+4Mhhls8cAKyiV2Ew03H+Tw=
|
github.com/mojocn/base64Captcha v1.3.8 h1:rrN9BhCwXKS8ht1e21kvR3iTaMgf4qPC9sRoV52bqEg=
|
||||||
github.com/mojocn/base64Captcha v1.3.6/go.mod h1:i5CtHvm+oMbj1UzEPXaA8IH/xHFZ3DGY3Wh3dBpZ28E=
|
github.com/mojocn/base64Captcha v1.3.8/go.mod h1:QFZy927L8HVP3+VV5z2b1EAEiv1KxVJKZbAucVgLUy4=
|
||||||
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
|
|
||||||
github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow=
|
github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow=
|
||||||
github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE=
|
github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE=
|
||||||
github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow=
|
github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow=
|
||||||
@@ -360,21 +348,20 @@ github.com/mozillazg/go-httpheader v0.4.0 h1:aBn6aRXtFzyDLZ4VIRLsZbbJloagQfMnCiY
|
|||||||
github.com/mozillazg/go-httpheader v0.4.0/go.mod h1:PuT8h0pw6efvp8ZeUec1Rs7dwjK08bt6gKSReGMqtdA=
|
github.com/mozillazg/go-httpheader v0.4.0/go.mod h1:PuT8h0pw6efvp8ZeUec1Rs7dwjK08bt6gKSReGMqtdA=
|
||||||
github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4=
|
github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4=
|
||||||
github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
|
github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
|
||||||
github.com/nwaples/rardecode/v2 v2.0.0-beta.3 h1:evQTW0IjM2GAL5AaPHiQrT+laWohkt5zHKA3yCsGQGU=
|
github.com/nwaples/rardecode/v2 v2.0.1 h1:3MN6/R+Y4c7e+21U3yhWuUcf72sYmcmr6jtiuAVSH1A=
|
||||||
github.com/nwaples/rardecode/v2 v2.0.0-beta.3/go.mod h1:yntwv/HfMc/Hbvtq9I19D1n58te3h6KsqCf3GxyfBGY=
|
github.com/nwaples/rardecode/v2 v2.0.1/go.mod h1:yntwv/HfMc/Hbvtq9I19D1n58te3h6KsqCf3GxyfBGY=
|
||||||
github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU=
|
github.com/otiai10/copy v1.14.1 h1:5/7E6qsUMBaH5AnQ0sSLzzTg1oTECmcCmT6lvF45Na8=
|
||||||
github.com/otiai10/copy v1.14.0/go.mod h1:ECfuL02W+/FkTWZWgQqXPWZgW9oeKCSQ5qVfSc4qc4w=
|
github.com/otiai10/copy v1.14.1/go.mod h1:oQwrEDDOci3IM8dJF0d8+jnbfPDllW6vUjNc3DoZm9I=
|
||||||
github.com/otiai10/mint v1.5.1 h1:XaPLeE+9vGbuyEHem1JNk3bYc7KKqyI/na0/mLd/Kks=
|
github.com/otiai10/mint v1.6.3 h1:87qsV/aw1F5as1eH1zS/yqHY85ANKVMgkDrf9rcxbQs=
|
||||||
github.com/otiai10/mint v1.5.1/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM=
|
github.com/otiai10/mint v1.6.3/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM=
|
||||||
github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M=
|
github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M=
|
||||||
github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc=
|
github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc=
|
||||||
github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ=
|
github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU=
|
||||||
github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
|
github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
|
||||||
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI=
|
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI=
|
||||||
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
|
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
|
||||||
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
|
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
|
||||||
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
|
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
|
||||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
|
||||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
@@ -385,17 +372,14 @@ github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:Om
|
|||||||
github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
|
github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
|
||||||
github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
|
github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
|
||||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
|
||||||
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
|
|
||||||
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
|
|
||||||
github.com/qiniu/dyn v1.3.0/go.mod h1:E8oERcm8TtwJiZvkQPbcAh0RL8jO1G0VXJMW3FAWdkk=
|
github.com/qiniu/dyn v1.3.0/go.mod h1:E8oERcm8TtwJiZvkQPbcAh0RL8jO1G0VXJMW3FAWdkk=
|
||||||
github.com/qiniu/go-sdk/v7 v7.23.0 h1:4wYB4EGE6MBhvjtE/FZH/mIUt/VH6WjzBucU3VfPwhg=
|
github.com/qiniu/go-sdk/v7 v7.25.2 h1:URwgZpxySdiwu2yQpHk93X4LXWHyFRp1x3Vmlk/YWvo=
|
||||||
github.com/qiniu/go-sdk/v7 v7.23.0/go.mod h1:OXsAVU5YrLLtVi4iPFpP80jzb3SRBAczrGkcqQmWhcY=
|
github.com/qiniu/go-sdk/v7 v7.25.2/go.mod h1:dmKtJ2ahhPWFVi9o1D5GemmWoh/ctuB9peqTowyTO8o=
|
||||||
github.com/qiniu/qmgo v1.1.8 h1:E64M+P59aqQpXKI24ClVtluYkLaJLkkeD2hTVhrdMks=
|
github.com/qiniu/qmgo v1.1.9 h1:3G3h9RLyjIUW9YSAQEPP2WqqNnboZ2Z/zO3mugjVb3E=
|
||||||
github.com/qiniu/qmgo v1.1.8/go.mod h1:QvZkzWNEv0buWPx0kdZsSs6URhESVubacxFPlITmvB8=
|
github.com/qiniu/qmgo v1.1.9/go.mod h1:aba4tNSlMWrwUhe7RdILfwBRIgvBujt1y10X+T1YZSI=
|
||||||
github.com/qiniu/x v1.10.5/go.mod h1:03Ni9tj+N2h2aKnAz+6N0Xfl8FwMEDRC2PAlxekASDs=
|
github.com/qiniu/x v1.10.5/go.mod h1:03Ni9tj+N2h2aKnAz+6N0Xfl8FwMEDRC2PAlxekASDs=
|
||||||
github.com/redis/go-redis/v9 v9.6.2 h1:w0uvkRbc9KpgD98zcvo5IrVUsn0lXpRMuhNgiHDJzdk=
|
github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E=
|
||||||
github.com/redis/go-redis/v9 v9.6.2/go.mod h1:0C0c6ycQsdpVNQpxb1njEQIqkx5UcsM8FJCQLgE9+RA=
|
github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw=
|
||||||
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
|
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
|
||||||
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
|
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
|
||||||
github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM=
|
github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM=
|
||||||
@@ -413,8 +397,8 @@ github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99
|
|||||||
github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU=
|
github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU=
|
||||||
github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0=
|
github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0=
|
||||||
github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk=
|
github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk=
|
||||||
github.com/sagikazarmark/locafero v0.6.0 h1:ON7AQg37yzcRPU69mt7gwhFEBwxI6P9T4Qu3N51bwOk=
|
github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo=
|
||||||
github.com/sagikazarmark/locafero v0.6.0/go.mod h1:77OmuIc6VTraTXKXIs/uvUxKGUXjE1GbemJYHqdNjX0=
|
github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k=
|
||||||
github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
|
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/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
|
||||||
github.com/shirou/gopsutil/v3 v3.24.5 h1:i0t8kL+kQTvpAYToeuiVk3TgDeKOFioZO3Ztz/iZ9pI=
|
github.com/shirou/gopsutil/v3 v3.24.5 h1:i0t8kL+kQTvpAYToeuiVk3TgDeKOFioZO3Ztz/iZ9pI=
|
||||||
@@ -425,12 +409,14 @@ github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU=
|
|||||||
github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k=
|
github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k=
|
||||||
github.com/songzhibin97/gkit v1.2.13 h1:paY0XJkdRuy9/8k9nTnbdrzo8pC22jIIFldUkOQv5nU=
|
github.com/songzhibin97/gkit v1.2.13 h1:paY0XJkdRuy9/8k9nTnbdrzo8pC22jIIFldUkOQv5nU=
|
||||||
github.com/songzhibin97/gkit v1.2.13/go.mod h1:38CreNR27eTGaG1UMGihrXqI4xc3nGfYxLVKKVx6Ngg=
|
github.com/songzhibin97/gkit v1.2.13/go.mod h1:38CreNR27eTGaG1UMGihrXqI4xc3nGfYxLVKKVx6Ngg=
|
||||||
|
github.com/sorairolake/lzip-go v0.3.5 h1:ms5Xri9o1JBIWvOFAorYtUNik6HI3HgBTkISiqu0Cwg=
|
||||||
|
github.com/sorairolake/lzip-go v0.3.5/go.mod h1:N0KYq5iWrMXI0ZEXKXaS9hCyOjZUQdBDEIbXfoUwbdk=
|
||||||
github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
|
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/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
|
||||||
github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8=
|
github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs=
|
||||||
github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY=
|
github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4=
|
||||||
github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w=
|
github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y=
|
||||||
github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
|
github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
|
||||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
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/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||||
github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI=
|
github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI=
|
||||||
@@ -447,25 +433,23 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
|
|||||||
github.com/stretchr/testify v1.7.1/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.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.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/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||||
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
|
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
||||||
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||||
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
|
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
|
||||||
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
|
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 h1:J1bVJ4XHZNq0I46UU90611i9/YzdrF7x92oX1ig5IdE=
|
||||||
github.com/swaggo/files v1.0.1/go.mod h1:0qXmMNH6sXNf+73t65aKeB+ApmgxdnkQzVTAj2uaMUg=
|
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 h1:y8sxvQ3E20/RCyrXeFfg60r6H0Z+SwpTjMYsMm+zy8M=
|
||||||
github.com/swaggo/gin-swagger v1.6.0/go.mod h1:BG00cCEy294xtVpyIAHG6+e2Qzj/xKlRdOqDkvq0uzo=
|
github.com/swaggo/gin-swagger v1.6.0/go.mod h1:BG00cCEy294xtVpyIAHG6+e2Qzj/xKlRdOqDkvq0uzo=
|
||||||
github.com/swaggo/swag v1.16.3 h1:PnCYjPCah8FK4I26l2F/KQ4yz3sILcVUN3cTlBFA9Pg=
|
github.com/swaggo/swag v1.16.4 h1:clWJtd9LStiG3VeijiCfOVODP6VpHtKdQy9ELFG3s1A=
|
||||||
github.com/swaggo/swag v1.16.3/go.mod h1:DImHIuOFXKpMFAQjcC7FG4m3Dg4+QuUgUzJmKjI/gRk=
|
github.com/swaggo/swag v1.16.4/go.mod h1:VBsHJRsDvfYvqoiMKnsdwhNV9LEMHgEDZcyVYX0sxPg=
|
||||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.563/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
|
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.563/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
|
||||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/kms v1.0.563/go.mod h1:uom4Nvi9W+Qkom0exYiJ9VWJjXwyxtPYTkKkaLMlfE0=
|
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/kms v1.0.563/go.mod h1:uom4Nvi9W+Qkom0exYiJ9VWJjXwyxtPYTkKkaLMlfE0=
|
||||||
github.com/tencentyun/cos-go-sdk-v5 v0.7.55 h1:9DfH3umWUd0I2jdqcUxrU1kLfUPOydULNy4T9qN5PF8=
|
github.com/tencentyun/cos-go-sdk-v5 v0.7.60 h1:/e/tmvRmfKexr/QQIBzWhOkZWsmY3EK72NrI6G/Tv0o=
|
||||||
github.com/tencentyun/cos-go-sdk-v5 v0.7.55/go.mod h1:8+hG+mQMuRP/OIS9d83syAvXvrMj9HhkND6Q1fLghw0=
|
github.com/tencentyun/cos-go-sdk-v5 v0.7.60/go.mod h1:8+hG+mQMuRP/OIS9d83syAvXvrMj9HhkND6Q1fLghw0=
|
||||||
github.com/therootcompany/xz v1.0.1 h1:CmOtsn1CbtmyYiusbfmhmkpAAETj0wBIH6kCYaX+xzw=
|
github.com/therootcompany/xz v1.0.1 h1:CmOtsn1CbtmyYiusbfmhmkpAAETj0wBIH6kCYaX+xzw=
|
||||||
github.com/therootcompany/xz v1.0.1/go.mod h1:3K3UH1yCKgBneZYhuQUvJ9HPD19UEXEI0BWbMn8qNMY=
|
github.com/therootcompany/xz v1.0.1/go.mod h1:3K3UH1yCKgBneZYhuQUvJ9HPD19UEXEI0BWbMn8qNMY=
|
||||||
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
|
|
||||||
github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU=
|
github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU=
|
||||||
github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY=
|
github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY=
|
||||||
github.com/tklauser/numcpus v0.9.0 h1:lmyCHtANi8aRUgkckBgoDk1nHCux3n2cgkJLXdQGPDo=
|
github.com/tklauser/numcpus v0.9.0 h1:lmyCHtANi8aRUgkckBgoDk1nHCux3n2cgkJLXdQGPDo=
|
||||||
@@ -474,38 +458,35 @@ github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS
|
|||||||
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
|
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
|
||||||
github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
|
github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
|
||||||
github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
|
github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
|
||||||
github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8=
|
github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
|
||||||
github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc=
|
github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc=
|
||||||
github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
|
github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
|
||||||
github.com/unrolled/secure v1.16.0 h1:XgdAsS/Zl50ZfZPRJK6WpicFttfrsFYFd0+ONDBJubU=
|
github.com/unrolled/secure v1.17.0 h1:Io7ifFgo99Bnh0J7+Q+qcMzWM6kaDPCA5FroFZEdbWU=
|
||||||
github.com/unrolled/secure v1.16.0/go.mod h1:BmF5hyM6tXczk3MpQkFf1hpKSRqCyhqcbiQtiAF7+40=
|
github.com/unrolled/secure v1.17.0/go.mod h1:BmF5hyM6tXczk3MpQkFf1hpKSRqCyhqcbiQtiAF7+40=
|
||||||
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
|
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
|
||||||
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
|
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
|
||||||
github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g=
|
|
||||||
github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY=
|
github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY=
|
||||||
github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
|
github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
|
||||||
github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
|
|
||||||
github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8=
|
github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8=
|
||||||
github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
|
github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
|
||||||
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
|
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
|
||||||
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
|
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
|
||||||
github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d h1:llb0neMWDQe87IzJLS4Ci7psK/lVsjIS2otl+1WyRyY=
|
github.com/xuri/efp v0.0.0-20241211021726-c4e992084aa6 h1:8m6DWBG+dlFNbx5ynvrE7NgI+Y7OlZVMVTpayoW+rCc=
|
||||||
github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI=
|
github.com/xuri/efp v0.0.0-20241211021726-c4e992084aa6/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI=
|
||||||
github.com/xuri/excelize/v2 v2.9.0 h1:1tgOaEq92IOEumR1/JfYS/eR0KHOCsRv/rYXXh6YJQE=
|
github.com/xuri/excelize/v2 v2.9.0 h1:1tgOaEq92IOEumR1/JfYS/eR0KHOCsRv/rYXXh6YJQE=
|
||||||
github.com/xuri/excelize/v2 v2.9.0/go.mod h1:uqey4QBZ9gdMeWApPLdhm9x+9o2lq4iVmjiLfBS5hdE=
|
github.com/xuri/excelize/v2 v2.9.0/go.mod h1:uqey4QBZ9gdMeWApPLdhm9x+9o2lq4iVmjiLfBS5hdE=
|
||||||
github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7 h1:hPVCafDV85blFTabnqKgNhDCkJX25eik94Si9cTER4A=
|
github.com/xuri/nfp v0.0.0-20250111060730-82a408b9aa71 h1:hOh7aVDrvGJRxzXrQbDY8E+02oaI//5cHL+97oYpEPw=
|
||||||
github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ=
|
github.com/xuri/nfp v0.0.0-20250111060730-82a408b9aa71/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ=
|
||||||
github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU=
|
github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU=
|
||||||
github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E=
|
github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E=
|
||||||
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
|
|
||||||
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM=
|
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM=
|
||||||
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI=
|
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI=
|
||||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||||
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
|
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
|
||||||
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
|
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
|
||||||
go.mongodb.org/mongo-driver v1.11.6/go.mod h1:G9TgswdsWjX4tmDA5zfs2+6AEPpYJwqblyjsfuh8oXY=
|
|
||||||
go.mongodb.org/mongo-driver v1.17.1 h1:Wic5cJIwJgSpBhe3lx3+/RybR5PiYRMpVFgO7cOHyIM=
|
|
||||||
go.mongodb.org/mongo-driver v1.17.1/go.mod h1:wwWm/+BuOddhcq3n68LKRmgk2wXzmF6s0SFOa0GINL4=
|
go.mongodb.org/mongo-driver v1.17.1/go.mod h1:wwWm/+BuOddhcq3n68LKRmgk2wXzmF6s0SFOa0GINL4=
|
||||||
|
go.mongodb.org/mongo-driver v1.17.2 h1:gvZyk8352qSfzyZ2UMWcpDpMSGEr1eqE4T793SqyhzM=
|
||||||
|
go.mongodb.org/mongo-driver v1.17.2/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ=
|
||||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
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.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
||||||
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
@@ -520,21 +501,28 @@ go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
|
|||||||
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
|
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
|
||||||
go4.org v0.0.0-20230225012048-214862532bf5 h1:nifaUDeh+rPaBCMPMQHZmvJf+QdpLFnuQPwx+LxVmtc=
|
go4.org v0.0.0-20230225012048-214862532bf5 h1:nifaUDeh+rPaBCMPMQHZmvJf+QdpLFnuQPwx+LxVmtc=
|
||||||
go4.org v0.0.0-20230225012048-214862532bf5/go.mod h1:F57wTi5Lrj6WLyswp5EYV1ncrEbFGHD4hhz6S1ZYeaU=
|
go4.org v0.0.0-20230225012048-214862532bf5/go.mod h1:F57wTi5Lrj6WLyswp5EYV1ncrEbFGHD4hhz6S1ZYeaU=
|
||||||
golang.org/x/arch v0.11.0 h1:KXV8WWKCXm6tRpLirl2szsO5j/oOODwZf4hATmGVNs4=
|
golang.org/x/arch v0.13.0 h1:KCkqVVV1kGg0X87TFysjCJ8MxtZEIU4Ja/yXGeoECdA=
|
||||||
golang.org/x/arch v0.11.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
|
golang.org/x/arch v0.13.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-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-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-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-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/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-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
|
||||||
golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
|
golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
|
||||||
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
|
golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
|
||||||
golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
|
|
||||||
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
|
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
|
||||||
golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
|
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
|
||||||
golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
|
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
|
||||||
|
golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
|
||||||
|
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
|
||||||
|
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.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
|
||||||
|
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
|
||||||
|
golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
|
||||||
|
golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
|
||||||
|
golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
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-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-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||||
@@ -543,13 +531,12 @@ golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE
|
|||||||
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
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-20191227195350-da58074b4299/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-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
|
||||||
golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c h1:7dEasQXItcW1xKJ2+gg5VOiBnqWrJc+rq0DPKyvvdbY=
|
golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 h1:yqrTHse8TCMW1M1ZCP+VAR/l0kKxwaAIqN/il7x4voA=
|
||||||
golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c/go.mod h1:NQtJDoLvd6faHhE7m4T/1IY708gDefGGjR/iUW8yQQ8=
|
golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU=
|
||||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
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/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||||
golang.org/x/image v0.13.0/go.mod h1:6mmbMOeV28HuMTgA6OSRkdXKYw/t5W9Uwn2Yv1r3Yxk=
|
golang.org/x/image v0.23.0 h1:HseQ7c2OpPKTPVzNjG5fwJsOTCiiwS4QdsYi5XU6H68=
|
||||||
golang.org/x/image v0.21.0 h1:c5qV36ajHpdj4Qi0GnE0jUc/yuo33OLFaa0d+crTD5s=
|
golang.org/x/image v0.23.0/go.mod h1:wJJBTdLfCCf3tiHa1fNxpZmUI4mmoZvwMCPP0ddoNKY=
|
||||||
golang.org/x/image v0.21.0/go.mod h1:vUbsLavqK/W303ZroQQVKQ+Af3Yl6Uz1Ppu5J/cLz78=
|
|
||||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
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-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-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||||
@@ -565,11 +552,13 @@ golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKG
|
|||||||
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
|
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.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.6.0-dev/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
|
|
||||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
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.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||||
golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
|
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||||
golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
|
golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||||
|
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||||
|
golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4=
|
||||||
|
golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
|
||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
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-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-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
@@ -584,17 +573,22 @@ golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLL
|
|||||||
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/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-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-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
|
||||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/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-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
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.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.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||||
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
|
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
|
||||||
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
||||||
|
golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
|
||||||
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
|
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
|
||||||
golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
|
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
|
||||||
golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
|
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
|
||||||
|
golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
|
||||||
|
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.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
|
||||||
|
golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
|
||||||
|
golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
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-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-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
@@ -606,16 +600,18 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ
|
|||||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/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-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-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/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.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.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
|
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/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||||
|
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
|
||||||
|
golang.org/x/sync v0.10.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-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-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-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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190425145619-16072639606e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/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-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-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
@@ -625,10 +621,8 @@ golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/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-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/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-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/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-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/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-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
@@ -637,15 +631,34 @@ golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|||||||
golang.org/x/sys v0.5.0/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.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
|
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
|
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.19.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.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
|
golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
|
||||||
|
golang.org/x/sys v0.29.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-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.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.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
||||||
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
|
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
|
||||||
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
|
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
|
||||||
|
golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o=
|
||||||
golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
|
golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
|
||||||
|
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.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
|
||||||
|
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.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=
|
||||||
|
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
|
||||||
|
golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk=
|
||||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
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.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.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
@@ -657,15 +670,18 @@ golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
|
|||||||
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||||
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||||
|
golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||||
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||||
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
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.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||||
golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
|
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||||
golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
|
golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
|
||||||
|
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
|
||||||
|
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
|
||||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
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-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ=
|
golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY=
|
||||||
golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
|
golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
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-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-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||||
@@ -692,8 +708,10 @@ golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapK
|
|||||||
golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/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.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
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.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
||||||
golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ=
|
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
|
||||||
golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0=
|
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
|
||||||
|
golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE=
|
||||||
|
golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
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-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-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
@@ -730,8 +748,8 @@ google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac
|
|||||||
google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
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.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||||
google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||||
google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA=
|
google.golang.org/protobuf v1.36.3 h1:82DV7MYdb8anAVi3qge1wSnMDrnKK7ebr+I0hHRN1BU=
|
||||||
google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
|
google.golang.org/protobuf v1.36.3/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
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-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 h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||||
@@ -739,7 +757,6 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV
|
|||||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||||
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
|
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/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||||
gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg=
|
|
||||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
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.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
@@ -749,16 +766,16 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C
|
|||||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gorm.io/datatypes v1.2.3 h1:95ucr9ip9dZMPhB3Tc9zbcoAi62hxYAgHicu7SLjK4g=
|
gorm.io/datatypes v1.2.5 h1:9UogU3jkydFVW1bIVVeoYsTpLRgwDVW3rHfJG6/Ek9I=
|
||||||
gorm.io/datatypes v1.2.3/go.mod h1:f4BsLcFAX67szSv8svwLRjklArSHAvHLeE3pXAS5DZI=
|
gorm.io/datatypes v1.2.5/go.mod h1:I5FUdlKpLb5PMqeMQhm30CQ6jXP8Rj89xkTeCSAaAD4=
|
||||||
gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo=
|
gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo=
|
||||||
gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=
|
gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=
|
||||||
gorm.io/driver/postgres v1.5.9 h1:DkegyItji119OlcaLjqN11kHoUgZ/j13E0jkJZgD6A8=
|
gorm.io/driver/postgres v1.5.11 h1:ubBVAfbKEUld/twyKZ0IYn9rSQh448EdelLYk9Mv314=
|
||||||
gorm.io/driver/postgres v1.5.9/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI=
|
gorm.io/driver/postgres v1.5.11/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI=
|
||||||
gorm.io/driver/sqlite v1.5.0 h1:zKYbzRCpBrT1bNijRnxLDJWPjVfImGEn0lSnUY5gZ+c=
|
gorm.io/driver/sqlite v1.5.0 h1:zKYbzRCpBrT1bNijRnxLDJWPjVfImGEn0lSnUY5gZ+c=
|
||||||
gorm.io/driver/sqlite v1.5.0/go.mod h1:kDMDfntV9u/vuMmz8APHtHF0b4nyBB7sfCieC6G8k8I=
|
gorm.io/driver/sqlite v1.5.0/go.mod h1:kDMDfntV9u/vuMmz8APHtHF0b4nyBB7sfCieC6G8k8I=
|
||||||
gorm.io/driver/sqlserver v1.5.3 h1:rjupPS4PVw+rjJkfvr8jn2lJ8BMhT4UW5FwuJY0P3Z0=
|
gorm.io/driver/sqlserver v1.5.4 h1:xA+Y1KDNspv79q43bPyjDMUgHoYHLhXYmdFcYPobg8g=
|
||||||
gorm.io/driver/sqlserver v1.5.3/go.mod h1:B+CZ0/7oFJ6tAlefsKoyxdgDCXJKSgwS2bMOQZT0I00=
|
gorm.io/driver/sqlserver v1.5.4/go.mod h1:+frZ/qYmuna11zHPlh5oc2O6ZA/lS88Keb0XSH1Zh/g=
|
||||||
gorm.io/gen v0.3.26 h1:sFf1j7vNStimPRRAtH4zz5NiHM+1dr6eA9aaRdplyhY=
|
gorm.io/gen v0.3.26 h1:sFf1j7vNStimPRRAtH4zz5NiHM+1dr6eA9aaRdplyhY=
|
||||||
gorm.io/gen v0.3.26/go.mod h1:a5lq5y3w4g5LMxBcw0wnO6tYUCdNutWODq5LrIt75LE=
|
gorm.io/gen v0.3.26/go.mod h1:a5lq5y3w4g5LMxBcw0wnO6tYUCdNutWODq5LrIt75LE=
|
||||||
gorm.io/gorm v1.24.7-0.20230306060331-85eaf9eeda11/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
|
gorm.io/gorm v1.24.7-0.20230306060331-85eaf9eeda11/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
|
||||||
@@ -776,31 +793,29 @@ honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWh
|
|||||||
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/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.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-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
||||||
howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0=
|
modernc.org/cc/v4 v4.24.4 h1:TFkx1s6dCkQpd6dKurBNmpo+G8Zl4Sq/ztJ+2+DEsh0=
|
||||||
howett.net/plist v1.0.1 h1:37GdZ8tP09Q35o9ych3ehygcsL+HqKSwzctveSlarvM=
|
modernc.org/cc/v4 v4.24.4/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0=
|
||||||
howett.net/plist v1.0.1/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g=
|
modernc.org/ccgo/v4 v4.23.13 h1:PFiaemQwE/jdwi8XEHyEV+qYWoIuikLP3T4rvDeJb00=
|
||||||
modernc.org/cc/v4 v4.21.4 h1:3Be/Rdo1fpr8GrQ7IVw9OHtplU4gWbb+wNgeoBMmGLQ=
|
modernc.org/ccgo/v4 v4.23.13/go.mod h1:vdN4h2WR5aEoNondUx26K7G8X+nuBscYnAEWSRmN2/0=
|
||||||
modernc.org/cc/v4 v4.21.4/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ=
|
modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8=
|
||||||
modernc.org/ccgo/v4 v4.21.0 h1:kKPI3dF7RIag8YcToh5ZwDcVMIv6VGa0ED5cvh0LMW4=
|
|
||||||
modernc.org/ccgo/v4 v4.21.0/go.mod h1:h6kt6H/A2+ew/3MW/p6KEoQmrq/i3pr0J/SiwiaF/g0=
|
|
||||||
modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE=
|
modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE=
|
||||||
modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ=
|
modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ=
|
||||||
modernc.org/gc/v2 v2.5.0 h1:bJ9ChznK1L1mUtAQtxi0wi5AtAs5jQuw4PrPHO5pb6M=
|
modernc.org/gc/v2 v2.6.1 h1:+Qf6xdG8l7B27TQ8D8lw/iFMUj1RXRBOuMUWziJOsk8=
|
||||||
modernc.org/gc/v2 v2.5.0/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU=
|
modernc.org/gc/v2 v2.6.1/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito=
|
||||||
modernc.org/libc v1.61.0 h1:eGFcvWpqlnoGwzZeZe3PWJkkKbM/3SUGyk1DVZQ0TpE=
|
modernc.org/libc v1.61.9 h1:PLSBXVkifXGELtJ5BOnBUyAHr7lsatNwFU/RRo4kfJM=
|
||||||
modernc.org/libc v1.61.0/go.mod h1:DvxVX89wtGTu+r72MLGhygpfi3aUGgZRdAYGCAVVud0=
|
modernc.org/libc v1.61.9/go.mod h1:61xrnzk/aR8gr5bR7Uj/lLFLuXu2/zMpIjcry63Eumk=
|
||||||
modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4=
|
modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU=
|
||||||
modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo=
|
modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg=
|
||||||
modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E=
|
modernc.org/memory v1.8.2 h1:cL9L4bcoAObu4NkxOlKWBWtNHIsnnACGF/TbqQ6sbcI=
|
||||||
modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU=
|
modernc.org/memory v1.8.2/go.mod h1:ZbjSvMO5NQ1A2i3bWeDiVMxIorXwdClKE/0SZ+BMotU=
|
||||||
modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4=
|
modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8=
|
||||||
modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
|
modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns=
|
||||||
modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc=
|
modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w=
|
||||||
modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss=
|
modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE=
|
||||||
modernc.org/sqlite v1.33.1 h1:trb6Z3YYoeM9eDL1O8do81kP+0ejv+YzgyFo+Gwy0nM=
|
modernc.org/sqlite v1.34.5 h1:Bb6SR13/fjp15jt70CL4f18JIN7p7dnMExd+UFnF15g=
|
||||||
modernc.org/sqlite v1.33.1/go.mod h1:pXV2xHxhzXZsgT/RtTFAPY6JJDEvOTcTdwADQCCWD4k=
|
modernc.org/sqlite v1.34.5/go.mod h1:YLuNmX9NKs8wRNK2ko1LW1NGYcc9FkBO69JOt1AR9JE=
|
||||||
modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA=
|
modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0=
|
||||||
modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0=
|
modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A=
|
||||||
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
|
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
|
||||||
modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
|
modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
|
||||||
nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=
|
nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=
|
||||||
|
@@ -61,6 +61,7 @@ func RegisterTables() {
|
|||||||
example.ExaCustomer{},
|
example.ExaCustomer{},
|
||||||
example.ExaFileChunk{},
|
example.ExaFileChunk{},
|
||||||
example.ExaFileUploadAndDownload{},
|
example.ExaFileUploadAndDownload{},
|
||||||
|
example.ExaAttachmentCategory{},
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
global.GVA_LOG.Error("register table failed", zap.Error(err))
|
global.GVA_LOG.Error("register table failed", zap.Error(err))
|
||||||
|
@@ -77,23 +77,24 @@ func Routers() *gin.Engine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
systemRouter.InitApiRouter(PrivateGroup, PublicGroup) // 注册功能api路由
|
systemRouter.InitApiRouter(PrivateGroup, PublicGroup) // 注册功能api路由
|
||||||
systemRouter.InitJwtRouter(PrivateGroup) // jwt相关路由
|
systemRouter.InitJwtRouter(PrivateGroup) // jwt相关路由
|
||||||
systemRouter.InitUserRouter(PrivateGroup) // 注册用户路由
|
systemRouter.InitUserRouter(PrivateGroup) // 注册用户路由
|
||||||
systemRouter.InitMenuRouter(PrivateGroup) // 注册menu路由
|
systemRouter.InitMenuRouter(PrivateGroup) // 注册menu路由
|
||||||
systemRouter.InitSystemRouter(PrivateGroup) // system相关路由
|
systemRouter.InitSystemRouter(PrivateGroup) // system相关路由
|
||||||
systemRouter.InitCasbinRouter(PrivateGroup) // 权限相关路由
|
systemRouter.InitCasbinRouter(PrivateGroup) // 权限相关路由
|
||||||
systemRouter.InitAutoCodeRouter(PrivateGroup, PublicGroup) // 创建自动化代码
|
systemRouter.InitAutoCodeRouter(PrivateGroup, PublicGroup) // 创建自动化代码
|
||||||
systemRouter.InitAuthorityRouter(PrivateGroup) // 注册角色路由
|
systemRouter.InitAuthorityRouter(PrivateGroup) // 注册角色路由
|
||||||
systemRouter.InitSysDictionaryRouter(PrivateGroup) // 字典管理
|
systemRouter.InitSysDictionaryRouter(PrivateGroup) // 字典管理
|
||||||
systemRouter.InitAutoCodeHistoryRouter(PrivateGroup) // 自动化代码历史
|
systemRouter.InitAutoCodeHistoryRouter(PrivateGroup) // 自动化代码历史
|
||||||
systemRouter.InitSysOperationRecordRouter(PrivateGroup) // 操作记录
|
systemRouter.InitSysOperationRecordRouter(PrivateGroup) // 操作记录
|
||||||
systemRouter.InitSysDictionaryDetailRouter(PrivateGroup) // 字典详情管理
|
systemRouter.InitSysDictionaryDetailRouter(PrivateGroup) // 字典详情管理
|
||||||
systemRouter.InitAuthorityBtnRouterRouter(PrivateGroup) // 按钮权限管理
|
systemRouter.InitAuthorityBtnRouterRouter(PrivateGroup) // 按钮权限管理
|
||||||
systemRouter.InitSysExportTemplateRouter(PrivateGroup) // 导出模板
|
systemRouter.InitSysExportTemplateRouter(PrivateGroup) // 导出模板
|
||||||
systemRouter.InitSysParamsRouter(PrivateGroup, PublicGroup) // 参数管理
|
systemRouter.InitSysParamsRouter(PrivateGroup, PublicGroup) // 参数管理
|
||||||
exampleRouter.InitCustomerRouter(PrivateGroup) // 客户路由
|
exampleRouter.InitCustomerRouter(PrivateGroup) // 客户路由
|
||||||
exampleRouter.InitFileUploadAndDownloadRouter(PrivateGroup) // 文件上传下载功能路由
|
exampleRouter.InitFileUploadAndDownloadRouter(PrivateGroup) // 文件上传下载功能路由
|
||||||
|
exampleRouter.InitAttachmentCategoryRouterRouter(PrivateGroup) // 文件上传下载分类
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -4,13 +4,12 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/global"
|
"github.com/flipped-aurora/gin-vue-admin/server/global"
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/utils"
|
"github.com/flipped-aurora/gin-vue-admin/server/utils"
|
||||||
"github.com/golang-jwt/jwt/v4"
|
"github.com/golang-jwt/jwt/v5"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
|
"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/service"
|
"github.com/flipped-aurora/gin-vue-admin/server/service"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
16
server/model/example/exa_attachment_category.go
Normal file
16
server/model/example/exa_attachment_category.go
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package example
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/flipped-aurora/gin-vue-admin/server/global"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ExaAttachmentCategory struct {
|
||||||
|
global.GVA_MODEL
|
||||||
|
Name string `json:"name" form:"name" gorm:"default:null;type:varchar(255);column:name;comment:分类名称;"`
|
||||||
|
Pid uint `json:"pid" form:"pid" gorm:"default:0;type:int;column:pid;comment:父节点ID;"`
|
||||||
|
Children []*ExaAttachmentCategory `json:"children" gorm:"-"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ExaAttachmentCategory) TableName() string {
|
||||||
|
return "exa_attachment_category"
|
||||||
|
}
|
@@ -6,10 +6,11 @@ import (
|
|||||||
|
|
||||||
type ExaFileUploadAndDownload struct {
|
type ExaFileUploadAndDownload struct {
|
||||||
global.GVA_MODEL
|
global.GVA_MODEL
|
||||||
Name string `json:"name" gorm:"comment:文件名"` // 文件名
|
Name string `json:"name" form:"name" gorm:"column:name;comment:文件名"` // 文件名
|
||||||
Url string `json:"url" gorm:"comment:文件地址"` // 文件地址
|
ClassId int `json:"classId" form:"classId" gorm:"default:0;type:int;column:class_id;comment:分类id;"` // 分类id
|
||||||
Tag string `json:"tag" gorm:"comment:文件标签"` // 文件标签
|
Url string `json:"url" form:"url" gorm:"column:url;comment:文件地址"` // 文件地址
|
||||||
Key string `json:"key" gorm:"comment:编号"` // 编号
|
Tag string `json:"tag" form:"tag" gorm:"column:tag;comment:文件标签"` // 文件标签
|
||||||
|
Key string `json:"key" form:"key" gorm:"column:key;comment:编号"` // 编号
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ExaFileUploadAndDownload) TableName() string {
|
func (ExaFileUploadAndDownload) TableName() string {
|
||||||
|
@@ -0,0 +1,10 @@
|
|||||||
|
package request
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/flipped-aurora/gin-vue-admin/server/model/common/request"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ExaAttachmentCategorySearch struct {
|
||||||
|
ClassId int `json:"classId" form:"classId"`
|
||||||
|
request.PageInfo
|
||||||
|
}
|
@@ -1,11 +1,11 @@
|
|||||||
package request
|
package request
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/gofrs/uuid/v5"
|
jwt "github.com/golang-jwt/jwt/v5"
|
||||||
jwt "github.com/golang-jwt/jwt/v4"
|
"github.com/google/uuid"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Custom claims structure
|
// CustomClaims structure
|
||||||
type CustomClaims struct {
|
type CustomClaims struct {
|
||||||
BaseClaims
|
BaseClaims
|
||||||
BufferTime int64
|
BufferTime int64
|
||||||
|
@@ -31,6 +31,8 @@ type AutoCode struct {
|
|||||||
TreeJson string `json:"treeJson" example:"展示的树json字段"` // 展示的树json字段
|
TreeJson string `json:"treeJson" example:"展示的树json字段"` // 展示的树json字段
|
||||||
IsAdd bool `json:"isAdd" example:"false"` // 是否新增
|
IsAdd bool `json:"isAdd" example:"false"` // 是否新增
|
||||||
Fields []*AutoCodeField `json:"fields"`
|
Fields []*AutoCodeField `json:"fields"`
|
||||||
|
GenerateWeb bool `json:"generateWeb" example:"true"` // 是否生成web
|
||||||
|
GenerateServer bool `json:"generateServer" example:"true"` // 是否生成server
|
||||||
Module string `json:"-"`
|
Module string `json:"-"`
|
||||||
DictTypes []string `json:"-"`
|
DictTypes []string `json:"-"`
|
||||||
PrimaryField *AutoCodeField `json:"primaryField"`
|
PrimaryField *AutoCodeField `json:"primaryField"`
|
||||||
|
@@ -3,7 +3,7 @@ package system
|
|||||||
import (
|
import (
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/global"
|
"github.com/flipped-aurora/gin-vue-admin/server/global"
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/model/common"
|
"github.com/flipped-aurora/gin-vue-admin/server/model/common"
|
||||||
"github.com/gofrs/uuid/v5"
|
"github.com/google/uuid"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Login interface {
|
type Login interface {
|
||||||
|
@@ -7,9 +7,11 @@ import (
|
|||||||
type RouterGroup struct {
|
type RouterGroup struct {
|
||||||
CustomerRouter
|
CustomerRouter
|
||||||
FileUploadAndDownloadRouter
|
FileUploadAndDownloadRouter
|
||||||
|
AttachmentCategoryRouter
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
exaCustomerApi = api.ApiGroupApp.ExampleApiGroup.CustomerApi
|
exaCustomerApi = api.ApiGroupApp.ExampleApiGroup.CustomerApi
|
||||||
exaFileUploadAndDownloadApi = api.ApiGroupApp.ExampleApiGroup.FileUploadAndDownloadApi
|
exaFileUploadAndDownloadApi = api.ApiGroupApp.ExampleApiGroup.FileUploadAndDownloadApi
|
||||||
|
attachmentCategoryApi = api.ApiGroupApp.ExampleApiGroup.AttachmentCategoryApi
|
||||||
)
|
)
|
||||||
|
16
server/router/example/exa_attachment_category.go
Normal file
16
server/router/example/exa_attachment_category.go
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package example
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
)
|
||||||
|
|
||||||
|
type AttachmentCategoryRouter struct{}
|
||||||
|
|
||||||
|
func (r *AttachmentCategoryRouter) InitAttachmentCategoryRouterRouter(Router *gin.RouterGroup) {
|
||||||
|
router := Router.Group("attachmentCategory")
|
||||||
|
{
|
||||||
|
router.GET("getCategoryList", attachmentCategoryApi.GetCategoryList) // 分类列表
|
||||||
|
router.POST("addCategory", attachmentCategoryApi.AddCategory) // 添加/编辑分类
|
||||||
|
router.POST("deleteCategory", attachmentCategoryApi.DeleteCategory) // 删除分类
|
||||||
|
}
|
||||||
|
}
|
@@ -3,4 +3,5 @@ package example
|
|||||||
type ServiceGroup struct {
|
type ServiceGroup struct {
|
||||||
CustomerService
|
CustomerService
|
||||||
FileUploadAndDownloadService
|
FileUploadAndDownloadService
|
||||||
|
AttachmentCategoryService
|
||||||
}
|
}
|
||||||
|
66
server/service/example/exa_attachment_category.go
Normal file
66
server/service/example/exa_attachment_category.go
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
package example
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"github.com/flipped-aurora/gin-vue-admin/server/global"
|
||||||
|
"github.com/flipped-aurora/gin-vue-admin/server/model/example"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
type AttachmentCategoryService struct{}
|
||||||
|
|
||||||
|
// AddCategory 创建/更新的分类
|
||||||
|
func (a *AttachmentCategoryService) AddCategory(req *example.ExaAttachmentCategory) (err error) {
|
||||||
|
// 检查是否已存在相同名称的分类
|
||||||
|
if (!errors.Is(global.GVA_DB.Take(&example.ExaAttachmentCategory{}, "name = ? and pid = ?", req.Name, req.Pid).Error, gorm.ErrRecordNotFound)) {
|
||||||
|
return errors.New("分类名称已存在")
|
||||||
|
}
|
||||||
|
if req.ID > 0 {
|
||||||
|
if err = global.GVA_DB.Model(&example.ExaAttachmentCategory{}).Where("id = ?", req.ID).Updates(&example.ExaAttachmentCategory{
|
||||||
|
Name: req.Name,
|
||||||
|
Pid: req.Pid,
|
||||||
|
}).Error; err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if err = global.GVA_DB.Create(&example.ExaAttachmentCategory{
|
||||||
|
Name: req.Name,
|
||||||
|
Pid: req.Pid,
|
||||||
|
}).Error; err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteCategory 删除分类
|
||||||
|
func (a *AttachmentCategoryService) DeleteCategory(id *int) error {
|
||||||
|
var childCount int64
|
||||||
|
global.GVA_DB.Model(&example.ExaAttachmentCategory{}).Where("pid = ?", id).Count(&childCount)
|
||||||
|
if childCount > 0 {
|
||||||
|
return errors.New("请先删除子级")
|
||||||
|
}
|
||||||
|
return global.GVA_DB.Where("id = ?", id).Unscoped().Delete(&example.ExaAttachmentCategory{}).Error
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetCategoryList 分类列表
|
||||||
|
func (a *AttachmentCategoryService) GetCategoryList() (res []*example.ExaAttachmentCategory, err error) {
|
||||||
|
var fileLists []example.ExaAttachmentCategory
|
||||||
|
err = global.GVA_DB.Model(&example.ExaAttachmentCategory{}).Find(&fileLists).Error
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
return a.getChildrenList(fileLists, 0), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// getChildrenList 子类
|
||||||
|
func (a *AttachmentCategoryService) getChildrenList(categories []example.ExaAttachmentCategory, parentID uint) []*example.ExaAttachmentCategory {
|
||||||
|
var tree []*example.ExaAttachmentCategory
|
||||||
|
for _, category := range categories {
|
||||||
|
if category.Pid == parentID {
|
||||||
|
category.Children = a.getChildrenList(categories, category.ID)
|
||||||
|
tree = append(tree, &category)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return tree
|
||||||
|
}
|
@@ -6,8 +6,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/global"
|
"github.com/flipped-aurora/gin-vue-admin/server/global"
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/model/common/request"
|
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/model/example"
|
"github.com/flipped-aurora/gin-vue-admin/server/model/example"
|
||||||
|
"github.com/flipped-aurora/gin-vue-admin/server/model/example/request"
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/utils/upload"
|
"github.com/flipped-aurora/gin-vue-admin/server/utils/upload"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -62,24 +62,28 @@ func (e *FileUploadAndDownloadService) EditFileName(file example.ExaFileUploadAn
|
|||||||
//@author: [piexlmax](https://github.com/piexlmax)
|
//@author: [piexlmax](https://github.com/piexlmax)
|
||||||
//@function: GetFileRecordInfoList
|
//@function: GetFileRecordInfoList
|
||||||
//@description: 分页获取数据
|
//@description: 分页获取数据
|
||||||
//@param: info request.PageInfo
|
//@param: info request.ExaAttachmentCategorySearch
|
||||||
//@return: list interface{}, total int64, err error
|
//@return: list interface{}, total int64, err error
|
||||||
|
|
||||||
func (e *FileUploadAndDownloadService) GetFileRecordInfoList(info request.PageInfo) (list interface{}, total int64, err error) {
|
func (e *FileUploadAndDownloadService) GetFileRecordInfoList(info request.ExaAttachmentCategorySearch) (list []example.ExaFileUploadAndDownload, total int64, err error) {
|
||||||
limit := info.PageSize
|
limit := info.PageSize
|
||||||
offset := info.PageSize * (info.Page - 1)
|
offset := info.PageSize * (info.Page - 1)
|
||||||
keyword := info.Keyword
|
|
||||||
db := global.GVA_DB.Model(&example.ExaFileUploadAndDownload{})
|
db := global.GVA_DB.Model(&example.ExaFileUploadAndDownload{})
|
||||||
var fileLists []example.ExaFileUploadAndDownload
|
|
||||||
if len(keyword) > 0 {
|
if len(info.Keyword) > 0 {
|
||||||
db = db.Where("name LIKE ?", "%"+keyword+"%")
|
db = db.Where("name LIKE ?", "%"+info.Keyword+"%")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if info.ClassId > 0 {
|
||||||
|
db = db.Where("class_id = ?", info.ClassId)
|
||||||
|
}
|
||||||
|
|
||||||
err = db.Count(&total).Error
|
err = db.Count(&total).Error
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
err = db.Limit(limit).Offset(offset).Order("updated_at desc").Find(&fileLists).Error
|
err = db.Limit(limit).Offset(offset).Order("id desc").Find(&list).Error
|
||||||
return fileLists, total, err
|
return list, total, err
|
||||||
}
|
}
|
||||||
|
|
||||||
//@author: [piexlmax](https://github.com/piexlmax)
|
//@author: [piexlmax](https://github.com/piexlmax)
|
||||||
@@ -88,7 +92,7 @@ func (e *FileUploadAndDownloadService) GetFileRecordInfoList(info request.PageIn
|
|||||||
//@param: header *multipart.FileHeader, noSave string
|
//@param: header *multipart.FileHeader, noSave string
|
||||||
//@return: file model.ExaFileUploadAndDownload, err error
|
//@return: file model.ExaFileUploadAndDownload, err error
|
||||||
|
|
||||||
func (e *FileUploadAndDownloadService) UploadFile(header *multipart.FileHeader, noSave string) (file example.ExaFileUploadAndDownload, err error) {
|
func (e *FileUploadAndDownloadService) UploadFile(header *multipart.FileHeader, noSave string, classId int) (file example.ExaFileUploadAndDownload, err error) {
|
||||||
oss := upload.NewOss()
|
oss := upload.NewOss()
|
||||||
filePath, key, uploadErr := oss.UploadFile(header)
|
filePath, key, uploadErr := oss.UploadFile(header)
|
||||||
if uploadErr != nil {
|
if uploadErr != nil {
|
||||||
@@ -96,10 +100,11 @@ func (e *FileUploadAndDownloadService) UploadFile(header *multipart.FileHeader,
|
|||||||
}
|
}
|
||||||
s := strings.Split(header.Filename, ".")
|
s := strings.Split(header.Filename, ".")
|
||||||
f := example.ExaFileUploadAndDownload{
|
f := example.ExaFileUploadAndDownload{
|
||||||
Url: filePath,
|
Url: filePath,
|
||||||
Name: header.Filename,
|
Name: header.Filename,
|
||||||
Tag: s[len(s)-1],
|
ClassId: classId,
|
||||||
Key: key,
|
Tag: s[len(s)-1],
|
||||||
|
Key: key,
|
||||||
}
|
}
|
||||||
if noSave == "0" {
|
if noSave == "0" {
|
||||||
return f, e.Upload(f)
|
return f, e.Upload(f)
|
||||||
|
@@ -53,7 +53,7 @@ func (s *autoCodePackage) Create(ctx context.Context, info *request.SysAutoCodeP
|
|||||||
return errors.Wrap(err, "创建失败!")
|
return errors.Wrap(err, "创建失败!")
|
||||||
}
|
}
|
||||||
code := info.AutoCode()
|
code := info.AutoCode()
|
||||||
_, asts, creates, err := s.templates(ctx, create, code)
|
_, asts, creates, err := s.templates(ctx, create, code, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -239,7 +239,7 @@ func (s *autoCodePackage) Templates(ctx context.Context) ([]string, error) {
|
|||||||
return templates, nil
|
return templates, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *autoCodePackage) templates(ctx context.Context, entity model.SysAutoCodePackage, info request.AutoCode) (code map[string]string, asts map[string]ast.Ast, creates map[string]string, err error) {
|
func (s *autoCodePackage) templates(ctx context.Context, entity model.SysAutoCodePackage, info request.AutoCode, isPackage bool) (code map[string]string, asts map[string]ast.Ast, creates map[string]string, err error) {
|
||||||
code = make(map[string]string)
|
code = make(map[string]string)
|
||||||
asts = make(map[string]ast.Ast)
|
asts = make(map[string]ast.Ast)
|
||||||
creates = make(map[string]string)
|
creates = make(map[string]string)
|
||||||
@@ -252,6 +252,9 @@ func (s *autoCodePackage) templates(ctx context.Context, entity model.SysAutoCod
|
|||||||
second := filepath.Join(templateDir, templateDirs[i].Name())
|
second := filepath.Join(templateDir, templateDirs[i].Name())
|
||||||
switch templateDirs[i].Name() {
|
switch templateDirs[i].Name() {
|
||||||
case "server":
|
case "server":
|
||||||
|
if !info.GenerateServer && !isPackage {
|
||||||
|
break
|
||||||
|
}
|
||||||
var secondDirs []os.DirEntry
|
var secondDirs []os.DirEntry
|
||||||
secondDirs, err = os.ReadDir(second)
|
secondDirs, err = os.ReadDir(second)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -599,6 +602,9 @@ func (s *autoCodePackage) templates(ctx context.Context, entity model.SysAutoCod
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
case "web":
|
case "web":
|
||||||
|
if !info.GenerateWeb && !isPackage {
|
||||||
|
break
|
||||||
|
}
|
||||||
var secondDirs []os.DirEntry
|
var secondDirs []os.DirEntry
|
||||||
secondDirs, err = os.ReadDir(second)
|
secondDirs, err = os.ReadDir(second)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@@ -168,7 +168,7 @@ func (s *autoCodePlugin) PubPlug(plugName string) (zipPath string, err error) {
|
|||||||
|
|
||||||
// we can use the CompressedArchive type to gzip a tarball
|
// we can use the CompressedArchive type to gzip a tarball
|
||||||
// (compression is not required; you could use Tar directly)
|
// (compression is not required; you could use Tar directly)
|
||||||
format := archiver.CompressedArchive{
|
format := archiver.Archive{
|
||||||
Archival: archiver.Zip{},
|
Archival: archiver.Zip{},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -217,7 +217,7 @@ func (s *autoCodeTemplate) Preview(ctx context.Context, info request.AutoCode) (
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *autoCodeTemplate) generate(ctx context.Context, info request.AutoCode, entity model.SysAutoCodePackage) (map[string]strings.Builder, map[string]string, map[string]utilsAst.Ast, error) {
|
func (s *autoCodeTemplate) generate(ctx context.Context, info request.AutoCode, entity model.SysAutoCodePackage) (map[string]strings.Builder, map[string]string, map[string]utilsAst.Ast, error) {
|
||||||
templates, asts, _, err := AutoCodePackage.templates(ctx, entity, info)
|
templates, asts, _, err := AutoCodePackage.templates(ctx, entity, info, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, err
|
return nil, nil, nil, err
|
||||||
}
|
}
|
||||||
|
@@ -7,7 +7,7 @@ import (
|
|||||||
"github.com/flipped-aurora/gin-vue-admin/server/global"
|
"github.com/flipped-aurora/gin-vue-admin/server/global"
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/model/system/request"
|
"github.com/flipped-aurora/gin-vue-admin/server/model/system/request"
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/utils"
|
"github.com/flipped-aurora/gin-vue-admin/server/utils"
|
||||||
"github.com/gofrs/uuid/v5"
|
"github.com/google/uuid"
|
||||||
"github.com/gookit/color"
|
"github.com/gookit/color"
|
||||||
"gorm.io/driver/sqlserver"
|
"gorm.io/driver/sqlserver"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
@@ -28,7 +28,7 @@ func (h MssqlInitHandler) WriteConfig(ctx context.Context) error {
|
|||||||
}
|
}
|
||||||
global.GVA_CONFIG.System.DbType = "mssql"
|
global.GVA_CONFIG.System.DbType = "mssql"
|
||||||
global.GVA_CONFIG.Mssql = c
|
global.GVA_CONFIG.Mssql = c
|
||||||
global.GVA_CONFIG.JWT.SigningKey = uuid.Must(uuid.NewV4()).String()
|
global.GVA_CONFIG.JWT.SigningKey = uuid.New().String()
|
||||||
cs := utils.StructToMap(global.GVA_CONFIG)
|
cs := utils.StructToMap(global.GVA_CONFIG)
|
||||||
for k, v := range cs {
|
for k, v := range cs {
|
||||||
global.GVA_VP.Set(k, v)
|
global.GVA_VP.Set(k, v)
|
||||||
|
@@ -13,7 +13,7 @@ import (
|
|||||||
|
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/global"
|
"github.com/flipped-aurora/gin-vue-admin/server/global"
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/model/system/request"
|
"github.com/flipped-aurora/gin-vue-admin/server/model/system/request"
|
||||||
"github.com/gofrs/uuid/v5"
|
"github.com/google/uuid"
|
||||||
"gorm.io/driver/mysql"
|
"gorm.io/driver/mysql"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
)
|
)
|
||||||
@@ -32,7 +32,7 @@ func (h MysqlInitHandler) WriteConfig(ctx context.Context) error {
|
|||||||
}
|
}
|
||||||
global.GVA_CONFIG.System.DbType = "mysql"
|
global.GVA_CONFIG.System.DbType = "mysql"
|
||||||
global.GVA_CONFIG.Mysql = c
|
global.GVA_CONFIG.Mysql = c
|
||||||
global.GVA_CONFIG.JWT.SigningKey = uuid.Must(uuid.NewV4()).String()
|
global.GVA_CONFIG.JWT.SigningKey = uuid.New().String()
|
||||||
cs := utils.StructToMap(global.GVA_CONFIG)
|
cs := utils.StructToMap(global.GVA_CONFIG)
|
||||||
for k, v := range cs {
|
for k, v := range cs {
|
||||||
global.GVA_VP.Set(k, v)
|
global.GVA_VP.Set(k, v)
|
||||||
|
@@ -13,7 +13,7 @@ import (
|
|||||||
|
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/global"
|
"github.com/flipped-aurora/gin-vue-admin/server/global"
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/model/system/request"
|
"github.com/flipped-aurora/gin-vue-admin/server/model/system/request"
|
||||||
"github.com/gofrs/uuid/v5"
|
"github.com/google/uuid"
|
||||||
"gorm.io/driver/postgres"
|
"gorm.io/driver/postgres"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
)
|
)
|
||||||
@@ -32,7 +32,7 @@ func (h PgsqlInitHandler) WriteConfig(ctx context.Context) error {
|
|||||||
}
|
}
|
||||||
global.GVA_CONFIG.System.DbType = "pgsql"
|
global.GVA_CONFIG.System.DbType = "pgsql"
|
||||||
global.GVA_CONFIG.Pgsql = c
|
global.GVA_CONFIG.Pgsql = c
|
||||||
global.GVA_CONFIG.JWT.SigningKey = uuid.Must(uuid.NewV4()).String()
|
global.GVA_CONFIG.JWT.SigningKey = uuid.New().String()
|
||||||
cs := utils.StructToMap(global.GVA_CONFIG)
|
cs := utils.StructToMap(global.GVA_CONFIG)
|
||||||
for k, v := range cs {
|
for k, v := range cs {
|
||||||
global.GVA_VP.Set(k, v)
|
global.GVA_VP.Set(k, v)
|
||||||
|
@@ -4,7 +4,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"github.com/glebarez/sqlite"
|
"github.com/glebarez/sqlite"
|
||||||
"github.com/gofrs/uuid/v5"
|
"github.com/google/uuid"
|
||||||
"github.com/gookit/color"
|
"github.com/gookit/color"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@@ -29,7 +29,7 @@ func (h SqliteInitHandler) WriteConfig(ctx context.Context) error {
|
|||||||
}
|
}
|
||||||
global.GVA_CONFIG.System.DbType = "sqlite"
|
global.GVA_CONFIG.System.DbType = "sqlite"
|
||||||
global.GVA_CONFIG.Sqlite = c
|
global.GVA_CONFIG.Sqlite = c
|
||||||
global.GVA_CONFIG.JWT.SigningKey = uuid.Must(uuid.NewV4()).String()
|
global.GVA_CONFIG.JWT.SigningKey = uuid.New().String()
|
||||||
cs := utils.StructToMap(global.GVA_CONFIG)
|
cs := utils.StructToMap(global.GVA_CONFIG)
|
||||||
for k, v := range cs {
|
for k, v := range cs {
|
||||||
global.GVA_VP.Set(k, v)
|
global.GVA_VP.Set(k, v)
|
||||||
|
@@ -10,7 +10,7 @@ import (
|
|||||||
"github.com/flipped-aurora/gin-vue-admin/server/global"
|
"github.com/flipped-aurora/gin-vue-admin/server/global"
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/model/system"
|
"github.com/flipped-aurora/gin-vue-admin/server/model/system"
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/utils"
|
"github.com/flipped-aurora/gin-vue-admin/server/utils"
|
||||||
"github.com/gofrs/uuid/v5"
|
"github.com/google/uuid"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -31,7 +31,7 @@ func (userService *UserService) Register(u system.SysUser) (userInter system.Sys
|
|||||||
}
|
}
|
||||||
// 否则 附加uuid 密码hash加密 注册
|
// 否则 附加uuid 密码hash加密 注册
|
||||||
u.Password = utils.BcryptHash(u.Password)
|
u.Password = utils.BcryptHash(u.Password)
|
||||||
u.UUID = uuid.Must(uuid.NewV4())
|
u.UUID = uuid.New()
|
||||||
err = global.GVA_DB.Create(&u).Error
|
err = global.GVA_DB.Create(&u).Error
|
||||||
return u, err
|
return u, err
|
||||||
}
|
}
|
||||||
|
@@ -182,6 +182,9 @@ func (i *initApi) InitializeData(ctx context.Context) (context.Context, error) {
|
|||||||
{ApiGroup: "参数管理", Method: "GET", Path: "/sysParams/findSysParams", Description: "根据ID获取参数"},
|
{ApiGroup: "参数管理", Method: "GET", Path: "/sysParams/findSysParams", Description: "根据ID获取参数"},
|
||||||
{ApiGroup: "参数管理", Method: "GET", Path: "/sysParams/getSysParamsList", Description: "获取参数列表"},
|
{ApiGroup: "参数管理", Method: "GET", Path: "/sysParams/getSysParamsList", Description: "获取参数列表"},
|
||||||
{ApiGroup: "参数管理", Method: "GET", Path: "/sysParams/getSysParam", Description: "获取参数列表"},
|
{ApiGroup: "参数管理", Method: "GET", Path: "/sysParams/getSysParam", Description: "获取参数列表"},
|
||||||
|
{ApiGroup: "媒体库分类", Method: "GET", Path: "/attachmentCategory/getCategoryList", Description: "分类列表"},
|
||||||
|
{ApiGroup: "媒体库分类", Method: "GET", Path: "/attachmentCategory/addCategory", Description: "添加/编辑分类"},
|
||||||
|
{ApiGroup: "媒体库分类", Method: "GET", Path: "/attachmentCategory/deleteCategory", Description: "删除分类"},
|
||||||
}
|
}
|
||||||
if err := db.Create(&entities).Error; err != nil {
|
if err := db.Create(&entities).Error; err != nil {
|
||||||
return ctx, errors.Wrap(err, sysModel.SysApi{}.TableName()+"表数据初始化失败!")
|
return ctx, errors.Wrap(err, sysModel.SysApi{}.TableName()+"表数据初始化失败!")
|
||||||
|
@@ -185,6 +185,9 @@ func (i *initCasbin) InitializeData(ctx context.Context) (context.Context, error
|
|||||||
{Ptype: "p", V0: "888", V1: "/sysParams/findSysParams", V2: "GET"},
|
{Ptype: "p", V0: "888", V1: "/sysParams/findSysParams", V2: "GET"},
|
||||||
{Ptype: "p", V0: "888", V1: "/sysParams/getSysParamsList", V2: "GET"},
|
{Ptype: "p", V0: "888", V1: "/sysParams/getSysParamsList", V2: "GET"},
|
||||||
{Ptype: "p", V0: "888", V1: "/sysParams/getSysParam", V2: "GET"},
|
{Ptype: "p", V0: "888", V1: "/sysParams/getSysParam", V2: "GET"},
|
||||||
|
{Ptype: "p", V0: "888", V1: "/attachmentCategory/getCategoryList", V2: "GET"},
|
||||||
|
{Ptype: "p", V0: "888", V1: "/attachmentCategory/addCategory", V2: "POST"},
|
||||||
|
{Ptype: "p", V0: "888", V1: "/attachmentCategory/deleteCategory", V2: "POST"},
|
||||||
|
|
||||||
{Ptype: "p", V0: "8881", V1: "/user/admin_register", V2: "POST"},
|
{Ptype: "p", V0: "8881", V1: "/user/admin_register", V2: "POST"},
|
||||||
{Ptype: "p", V0: "8881", V1: "/api/createApi", V2: "POST"},
|
{Ptype: "p", V0: "8881", V1: "/api/createApi", V2: "POST"},
|
||||||
|
@@ -5,7 +5,7 @@ import (
|
|||||||
sysModel "github.com/flipped-aurora/gin-vue-admin/server/model/system"
|
sysModel "github.com/flipped-aurora/gin-vue-admin/server/model/system"
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/service/system"
|
"github.com/flipped-aurora/gin-vue-admin/server/service/system"
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/utils"
|
"github.com/flipped-aurora/gin-vue-admin/server/utils"
|
||||||
"github.com/gofrs/uuid/v5"
|
"github.com/google/uuid"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
)
|
)
|
||||||
@@ -56,7 +56,7 @@ func (i *initUser) InitializeData(ctx context.Context) (next context.Context, er
|
|||||||
|
|
||||||
entities := []sysModel.SysUser{
|
entities := []sysModel.SysUser{
|
||||||
{
|
{
|
||||||
UUID: uuid.Must(uuid.NewV4()),
|
UUID: uuid.New(),
|
||||||
Username: "admin",
|
Username: "admin",
|
||||||
Password: adminPassword,
|
Password: adminPassword,
|
||||||
NickName: "Mr.奇淼",
|
NickName: "Mr.奇淼",
|
||||||
@@ -66,7 +66,7 @@ func (i *initUser) InitializeData(ctx context.Context) (next context.Context, er
|
|||||||
Email: "333333333@qq.com",
|
Email: "333333333@qq.com",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
UUID: uuid.Must(uuid.NewV4()),
|
UUID: uuid.New(),
|
||||||
Username: "a303176530",
|
Username: "a303176530",
|
||||||
Password: password,
|
Password: password,
|
||||||
NickName: "用户1",
|
NickName: "用户1",
|
||||||
|
@@ -55,7 +55,7 @@ func CheckMd5(content []byte, chunkMd5 string) (CanUpload bool) {
|
|||||||
//@return: string, error
|
//@return: string, error
|
||||||
|
|
||||||
func makeFileContent(content []byte, fileName string, FileDir string, contentNumber int) (string, error) {
|
func makeFileContent(content []byte, fileName string, FileDir string, contentNumber int) (string, error) {
|
||||||
if strings.Index(fileName, "..") > -1 || strings.Index(FileDir, "..") > -1 {
|
if strings.Contains(fileName, "..") || strings.Contains(FileDir, "..") {
|
||||||
return "", errors.New("文件名或路径不合法")
|
return "", errors.New("文件名或路径不合法")
|
||||||
}
|
}
|
||||||
path := FileDir + fileName + "_" + strconv.Itoa(contentNumber)
|
path := FileDir + fileName + "_" + strconv.Itoa(contentNumber)
|
||||||
|
@@ -1,13 +1,14 @@
|
|||||||
package utils
|
package utils
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"net"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/global"
|
"github.com/flipped-aurora/gin-vue-admin/server/global"
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/model/system"
|
"github.com/flipped-aurora/gin-vue-admin/server/model/system"
|
||||||
systemReq "github.com/flipped-aurora/gin-vue-admin/server/model/system/request"
|
systemReq "github.com/flipped-aurora/gin-vue-admin/server/model/system/request"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/gofrs/uuid/v5"
|
"github.com/google/uuid"
|
||||||
"net"
|
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func ClearToken(c *gin.Context) {
|
func ClearToken(c *gin.Context) {
|
||||||
@@ -134,7 +135,7 @@ func GetUserName(c *gin.Context) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func LoginToken(user system.Login) (token string, claims systemReq.CustomClaims, err error) {
|
func LoginToken(user system.Login) (token string, claims systemReq.CustomClaims, err error) {
|
||||||
j := &JWT{SigningKey: []byte(global.GVA_CONFIG.JWT.SigningKey)} // 唯一签名
|
j := NewJWT()
|
||||||
claims = j.CreateClaims(systemReq.BaseClaims{
|
claims = j.CreateClaims(systemReq.BaseClaims{
|
||||||
UUID: user.GetUUID(),
|
UUID: user.GetUUID(),
|
||||||
ID: user.GetUserId(),
|
ID: user.GetUserId(),
|
||||||
@@ -143,8 +144,5 @@ func LoginToken(user system.Login) (token string, claims systemReq.CustomClaims,
|
|||||||
AuthorityId: user.GetAuthorityId(),
|
AuthorityId: user.GetAuthorityId(),
|
||||||
})
|
})
|
||||||
token, err = j.CreateToken(claims)
|
token, err = j.CreateToken(claims)
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@@ -4,10 +4,9 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
jwt "github.com/golang-jwt/jwt/v4"
|
|
||||||
|
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/global"
|
"github.com/flipped-aurora/gin-vue-admin/server/global"
|
||||||
"github.com/flipped-aurora/gin-vue-admin/server/model/system/request"
|
"github.com/flipped-aurora/gin-vue-admin/server/model/system/request"
|
||||||
|
jwt "github.com/golang-jwt/jwt/v5"
|
||||||
)
|
)
|
||||||
|
|
||||||
type JWT struct {
|
type JWT struct {
|
||||||
@@ -15,10 +14,12 @@ type JWT struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
TokenExpired = errors.New("Token is expired")
|
TokenValid = errors.New("未知错误")
|
||||||
TokenNotValidYet = errors.New("Token not active yet")
|
TokenExpired = errors.New("token已过期")
|
||||||
TokenMalformed = errors.New("That's not even a token")
|
TokenNotValidYet = errors.New("token尚未激活")
|
||||||
TokenInvalid = errors.New("Couldn't handle this token:")
|
TokenMalformed = errors.New("这不是一个token")
|
||||||
|
TokenSignatureInvalid = errors.New("无效签名")
|
||||||
|
TokenInvalid = errors.New("无法处理此token")
|
||||||
)
|
)
|
||||||
|
|
||||||
func NewJWT() *JWT {
|
func NewJWT() *JWT {
|
||||||
@@ -62,27 +63,25 @@ func (j *JWT) ParseToken(tokenString string) (*request.CustomClaims, error) {
|
|||||||
token, err := jwt.ParseWithClaims(tokenString, &request.CustomClaims{}, func(token *jwt.Token) (i interface{}, e error) {
|
token, err := jwt.ParseWithClaims(tokenString, &request.CustomClaims{}, func(token *jwt.Token) (i interface{}, e error) {
|
||||||
return j.SigningKey, nil
|
return j.SigningKey, nil
|
||||||
})
|
})
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if ve, ok := err.(*jwt.ValidationError); ok {
|
switch {
|
||||||
if ve.Errors&jwt.ValidationErrorMalformed != 0 {
|
case errors.Is(err, jwt.ErrTokenExpired):
|
||||||
return nil, TokenMalformed
|
return nil, TokenExpired
|
||||||
} else if ve.Errors&jwt.ValidationErrorExpired != 0 {
|
case errors.Is(err, jwt.ErrTokenMalformed):
|
||||||
// Token is expired
|
return nil, TokenMalformed
|
||||||
return nil, TokenExpired
|
case errors.Is(err, jwt.ErrTokenSignatureInvalid):
|
||||||
} else if ve.Errors&jwt.ValidationErrorNotValidYet != 0 {
|
return nil, TokenSignatureInvalid
|
||||||
return nil, TokenNotValidYet
|
case errors.Is(err, jwt.ErrTokenNotValidYet):
|
||||||
} else {
|
return nil, TokenNotValidYet
|
||||||
return nil, TokenInvalid
|
default:
|
||||||
}
|
return nil, TokenInvalid
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if token != nil {
|
if token != nil {
|
||||||
if claims, ok := token.Claims.(*request.CustomClaims); ok && token.Valid {
|
if claims, ok := token.Claims.(*request.CustomClaims); ok && token.Valid {
|
||||||
return claims, nil
|
return claims, nil
|
||||||
}
|
}
|
||||||
return nil, TokenInvalid
|
|
||||||
|
|
||||||
} else {
|
|
||||||
return nil, TokenInvalid
|
|
||||||
}
|
}
|
||||||
|
return nil, TokenValid
|
||||||
}
|
}
|
||||||
|
@@ -19,7 +19,7 @@ func Unzip(zipFile string, destDir string) ([]string, error) {
|
|||||||
defer zipReader.Close()
|
defer zipReader.Close()
|
||||||
|
|
||||||
for _, f := range zipReader.File {
|
for _, f := range zipReader.File {
|
||||||
if strings.Index(f.Name, "..") > -1 {
|
if strings.Contains(f.Name, "..") {
|
||||||
return []string{}, fmt.Errorf("%s 文件名不合法", f.Name)
|
return []string{}, fmt.Errorf("%s 文件名不合法", f.Name)
|
||||||
}
|
}
|
||||||
fpath := filepath.Join(destDir, f.Name)
|
fpath := filepath.Join(destDir, f.Name)
|
||||||
|
26
web/src/api/attachmentCategory.js
Normal file
26
web/src/api/attachmentCategory.js
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
import service from '@/utils/request'
|
||||||
|
// 分类列表
|
||||||
|
export const getCategoryList = () => {
|
||||||
|
return service({
|
||||||
|
url: '/attachmentCategory/getCategoryList',
|
||||||
|
method: 'get',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 添加/编辑分类
|
||||||
|
export const addCategory = (data) => {
|
||||||
|
return service({
|
||||||
|
url: '/attachmentCategory/addCategory',
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除分类
|
||||||
|
export const deleteCategory = (data) => {
|
||||||
|
return service({
|
||||||
|
url: '/attachmentCategory/deleteCategory',
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
@@ -1,120 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="profile-avatar relative w-[120px] h-[120px] rounded-full overflow-hidden cursor-pointer group">
|
|
||||||
<img
|
|
||||||
v-if="modelValue"
|
|
||||||
class="w-full h-full object-cover"
|
|
||||||
:src="getUrl(modelValue)"
|
|
||||||
alt="头像"
|
|
||||||
/>
|
|
||||||
<div
|
|
||||||
v-else
|
|
||||||
class="w-full h-full flex flex-col items-center justify-center bg-gray-100 dark:bg-slate-700"
|
|
||||||
>
|
|
||||||
<el-icon class="text-2xl text-gray-400">
|
|
||||||
<avatar />
|
|
||||||
</el-icon>
|
|
||||||
<span class="mt-2 text-sm text-gray-400">点击上传</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div
|
|
||||||
class="absolute inset-0 bg-black/30 opacity-0 group-hover:opacity-100 flex items-center justify-center transition-all duration-300"
|
|
||||||
@click="chooseFile"
|
|
||||||
>
|
|
||||||
<div class="text-center text-white">
|
|
||||||
<el-icon class="text-2xl"><camera-filled /></el-icon>
|
|
||||||
<div class="text-xs mt-1">更换头像</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<input
|
|
||||||
ref="fileInput"
|
|
||||||
type="file"
|
|
||||||
class="hidden"
|
|
||||||
accept="image/*"
|
|
||||||
@change="handleFileChange"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script setup>
|
|
||||||
import { ref } from 'vue'
|
|
||||||
import { ElMessage } from 'element-plus'
|
|
||||||
import { getUrl } from '@/utils/image'
|
|
||||||
import service from '@/utils/request'
|
|
||||||
|
|
||||||
defineOptions({
|
|
||||||
name: 'ProfileAvatar'
|
|
||||||
})
|
|
||||||
|
|
||||||
const { modelValue } = defineProps({
|
|
||||||
modelValue: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
const emit = defineEmits(['update:modelValue'])
|
|
||||||
|
|
||||||
const fileInput = ref(null)
|
|
||||||
|
|
||||||
const chooseFile = () => {
|
|
||||||
fileInput.value.click()
|
|
||||||
}
|
|
||||||
|
|
||||||
const handleFileChange = async (e) => {
|
|
||||||
const file = e.target.files[0]
|
|
||||||
if (!file) return
|
|
||||||
|
|
||||||
// 验证文件类型
|
|
||||||
if (!file.type.includes('image/')) {
|
|
||||||
ElMessage.error('请选择图片文件')
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// 验证文件大小(限制为2MB)
|
|
||||||
if (file.size > 2 * 1024 * 1024) {
|
|
||||||
ElMessage.error('图片大小不能超过2MB')
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
const formData = new FormData()
|
|
||||||
formData.append('file', file)
|
|
||||||
|
|
||||||
const res = await service({
|
|
||||||
url: '/fileUploadAndDownload/upload',
|
|
||||||
method: 'post',
|
|
||||||
data: formData,
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'multipart/form-data'
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
if (res.code === 0 && res.data?.file?.url) {
|
|
||||||
emit('update:modelValue', res.data.file.url)
|
|
||||||
ElMessage.success('头像上传成功')
|
|
||||||
} else {
|
|
||||||
ElMessage.error(res.msg || '上传失败')
|
|
||||||
}
|
|
||||||
} catch {
|
|
||||||
ElMessage.error('头像上传失败,请重试')
|
|
||||||
} finally {
|
|
||||||
// 清空input,确保可以重复选择同一文件
|
|
||||||
e.target.value = ''
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.profile-avatar {
|
|
||||||
img {
|
|
||||||
@apply transition-transform duration-300;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
img {
|
|
||||||
@apply scale-110;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
@@ -54,7 +54,8 @@
|
|||||||
const options = reactive([])
|
const options = reactive([])
|
||||||
const deepMenus = (menus) => {
|
const deepMenus = (menus) => {
|
||||||
const arr = []
|
const arr = []
|
||||||
menus.forEach((menu) => {
|
menus?.forEach((menu) => {
|
||||||
|
if (!menu?.children) return
|
||||||
if (menu.children && menu.children.length > 0) {
|
if (menu.children && menu.children.length > 0) {
|
||||||
arr.push(...deepMenus(menu.children))
|
arr.push(...deepMenus(menu.children))
|
||||||
} else {
|
} else {
|
||||||
@@ -77,7 +78,7 @@
|
|||||||
label: '跳转',
|
label: '跳转',
|
||||||
children: []
|
children: []
|
||||||
}
|
}
|
||||||
const menus = deepMenus(routerStore.asyncRouters[0].children)
|
const menus = deepMenus(routerStore.asyncRouters[0]?.children || [])
|
||||||
option.children.push(...menus)
|
option.children.push(...menus)
|
||||||
options.push(option)
|
options.push(option)
|
||||||
}
|
}
|
||||||
|
@@ -1,59 +1,68 @@
|
|||||||
<template>
|
<template>
|
||||||
<div
|
<div
|
||||||
class="w-40 h-40 relative rounded border border-dashed border-gray-300 overflow-hidden cursor-pointer group"
|
class="w-40 h-40 relative rounded border border-dashed border-gray-300 cursor-pointer group"
|
||||||
|
:class="rounded ? 'rounded-full' : ''"
|
||||||
>
|
>
|
||||||
<el-icon
|
<div class="w-full h-full overflow-hidden" :class="rounded ? 'rounded-full' : ''">
|
||||||
v-if="isVideoExt(model || '')"
|
<el-icon
|
||||||
:size="32"
|
v-if="isVideoExt(model || '')"
|
||||||
class="absolute top-[calc(50%-16px)] left-[calc(50%-16px)]"
|
:size="32"
|
||||||
>
|
class="absolute top-[calc(50%-16px)] left-[calc(50%-16px)]"
|
||||||
<VideoPlay />
|
>
|
||||||
</el-icon>
|
<VideoPlay />
|
||||||
<video
|
</el-icon>
|
||||||
v-if="isVideoExt(model || '')"
|
<video
|
||||||
class="w-full h-full object-cover"
|
v-if="isVideoExt(model || '')"
|
||||||
muted
|
class="w-full h-full object-cover"
|
||||||
preload="metadata"
|
muted
|
||||||
>
|
preload="metadata"
|
||||||
<source :src="getUrl(model) + '#t=1'" />
|
>
|
||||||
</video>
|
<source :src="getUrl(model) + '#t=1'" />
|
||||||
|
</video>
|
||||||
|
|
||||||
<img
|
<el-image
|
||||||
v-if="model && !isVideoExt(model)"
|
v-if="model && !isVideoExt(model)"
|
||||||
class="w-full h-full"
|
class="w-full h-full"
|
||||||
:src="getUrl(model)"
|
:src="imgUrl"
|
||||||
alt="图片"
|
:preview-src-list="srcList"
|
||||||
/>
|
fit="cover"
|
||||||
<div
|
/>
|
||||||
v-if="model"
|
<div
|
||||||
class="left-0 top-0 hidden text-gray-600 group-hover:bg-gray-600 group-hover:bg-opacity-30 w-full h-full group-hover:flex justify-center items-center absolute z-10"
|
v-else
|
||||||
@click="deleteItem"
|
class="text-gray-600 group-hover:bg-gray-200 group-hover:opacity-60 w-full h-full flex justify-center items-center"
|
||||||
>
|
@click="chooseItem"
|
||||||
<el-icon>
|
>
|
||||||
<delete />
|
<el-icon>
|
||||||
</el-icon>
|
<plus />
|
||||||
删除
|
</el-icon>
|
||||||
|
上传
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<!-- 删除按钮在外层容器中 -->
|
||||||
<div
|
<div
|
||||||
v-else
|
v-if="model"
|
||||||
class="text-gray-600 group-hover:bg-gray-400 w-full h-full flex justify-center items-center"
|
class="right-0 top-0 hidden text-gray-400 group-hover:flex justify-center items-center absolute z-10"
|
||||||
@click="chooseItem"
|
@click="deleteItem"
|
||||||
>
|
>
|
||||||
<el-icon>
|
<el-icon :size="24">
|
||||||
<plus />
|
<CircleCloseFilled />
|
||||||
</el-icon>
|
</el-icon>
|
||||||
上传
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script setup>
|
<script setup>
|
||||||
import { getUrl, isVideoExt } from '@/utils/image'
|
import { getUrl, isVideoExt } from '@/utils/image'
|
||||||
import { Delete, Plus } from '@element-plus/icons-vue'
|
import { CircleCloseFilled, Plus } from '@element-plus/icons-vue'
|
||||||
|
import { computed } from 'vue'
|
||||||
|
|
||||||
defineProps({
|
const props = defineProps({
|
||||||
model: {
|
model: {
|
||||||
default: '',
|
default: '',
|
||||||
type: String
|
type: String
|
||||||
|
},
|
||||||
|
rounded: {
|
||||||
|
default: false,
|
||||||
|
type: Boolean
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -66,4 +75,12 @@
|
|||||||
const deleteItem = () => {
|
const deleteItem = () => {
|
||||||
emits('deleteItem')
|
emits('deleteItem')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const imgUrl = computed(() => {
|
||||||
|
return getUrl(props.model)
|
||||||
|
})
|
||||||
|
|
||||||
|
const srcList = computed(() => {
|
||||||
|
return imgUrl.value ? [imgUrl.value] : []
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
@@ -1,290 +1,452 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<selectComponent
|
<selectComponent :rounded="rounded" v-if="!props.multiple" :model="model" @chooseItem="openChooseImg" @deleteItem="openChooseImg" />
|
||||||
v-if="!props.multiple"
|
|
||||||
:model="model"
|
|
||||||
@chooseItem="openChooseImg"
|
|
||||||
@deleteItem="openChooseImg"
|
|
||||||
/>
|
|
||||||
<div v-else class="w-full gap-4 flex flex-wrap">
|
<div v-else class="w-full gap-4 flex flex-wrap">
|
||||||
<selectComponent
|
<selectComponent :rounded="rounded" v-for="(item, index) in model" :key="index" :model="item" @chooseItem="openChooseImg"
|
||||||
v-for="(item, index) in model"
|
@deleteItem="deleteImg(index)"
|
||||||
:key="index"
|
|
||||||
:model="item"
|
|
||||||
@chooseItem="openChooseImg"
|
|
||||||
@deleteItem="deleteImg(index)"
|
|
||||||
/>
|
/>
|
||||||
<selectComponent
|
<selectComponent :rounded="rounded" v-if="model.length < props.maxUpdateCount || props.maxUpdateCount === 0"
|
||||||
v-if="
|
@chooseItem="openChooseImg" @deleteItem="openChooseImg"
|
||||||
model?.length < props.maxUpdateCount || props.maxUpdateCount === 0
|
|
||||||
"
|
|
||||||
@chooseItem="openChooseImg"
|
|
||||||
@deleteItem="openChooseImg"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<el-drawer v-model="drawer" title="媒体库" :size="appStore.drawerSize">
|
<el-drawer v-model="drawer" title="媒体库" :size="880">
|
||||||
<warning-bar title="点击“文件名/备注”可以编辑文件名或者备注内容。" />
|
<div class="flex">
|
||||||
<div class="gva-btn-list gap-2">
|
<div class="w-64" style="border-right: solid 1px var(--el-border-color);">
|
||||||
<upload-common :image-common="imageCommon" @on-success="getImageList" />
|
<el-scrollbar style="height: calc(100vh - 110px)">
|
||||||
<upload-image
|
<el-tree
|
||||||
:image-url="imageUrl"
|
:data="categories"
|
||||||
:file-size="512"
|
node-key="id"
|
||||||
:max-w-h="1080"
|
:props="defaultProps"
|
||||||
@on-success="getImageList"
|
@node-click="handleNodeClick"
|
||||||
/>
|
default-expand-all
|
||||||
<el-input
|
|
||||||
v-model="search.keyword"
|
|
||||||
class="keyword"
|
|
||||||
placeholder="请输入文件名或备注"
|
|
||||||
/>
|
|
||||||
<el-button type="primary" icon="search" @click="getImageList">
|
|
||||||
查询
|
|
||||||
</el-button>
|
|
||||||
</div>
|
|
||||||
<div class="flex flex-wrap gap-4">
|
|
||||||
<div v-for="(item, key) in picList" :key="key" class="w-40">
|
|
||||||
<div
|
|
||||||
class="w-40 h-40 border rounded overflow-hidden border-dashed border-gray-300 cursor-pointer relative group"
|
|
||||||
>
|
|
||||||
<el-image
|
|
||||||
:key="key"
|
|
||||||
:src="getUrl(item.url)"
|
|
||||||
fit="cover"
|
|
||||||
class="w-full h-full relative"
|
|
||||||
@click="chooseImg(item.url)"
|
|
||||||
>
|
>
|
||||||
<template #error>
|
<template #default="{ node, data }">
|
||||||
<el-icon
|
<div class="w-36" :class="search.classId === data.ID ? 'text-blue-500 font-bold' : ''">{{ data.name }}
|
||||||
v-if="isVideoExt(item.url || '')"
|
</div>
|
||||||
:size="32"
|
<el-dropdown>
|
||||||
class="absolute top-[calc(50%-16px)] left-[calc(50%-16px)]"
|
<el-icon class="ml-3 text-right" v-if="data.ID > 0"><MoreFilled /></el-icon>
|
||||||
>
|
<el-icon class="ml-3 text-right mt-1" v-else><Plus /></el-icon>
|
||||||
<VideoPlay />
|
<template #dropdown>
|
||||||
</el-icon>
|
<el-dropdown-menu>
|
||||||
<video
|
<el-dropdown-item @click="addCategoryFun(data)">添加分类</el-dropdown-item>
|
||||||
v-if="isVideoExt(item.url || '')"
|
<el-dropdown-item @click="editCategory(data)" v-if="data.ID > 0">编辑分类</el-dropdown-item>
|
||||||
class="w-full h-full object-cover"
|
<el-dropdown-item @click="deleteCategoryFun(data.ID)" v-if="data.ID > 0">删除分类</el-dropdown-item>
|
||||||
muted
|
</el-dropdown-menu>
|
||||||
preload="metadata"
|
</template>
|
||||||
@click="chooseImg(item.url)"
|
</el-dropdown>
|
||||||
>
|
</template>
|
||||||
<source :src="getUrl(item.url) + '#t=1'" />
|
</el-tree>
|
||||||
您的浏览器不支持视频播放
|
</el-scrollbar>
|
||||||
</video>
|
</div>
|
||||||
<div
|
<div class="ml-4 image-library">
|
||||||
v-else
|
<warning-bar title="点击“文件名”可以编辑;选择的类别即是上传的类别。" />
|
||||||
class="w-full h-full object-cover flex items-center justify-center"
|
<div class="gva-btn-list gap-2">
|
||||||
>
|
<el-button @click="useSelectedImages" type="danger" :disabled="selectedImages.length === 0" :icon="ArrowLeftBold">确认所选</el-button>
|
||||||
<el-icon :size="32">
|
<upload-common :image-common="imageCommon" :classId="search.classId" @on-success="onSuccess" />
|
||||||
<icon-picture />
|
<upload-image :image-url="imageUrl" :file-size="2048" :max-w-h="1080" :classId="search.classId" @on-success="onSuccess" />
|
||||||
|
<el-input v-model.trim="search.keyword" class="w-52" placeholder="请输入文件名或备注" clearable />
|
||||||
|
<el-button type="primary" icon="search" @click="onSubmit"> 查询</el-button>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-wrap gap-4">
|
||||||
|
<div v-for="(item,key) in picList" :key="key" class="w-40">
|
||||||
|
<div class="w-40 h-40 border rounded overflow-hidden border-dashed border-gray-300 cursor-pointer relative group">
|
||||||
|
<el-image :key="key" :src="getUrl(item.url)" fit="cover" class="w-full h-full relative" @click="toggleImageSelection(item)" :class="{ selected: isSelected(item) }">
|
||||||
|
<template #error>
|
||||||
|
<el-icon v-if="isVideoExt(item.url || '')" :size="32" class="absolute top-[calc(50%-16px)] left-[calc(50%-16px)]">
|
||||||
|
<VideoPlay />
|
||||||
|
</el-icon>
|
||||||
|
<video v-if="isVideoExt(item.url || '')"
|
||||||
|
class="w-full h-full object-cover"
|
||||||
|
muted
|
||||||
|
preload="metadata"
|
||||||
|
@click="toggleImageSelection(item)"
|
||||||
|
:class="{ selected: isSelected(item) }"
|
||||||
|
>
|
||||||
|
<source :src="getUrl(item.url) + '#t=1'">
|
||||||
|
您的浏览器不支持视频播放
|
||||||
|
</video>
|
||||||
|
<div v-else class="w-full h-full object-cover flex items-center justify-center">
|
||||||
|
<el-icon :size="32">
|
||||||
|
<icon-picture />
|
||||||
|
</el-icon>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-image>
|
||||||
|
<div class="absolute -right-1 top-1 w-8 h-8 group-hover:inline-block hidden" @click="deleteCheck(item)">
|
||||||
|
<el-icon :size="18">
|
||||||
|
<CloseBold />
|
||||||
</el-icon>
|
</el-icon>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</div>
|
||||||
</el-image>
|
<div class="overflow-hidden text-nowrap overflow-ellipsis text-center w-full cursor-pointer" @click="editFileNameFunc(item)">
|
||||||
<div
|
{{ item.name }}
|
||||||
class="absolute -right-1 top-1 w-8 h-8 group-hover:inline-block hidden"
|
</div>
|
||||||
@click="deleteCheck(item)"
|
|
||||||
>
|
|
||||||
<el-icon :size="16"><CircleClose /></el-icon>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<el-pagination
|
||||||
class="overflow-hidden text-nowrap overflow-ellipsis text-center w-full"
|
:current-page="page"
|
||||||
@click="editFileNameFunc(item)"
|
:page-size="pageSize"
|
||||||
>
|
:total="total"
|
||||||
{{ item.name }}
|
class="justify-center"
|
||||||
</div>
|
layout="total, prev, pager, next, jumper"
|
||||||
|
@current-change="handleCurrentChange"
|
||||||
|
@size-change="handleSizeChange"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<el-pagination
|
|
||||||
:current-page="page"
|
|
||||||
:page-size="pageSize"
|
|
||||||
:total="total"
|
|
||||||
:style="{ 'justify-content': 'center' }"
|
|
||||||
layout="total, prev, pager, next, jumper"
|
|
||||||
@current-change="handleCurrentChange"
|
|
||||||
@size-change="handleSizeChange"
|
|
||||||
/>
|
|
||||||
</el-drawer>
|
</el-drawer>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- 添加分类弹窗 -->
|
||||||
|
<el-dialog v-model="categoryDialogVisible" @close="closeAddCategoryDialog" width="520"
|
||||||
|
:title="(categoryFormData.ID === 0 ? '添加' : '编辑') + '分类'"
|
||||||
|
draggable
|
||||||
|
>
|
||||||
|
<el-form ref="categoryForm" :rules="rules" :model="categoryFormData" label-width="80px">
|
||||||
|
<el-form-item label="上级分类">
|
||||||
|
<el-tree-select
|
||||||
|
v-model="categoryFormData.pid"
|
||||||
|
:data="categories"
|
||||||
|
check-strictly
|
||||||
|
:props="defaultProps"
|
||||||
|
:render-after-expand="false"
|
||||||
|
style="width: 240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="分类名称" prop="name">
|
||||||
|
<el-input v-model.trim="categoryFormData.name" placeholder="分类名称"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<template #footer>
|
||||||
|
<el-button @click="closeAddCategoryDialog">取消</el-button>
|
||||||
|
<el-button type="primary" @click="confirmAddCategory">确定</el-button>
|
||||||
|
</template>
|
||||||
|
</el-dialog>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { getUrl, isVideoExt } from '@/utils/image'
|
import { getUrl, isVideoExt } from '@/utils/image'
|
||||||
import { ref } from 'vue'
|
import { ref } from 'vue'
|
||||||
import {
|
import { getFileList, editFileName, deleteFile } from '@/api/fileUploadAndDownload'
|
||||||
getFileList,
|
import UploadImage from '@/components/upload/image.vue'
|
||||||
editFileName,
|
import UploadCommon from '@/components/upload/common.vue'
|
||||||
deleteFile
|
import WarningBar from '@/components/warningBar/warningBar.vue'
|
||||||
} from '@/api/fileUploadAndDownload'
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||||
import UploadImage from '@/components/upload/image.vue'
|
import {
|
||||||
import UploadCommon from '@/components/upload/common.vue'
|
ArrowLeftBold,
|
||||||
import WarningBar from '@/components/warningBar/warningBar.vue'
|
CloseBold,
|
||||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
MoreFilled,
|
||||||
import { Picture as IconPicture } from '@element-plus/icons-vue'
|
Picture as IconPicture,
|
||||||
import selectComponent from '@/components/selectImage/selectComponent.vue'
|
Plus,
|
||||||
import { useAppStore } from "@/pinia";
|
VideoPlay
|
||||||
|
} from '@element-plus/icons-vue'
|
||||||
|
import selectComponent from '@/components/selectImage/selectComponent.vue'
|
||||||
|
import { addCategory, deleteCategory, getCategoryList } from '@/api/attachmentCategory'
|
||||||
|
|
||||||
const appStore = useAppStore()
|
const imageUrl = ref('')
|
||||||
|
const imageCommon = ref('')
|
||||||
|
|
||||||
const imageUrl = ref('')
|
const search = ref({
|
||||||
const imageCommon = ref('')
|
keyword: null,
|
||||||
|
classId: 0
|
||||||
|
})
|
||||||
|
const page = ref(1)
|
||||||
|
const total = ref(0)
|
||||||
|
const pageSize = ref(20)
|
||||||
|
|
||||||
const search = ref({})
|
const model = defineModel({ type: [String, Array] })
|
||||||
const page = ref(1)
|
|
||||||
const total = ref(0)
|
|
||||||
const pageSize = ref(20)
|
|
||||||
|
|
||||||
const model = defineModel({ type: [String, Array] })
|
const props = defineProps({
|
||||||
|
multiple: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
fileType: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
|
},
|
||||||
|
maxUpdateCount: {
|
||||||
|
type: Number,
|
||||||
|
default: 0
|
||||||
|
},
|
||||||
|
rounded: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
const props = defineProps({
|
const deleteImg = (index) => {
|
||||||
multiple: {
|
model.value.splice(index, 1)
|
||||||
type: Boolean,
|
}
|
||||||
default: false
|
|
||||||
},
|
const handleSizeChange = (val) => {
|
||||||
fileType: {
|
pageSize.value = val
|
||||||
type: String,
|
getImageList()
|
||||||
default: ''
|
}
|
||||||
},
|
|
||||||
maxUpdateCount: {
|
const handleCurrentChange = (val) => {
|
||||||
type: Number,
|
page.value = val
|
||||||
default: 0
|
getImageList()
|
||||||
|
}
|
||||||
|
|
||||||
|
const onSubmit = () => {
|
||||||
|
search.value.classId = 0
|
||||||
|
page.value = 1
|
||||||
|
getImageList()
|
||||||
|
}
|
||||||
|
|
||||||
|
const editFileNameFunc = async(row) => {
|
||||||
|
ElMessageBox.prompt('请输入文件名或者备注', '编辑', {
|
||||||
|
confirmButtonText: '确定',
|
||||||
|
cancelButtonText: '取消',
|
||||||
|
inputPattern: /\S/,
|
||||||
|
inputErrorMessage: '不能为空',
|
||||||
|
inputValue: row.name
|
||||||
|
}).then(async({ value }) => {
|
||||||
|
row.name = value
|
||||||
|
const res = await editFileName(row)
|
||||||
|
if (res.code === 0) {
|
||||||
|
ElMessage({
|
||||||
|
type: 'success',
|
||||||
|
message: '编辑成功!'
|
||||||
|
})
|
||||||
|
await getImageList()
|
||||||
}
|
}
|
||||||
})
|
}).catch(() => {
|
||||||
|
ElMessage({
|
||||||
const deleteImg = (index) => {
|
type: 'info',
|
||||||
model.value.splice(index, 1)
|
message: '取消修改'
|
||||||
}
|
|
||||||
|
|
||||||
const handleSizeChange = (val) => {
|
|
||||||
pageSize.value = val
|
|
||||||
getImageList()
|
|
||||||
}
|
|
||||||
|
|
||||||
const handleCurrentChange = (val) => {
|
|
||||||
page.value = val
|
|
||||||
getImageList()
|
|
||||||
}
|
|
||||||
|
|
||||||
const editFileNameFunc = async (row) => {
|
|
||||||
ElMessageBox.prompt('请输入文件名或者备注', '编辑', {
|
|
||||||
confirmButtonText: '确定',
|
|
||||||
cancelButtonText: '取消',
|
|
||||||
inputPattern: /\S/,
|
|
||||||
inputErrorMessage: '不能为空',
|
|
||||||
inputValue: row.name
|
|
||||||
})
|
})
|
||||||
.then(async ({ value }) => {
|
})
|
||||||
row.name = value
|
}
|
||||||
const res = await editFileName(row)
|
|
||||||
if (res.code === 0) {
|
|
||||||
ElMessage({
|
|
||||||
type: 'success',
|
|
||||||
message: '编辑成功!'
|
|
||||||
})
|
|
||||||
getImageList()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.catch(() => {
|
|
||||||
ElMessage({
|
|
||||||
type: 'info',
|
|
||||||
message: '取消修改'
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
const drawer = ref(false)
|
const drawer = ref(false)
|
||||||
const picList = ref([])
|
const picList = ref([])
|
||||||
|
|
||||||
const imageTypeList = ['png', 'jpg', 'jpeg', 'gif', 'bmp', 'webp']
|
const imageTypeList = ['png', 'jpg', 'jpeg', 'gif', 'bmp', 'webp', 'svg']
|
||||||
const videoTyteList = [
|
const videoTypeList = ['mp4', 'avi', 'rmvb', 'rm', 'asf', 'divx', 'mpg', 'mpeg', 'mpe', 'wmv', 'mkv', 'vob']
|
||||||
'mp4',
|
|
||||||
'avi',
|
|
||||||
'rmvb',
|
|
||||||
'rm',
|
|
||||||
'asf',
|
|
||||||
'divx',
|
|
||||||
'mpg',
|
|
||||||
'mpeg',
|
|
||||||
'mpe',
|
|
||||||
'wmv',
|
|
||||||
'mkv',
|
|
||||||
'vob'
|
|
||||||
]
|
|
||||||
|
|
||||||
const listObj = {
|
const listObj = {
|
||||||
image: imageTypeList,
|
image: imageTypeList,
|
||||||
video: videoTyteList
|
video: videoTypeList
|
||||||
}
|
}
|
||||||
|
|
||||||
const chooseImg = (url) => {
|
const chooseImg = (url) => {
|
||||||
if (props.fileType) {
|
if (props.fileType) {
|
||||||
const typeSuccess = listObj[props.fileType].some((item) => {
|
const typeSuccess = listObj[props.fileType].some(item => {
|
||||||
if (url?.toLowerCase().includes(item)) {
|
if (url?.toLowerCase().includes(item)) {
|
||||||
return true
|
return true
|
||||||
}
|
|
||||||
})
|
|
||||||
if (!typeSuccess) {
|
|
||||||
ElMessage({
|
|
||||||
type: 'error',
|
|
||||||
message: '当前类型不支持使用'
|
|
||||||
})
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
}
|
})
|
||||||
if (props.multiple) {
|
if (!typeSuccess) {
|
||||||
model.value.push(url)
|
ElMessage({
|
||||||
} else {
|
type: 'error',
|
||||||
model.value = url
|
message: '当前类型不支持使用'
|
||||||
}
|
})
|
||||||
drawer.value = false
|
|
||||||
}
|
|
||||||
|
|
||||||
const openChooseImg = async () => {
|
|
||||||
if (model.value && !props.multiple) {
|
|
||||||
model.value = ''
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
await getImageList()
|
|
||||||
drawer.value = true
|
|
||||||
}
|
}
|
||||||
|
//if (props.multiple) {
|
||||||
|
// model.value.push(url)
|
||||||
|
//} else {
|
||||||
|
model.value = url
|
||||||
|
//}
|
||||||
|
drawer.value = false
|
||||||
|
}
|
||||||
|
|
||||||
const getImageList = async () => {
|
const openChooseImg = async() => {
|
||||||
const res = await getFileList({
|
if (model.value && !props.multiple) {
|
||||||
page: page.value,
|
model.value = ''
|
||||||
pageSize: pageSize.value,
|
return
|
||||||
...search.value
|
}
|
||||||
})
|
await getImageList()
|
||||||
|
await fetchCategories()
|
||||||
|
drawer.value = true
|
||||||
|
}
|
||||||
|
|
||||||
|
const getImageList = async() => {
|
||||||
|
const res = await getFileList({ page: page.value, pageSize: pageSize.value, ...search.value })
|
||||||
|
if (res.code === 0) {
|
||||||
|
picList.value = res.data.list
|
||||||
|
total.value = res.data.total
|
||||||
|
page.value = res.data.page
|
||||||
|
pageSize.value = res.data.pageSize
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const deleteCheck = (item) => {
|
||||||
|
ElMessageBox.confirm('是否删除该文件', '提示', {
|
||||||
|
confirmButtonText: '确定',
|
||||||
|
cancelButtonText: '取消',
|
||||||
|
type: 'warning'
|
||||||
|
}).then(async() => {
|
||||||
|
const res = await deleteFile(item)
|
||||||
if (res.code === 0) {
|
if (res.code === 0) {
|
||||||
picList.value = res.data.list
|
ElMessage({
|
||||||
total.value = res.data.total
|
type: 'success',
|
||||||
page.value = res.data.page
|
message: '删除成功!'
|
||||||
pageSize.value = res.data.pageSize
|
})
|
||||||
|
await getImageList()
|
||||||
}
|
}
|
||||||
}
|
}).catch(() => {
|
||||||
|
ElMessage({
|
||||||
const deleteCheck = (item) => {
|
type: 'info',
|
||||||
ElMessageBox.confirm('是否删除该文件', '提示', {
|
message: '已取消删除'
|
||||||
confirmButtonText: '确定',
|
|
||||||
cancelButtonText: '取消',
|
|
||||||
type: 'warning'
|
|
||||||
})
|
})
|
||||||
.then(async () => {
|
})
|
||||||
const res = await deleteFile(item)
|
}
|
||||||
if (res.code === 0) {
|
|
||||||
ElMessage({
|
const defaultProps = {
|
||||||
type: 'success',
|
children: 'children',
|
||||||
message: '删除成功!'
|
label: 'name',
|
||||||
})
|
value: 'ID'
|
||||||
getImageList()
|
}
|
||||||
}
|
|
||||||
})
|
const categories = ref([])
|
||||||
.catch(() => {
|
const fetchCategories = async() => {
|
||||||
ElMessage({
|
const res = await getCategoryList()
|
||||||
type: 'info',
|
let data = {
|
||||||
message: '已取消删除'
|
name: '全部分类',
|
||||||
})
|
ID: 0,
|
||||||
})
|
pid: 0,
|
||||||
|
children:[]
|
||||||
}
|
}
|
||||||
|
if (res.code === 0) {
|
||||||
|
categories.value = res.data || []
|
||||||
|
categories.value.unshift(data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleNodeClick = (node) => {
|
||||||
|
search.value.keyword = null
|
||||||
|
search.value.classId = node.ID
|
||||||
|
page.value = 1
|
||||||
|
getImageList()
|
||||||
|
}
|
||||||
|
|
||||||
|
const onSuccess = () => {
|
||||||
|
search.value.keyword = null
|
||||||
|
page.value = 1
|
||||||
|
getImageList()
|
||||||
|
}
|
||||||
|
|
||||||
|
const categoryDialogVisible = ref(false)
|
||||||
|
const categoryFormData = ref({
|
||||||
|
ID: 0,
|
||||||
|
pid: 0,
|
||||||
|
name: ''
|
||||||
|
})
|
||||||
|
|
||||||
|
const categoryForm = ref(null)
|
||||||
|
const rules = ref({
|
||||||
|
name: [
|
||||||
|
{ required: true, message: '请输入分类名称', trigger: 'blur' },
|
||||||
|
{ max: 20, message: '最多20位字符', trigger: 'blur' }
|
||||||
|
]
|
||||||
|
})
|
||||||
|
|
||||||
|
const addCategoryFun = (category) => {
|
||||||
|
categoryDialogVisible.value = true
|
||||||
|
categoryFormData.value.ID = 0
|
||||||
|
categoryFormData.value.pid = category.ID
|
||||||
|
}
|
||||||
|
|
||||||
|
const editCategory = (category) => {
|
||||||
|
categoryFormData.value = {
|
||||||
|
ID: category.ID,
|
||||||
|
pid: category.pid,
|
||||||
|
name: category.name
|
||||||
|
}
|
||||||
|
categoryDialogVisible.value = true
|
||||||
|
}
|
||||||
|
|
||||||
|
const deleteCategoryFun = async(id) => {
|
||||||
|
const res = await deleteCategory({ id: id })
|
||||||
|
if (res.code === 0) {
|
||||||
|
ElMessage.success({ type: 'success', message: '删除成功' })
|
||||||
|
await fetchCategories()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const confirmAddCategory = async() => {
|
||||||
|
categoryForm.value.validate(async valid => {
|
||||||
|
if (valid) {
|
||||||
|
const res = await addCategory(categoryFormData.value)
|
||||||
|
if (res.code === 0) {
|
||||||
|
ElMessage({ type: 'success', message: '操作成功' })
|
||||||
|
await fetchCategories()
|
||||||
|
closeAddCategoryDialog()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const closeAddCategoryDialog = () => {
|
||||||
|
categoryDialogVisible.value = false
|
||||||
|
categoryFormData.value = {
|
||||||
|
ID: 0,
|
||||||
|
pid: 0,
|
||||||
|
name: ''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const selectedImages = ref([])
|
||||||
|
|
||||||
|
const toggleImageSelection = (item) => {
|
||||||
|
if (props.multiple === false) {
|
||||||
|
chooseImg(item.url)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const index = selectedImages.value.findIndex(img => img.ID === item.ID)
|
||||||
|
if (index > -1) {
|
||||||
|
selectedImages.value.splice(index, 1)
|
||||||
|
} else {
|
||||||
|
selectedImages.value.push(item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const isSelected = (item) => {
|
||||||
|
return selectedImages.value.some(img => img.ID === item.ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
const useSelectedImages = () => {
|
||||||
|
selectedImages.value.forEach((item) => {
|
||||||
|
model.value.push(item.url)
|
||||||
|
})
|
||||||
|
drawer.value = false
|
||||||
|
selectedImages.value = []
|
||||||
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
<style scoped>
|
||||||
|
.selected {
|
||||||
|
border: 3px solid #409eff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.image-library {
|
||||||
|
width: 605px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.selected:before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
border: 10px solid #409eff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.selected:after {
|
||||||
|
content: "";
|
||||||
|
width: 9px;
|
||||||
|
height: 14px;
|
||||||
|
position: absolute;
|
||||||
|
left: 6px;
|
||||||
|
top: 0;
|
||||||
|
border: 3px solid #fff;
|
||||||
|
border-top-color: transparent;
|
||||||
|
border-left-color: transparent;
|
||||||
|
transform: rotate(45deg);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
@@ -6,10 +6,11 @@
|
|||||||
:on-error="uploadError"
|
:on-error="uploadError"
|
||||||
:on-success="uploadSuccess"
|
:on-success="uploadSuccess"
|
||||||
:show-file-list="false"
|
:show-file-list="false"
|
||||||
|
:data="{'classId': props.classId}"
|
||||||
multiple
|
multiple
|
||||||
class="upload-btn"
|
class="upload-btn"
|
||||||
>
|
>
|
||||||
<el-button type="primary">普通上传</el-button>
|
<el-button type="primary" :icon="Upload">普通上传</el-button>
|
||||||
</el-upload>
|
</el-upload>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -19,11 +20,19 @@
|
|||||||
import { ElMessage } from 'element-plus'
|
import { ElMessage } from 'element-plus'
|
||||||
import { isVideoMime, isImageMime } from '@/utils/image'
|
import { isVideoMime, isImageMime } from '@/utils/image'
|
||||||
import { getBaseUrl } from '@/utils/format'
|
import { getBaseUrl } from '@/utils/format'
|
||||||
|
import {Upload} from "@element-plus/icons-vue";
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: 'UploadCommon'
|
name: 'UploadCommon'
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
classId: {
|
||||||
|
type: Number,
|
||||||
|
default: 0
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
const emit = defineEmits(['on-success'])
|
const emit = defineEmits(['on-success'])
|
||||||
|
|
||||||
const fullscreenLoading = ref(false)
|
const fullscreenLoading = ref(false)
|
||||||
|
@@ -6,8 +6,9 @@
|
|||||||
:on-success="handleImageSuccess"
|
:on-success="handleImageSuccess"
|
||||||
:before-upload="beforeImageUpload"
|
:before-upload="beforeImageUpload"
|
||||||
:multiple="false"
|
:multiple="false"
|
||||||
|
:data="{'classId': props.classId}"
|
||||||
>
|
>
|
||||||
<el-button type="primary">压缩上传</el-button>
|
<el-button type="primary" :icon="Upload">压缩上传</el-button>
|
||||||
</el-upload>
|
</el-upload>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -16,6 +17,7 @@
|
|||||||
import ImageCompress from '@/utils/image'
|
import ImageCompress from '@/utils/image'
|
||||||
import { ElMessage } from 'element-plus'
|
import { ElMessage } from 'element-plus'
|
||||||
import { getBaseUrl } from '@/utils/format'
|
import { getBaseUrl } from '@/utils/format'
|
||||||
|
import {Upload} from "@element-plus/icons-vue";
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: 'UploadImage'
|
name: 'UploadImage'
|
||||||
@@ -34,6 +36,10 @@
|
|||||||
maxWH: {
|
maxWH: {
|
||||||
type: Number,
|
type: Number,
|
||||||
default: 1920 // 图片长宽上限
|
default: 1920 // 图片长宽上限
|
||||||
|
},
|
||||||
|
classId: {
|
||||||
|
type: Number,
|
||||||
|
default: 0
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@@ -27,6 +27,7 @@
|
|||||||
"/src/view/layout/aside/normalMode.vue": "GvaAside",
|
"/src/view/layout/aside/normalMode.vue": "GvaAside",
|
||||||
"/src/view/layout/header/index.vue": "Index",
|
"/src/view/layout/header/index.vue": "Index",
|
||||||
"/src/view/layout/header/tools.vue": "Tools",
|
"/src/view/layout/header/tools.vue": "Tools",
|
||||||
|
"/src/view/layout/iframe.vue": "GvaLayoutIframe",
|
||||||
"/src/view/layout/index.vue": "GvaLayout",
|
"/src/view/layout/index.vue": "GvaLayout",
|
||||||
"/src/view/layout/screenfull/index.vue": "Screenfull",
|
"/src/view/layout/screenfull/index.vue": "Screenfull",
|
||||||
"/src/view/layout/search/search.vue": "BtnBox",
|
"/src/view/layout/search/search.vue": "BtnBox",
|
||||||
|
@@ -4,134 +4,143 @@ import getPageTitle from '@/utils/page'
|
|||||||
import router from '@/router'
|
import router from '@/router'
|
||||||
import Nprogress from 'nprogress'
|
import Nprogress from 'nprogress'
|
||||||
import 'nprogress/nprogress.css'
|
import 'nprogress/nprogress.css'
|
||||||
Nprogress.configure({ showSpinner: false, ease: 'ease', speed: 500 })
|
|
||||||
|
|
||||||
const whiteList = ['Login', 'Init']
|
// 配置 NProgress
|
||||||
|
Nprogress.configure({
|
||||||
|
showSpinner: false,
|
||||||
|
ease: 'ease',
|
||||||
|
speed: 500
|
||||||
|
})
|
||||||
|
|
||||||
const getRouter = async (userStore) => {
|
// 白名单路由
|
||||||
const routerStore = useRouterStore()
|
const WHITE_LIST = ['Login', 'Init']
|
||||||
await routerStore.SetAsyncRouter()
|
|
||||||
await userStore.GetUserInfo()
|
|
||||||
const asyncRouters = routerStore.asyncRouters
|
|
||||||
asyncRouters.forEach((asyncRouter) => {
|
|
||||||
router.addRoute(asyncRouter)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
const removeLoading = () => {
|
// 处理路由加载
|
||||||
const element = document.getElementById('gva-loading-box')
|
const setupRouter = async (userStore) => {
|
||||||
if (element) {
|
try {
|
||||||
element.remove()
|
const routerStore = useRouterStore()
|
||||||
|
await Promise.all([routerStore.SetAsyncRouter(), userStore.GetUserInfo()])
|
||||||
|
|
||||||
|
routerStore.asyncRouters.forEach((route) => router.addRoute(route))
|
||||||
|
return true
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Setup router failed:', error)
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function handleKeepAlive(to) {
|
// 移除加载动画
|
||||||
if (to.matched.some((item) => item.meta.keepAlive)) {
|
const removeLoading = () => {
|
||||||
if (to.matched && to.matched.length > 2) {
|
const element = document.getElementById('gva-loading-box')
|
||||||
for (let i = 1; i < to.matched.length; i++) {
|
element?.remove()
|
||||||
const element = to.matched[i - 1]
|
}
|
||||||
if (element.name === 'layout') {
|
|
||||||
to.matched.splice(i, 1)
|
// 处理组件缓存
|
||||||
await handleKeepAlive(to)
|
const handleKeepAlive = async (to) => {
|
||||||
}
|
if (!to.matched.some((item) => item.meta.keepAlive)) return
|
||||||
// 如果没有按需加载完成则等待加载
|
|
||||||
if (typeof element.components.default === 'function') {
|
if (to.matched?.length > 2) {
|
||||||
await element.components.default()
|
for (let i = 1; i < to.matched.length; i++) {
|
||||||
await handleKeepAlive(to)
|
const element = to.matched[i - 1]
|
||||||
}
|
|
||||||
|
if (element.name === 'layout') {
|
||||||
|
to.matched.splice(i, 1)
|
||||||
|
await handleKeepAlive(to)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof element.components.default === 'function') {
|
||||||
|
await element.components.default()
|
||||||
|
await handleKeepAlive(to)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 处理路由重定向
|
||||||
|
const handleRedirect = (to, userStore) => {
|
||||||
|
if (router.hasRoute(userStore.userInfo.authority.defaultRouter)) {
|
||||||
|
return { ...to, replace: true }
|
||||||
|
}
|
||||||
|
return { path: '/layout/404' }
|
||||||
|
}
|
||||||
|
|
||||||
|
// 路由守卫
|
||||||
router.beforeEach(async (to, from) => {
|
router.beforeEach(async (to, from) => {
|
||||||
const routerStore = useRouterStore()
|
|
||||||
Nprogress.start()
|
|
||||||
const userStore = useUserStore()
|
const userStore = useUserStore()
|
||||||
to.meta.matched = [...to.matched]
|
const routerStore = useRouterStore()
|
||||||
handleKeepAlive(to)
|
|
||||||
const token = userStore.token
|
const token = userStore.token
|
||||||
// 在白名单中的判断情况
|
|
||||||
|
Nprogress.start()
|
||||||
|
|
||||||
|
// 处理元数据和缓存
|
||||||
|
to.meta.matched = [...to.matched]
|
||||||
|
await handleKeepAlive(to)
|
||||||
|
|
||||||
|
// 设置页面标题
|
||||||
document.title = getPageTitle(to.meta.title, to)
|
document.title = getPageTitle(to.meta.title, to)
|
||||||
|
|
||||||
if (to.meta.client) {
|
if (to.meta.client) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
if (whiteList.indexOf(to.name) > -1) {
|
|
||||||
if (token) {
|
// 白名单路由处理
|
||||||
if (!routerStore.asyncRouterFlag && whiteList.indexOf(from.name) < 0) {
|
if (WHITE_LIST.includes(to.name)) {
|
||||||
await getRouter(userStore)
|
if (
|
||||||
}
|
token &&
|
||||||
// token 可以解析但是却是不存在的用户 id 或角色 id 会导致无限调用
|
!routerStore.asyncRouterFlag &&
|
||||||
if (userStore.userInfo?.authority?.defaultRouter != null) {
|
!WHITE_LIST.includes(from.name)
|
||||||
if (router.hasRoute(userStore.userInfo.authority.defaultRouter)) {
|
) {
|
||||||
return { name: userStore.userInfo.authority.defaultRouter }
|
await setupRouter(userStore)
|
||||||
} else {
|
|
||||||
return { path: '/layout/404' }
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// 强制退出账号
|
|
||||||
userStore.ClearStorage()
|
|
||||||
return {
|
|
||||||
name: 'Login',
|
|
||||||
query: {
|
|
||||||
redirect: document.location.hash
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return true
|
|
||||||
}
|
}
|
||||||
} else {
|
return true
|
||||||
// 不在白名单中并且已经登录的时候
|
}
|
||||||
if (token) {
|
|
||||||
if (sessionStorage.getItem('needToHome') === 'true') {
|
// 需要登录的路由处理
|
||||||
sessionStorage.removeItem('needToHome')
|
if (token) {
|
||||||
return { path: '/' }
|
// 处理需要跳转到首页的情况
|
||||||
}
|
if (sessionStorage.getItem('needToHome') === 'true') {
|
||||||
// 添加flag防止多次获取动态路由和栈溢出
|
sessionStorage.removeItem('needToHome')
|
||||||
if (!routerStore.asyncRouterFlag && whiteList.indexOf(from.name) < 0) {
|
return { path: '/' }
|
||||||
await getRouter(userStore)
|
|
||||||
if (userStore.token) {
|
|
||||||
if (router.hasRoute(userStore.userInfo.authority.defaultRouter)) {
|
|
||||||
return { ...to, replace: true }
|
|
||||||
} else {
|
|
||||||
return { path: '/layout/404' }
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return {
|
|
||||||
name: 'Login',
|
|
||||||
query: { redirect: to.href }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (to.matched.length) {
|
|
||||||
return true
|
|
||||||
} else {
|
|
||||||
return { path: '/layout/404' }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// 不在白名单中并且未登录的时候
|
|
||||||
if (!token) {
|
// 处理异步路由
|
||||||
|
if (!routerStore.asyncRouterFlag && !WHITE_LIST.includes(from.name)) {
|
||||||
|
const setupSuccess = await setupRouter(userStore)
|
||||||
|
|
||||||
|
if (setupSuccess && userStore.token) {
|
||||||
|
return handleRedirect(to, userStore)
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
name: 'Login',
|
name: 'Login',
|
||||||
query: {
|
query: { redirect: to.href }
|
||||||
redirect: document.location.hash
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return to.matched.length ? true : { path: '/layout/404' }
|
||||||
|
}
|
||||||
|
|
||||||
|
// 未登录跳转登录页
|
||||||
|
return {
|
||||||
|
name: 'Login',
|
||||||
|
query: {
|
||||||
|
redirect: document.location.hash
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// 路由加载完成
|
||||||
router.afterEach(() => {
|
router.afterEach(() => {
|
||||||
// 路由加载完成后关闭进度条
|
document.querySelector('.main-cont.main-right')?.scrollTo(0, 0)
|
||||||
document.getElementsByClassName('main-cont main-right')[0]?.scrollTo(0, 0)
|
|
||||||
Nprogress.done()
|
Nprogress.done()
|
||||||
})
|
})
|
||||||
|
|
||||||
router.onError(() => {
|
// 路由错误处理
|
||||||
// 路由发生错误后销毁进度条
|
router.onError((error) => {
|
||||||
|
console.error('Router error:', error)
|
||||||
Nprogress.remove()
|
Nprogress.remove()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// 移除初始加载动画
|
||||||
removeLoading()
|
removeLoading()
|
||||||
|
31
web/src/pinia/modules/params.js
Normal file
31
web/src/pinia/modules/params.js
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
import { getSysParam } from '@/api/sysParams'
|
||||||
|
import { defineStore } from 'pinia'
|
||||||
|
import { ref } from 'vue'
|
||||||
|
|
||||||
|
export const useParamsStore = defineStore('params', () => {
|
||||||
|
const paramsMap = ref({})
|
||||||
|
|
||||||
|
const setParamsMap = (paramsRes) => {
|
||||||
|
paramsMap.value = { ...paramsMap.value, ...paramsRes }
|
||||||
|
}
|
||||||
|
|
||||||
|
const getParams = async(key) => {
|
||||||
|
if (paramsMap.value[key] && paramsMap.value[key].length) {
|
||||||
|
return paramsMap.value[key]
|
||||||
|
} else {
|
||||||
|
const res = await getSysParam({ key })
|
||||||
|
if (res.code === 0) {
|
||||||
|
const paramsRes = {}
|
||||||
|
paramsRes[key] = res.data.value
|
||||||
|
setParamsMap(paramsRes)
|
||||||
|
return paramsMap.value[key]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
paramsMap,
|
||||||
|
setParamsMap,
|
||||||
|
getParams
|
||||||
|
}
|
||||||
|
})
|
@@ -21,7 +21,7 @@ const routes = [
|
|||||||
closeTab: true
|
closeTab: true
|
||||||
},
|
},
|
||||||
component: () => import('@/view/error/index.vue')
|
component: () => import('@/view/error/index.vue')
|
||||||
}
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
const router = createRouter({
|
const router = createRouter({
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
import { useDictionaryStore } from '@/pinia/modules/dictionary'
|
import { useDictionaryStore } from '@/pinia/modules/dictionary'
|
||||||
import { getSysParam } from '@/api/sysParams'
|
|
||||||
// 获取字典方法 使用示例 getDict('sex').then(res) 或者 async函数下 const res = await getDict('sex')
|
// 获取字典方法 使用示例 getDict('sex').then(res) 或者 async函数下 const res = await getDict('sex')
|
||||||
export const getDict = async (type) => {
|
export const getDict = async (type) => {
|
||||||
const dictionaryStore = useDictionaryStore()
|
const dictionaryStore = useDictionaryStore()
|
||||||
@@ -25,10 +24,3 @@ export const showDictLabel = (
|
|||||||
})
|
})
|
||||||
return Reflect.has(dictMap, code) ? dictMap[code] : ''
|
return Reflect.has(dictMap, code) ? dictMap[code] : ''
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getParams = async (key) => {
|
|
||||||
const res = await getSysParam({ key })
|
|
||||||
if (res.code === 0) {
|
|
||||||
return res.data.value
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
14
web/src/utils/params.js
Normal file
14
web/src/utils/params.js
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import { useParamsStore } from '@/pinia/modules/params'
|
||||||
|
/*
|
||||||
|
* 获取参数方法 使用示例 getParams('key').then(res) 或者 async函数下 const res = await getParams('key')
|
||||||
|
* const res = ref('')
|
||||||
|
* const fun = async () => {
|
||||||
|
* res.value = await getParams('test')
|
||||||
|
* }
|
||||||
|
* fun()
|
||||||
|
*/
|
||||||
|
export const getParams = async(key) => {
|
||||||
|
const paramsStore = useParamsStore()
|
||||||
|
await paramsStore.getParams(key)
|
||||||
|
return paramsStore.paramsMap[key]
|
||||||
|
}
|
@@ -1,34 +1,29 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mt-2">
|
<div class="mt-2">
|
||||||
<el-row :gutter="10">
|
<div class="flex flex-col md:flex-row gap-4">
|
||||||
<el-col :span="12">
|
<div class="w-full md:w-1/2">
|
||||||
<el-card>
|
<el-card class="min-w-96">
|
||||||
<template #header>
|
<template #header>
|
||||||
<el-divider>gin-vue-admin</el-divider>
|
<el-divider>gin-vue-admin</el-divider>
|
||||||
</template>
|
</template>
|
||||||
<div>
|
<div>
|
||||||
<el-row>
|
<div class="w-full flex items-center justify-center">
|
||||||
<el-col :span="8" :offset="8">
|
<a href="https://github.com/flipped-aurora/gin-vue-admin">
|
||||||
<a href="https://github.com/flipped-aurora/gin-vue-admin">
|
|
||||||
<img
|
<img
|
||||||
class="org-img dom-center"
|
class="org-img dom-center"
|
||||||
src="@/assets/logo.png"
|
src="@/assets/logo.png"
|
||||||
alt="gin-vue-admin"
|
alt="gin-vue-admin"
|
||||||
/>
|
/>
|
||||||
</a>
|
</a>
|
||||||
</el-col>
|
</div>
|
||||||
</el-row>
|
<div class="w-full flex items-center justify-around">
|
||||||
<el-row :gutter="10">
|
<a href="https://github.com/flipped-aurora/gin-vue-admin">
|
||||||
<el-col :span="8">
|
|
||||||
<a href="https://github.com/flipped-aurora/gin-vue-admin">
|
|
||||||
<img
|
<img
|
||||||
class="dom-center"
|
class="dom-center"
|
||||||
src="https://img.shields.io/github/watchers/flipped-aurora/gin-vue-admin.svg?label=Watch"
|
src="https://img.shields.io/github/watchers/flipped-aurora/gin-vue-admin.svg?label=Watch"
|
||||||
alt=""
|
alt=""
|
||||||
/>
|
/>
|
||||||
</a>
|
</a>
|
||||||
</el-col>
|
|
||||||
<el-col :span="8">
|
|
||||||
<a href="https://github.com/flipped-aurora/gin-vue-admin">
|
<a href="https://github.com/flipped-aurora/gin-vue-admin">
|
||||||
<img
|
<img
|
||||||
class="dom-center"
|
class="dom-center"
|
||||||
@@ -36,8 +31,6 @@
|
|||||||
alt=""
|
alt=""
|
||||||
/>
|
/>
|
||||||
</a>
|
</a>
|
||||||
</el-col>
|
|
||||||
<el-col :span="8">
|
|
||||||
<a href="https://github.com/flipped-aurora/gin-vue-admin">
|
<a href="https://github.com/flipped-aurora/gin-vue-admin">
|
||||||
<img
|
<img
|
||||||
class="dom-center"
|
class="dom-center"
|
||||||
@@ -45,17 +38,15 @@
|
|||||||
alt=""
|
alt=""
|
||||||
/>
|
/>
|
||||||
</a>
|
</a>
|
||||||
</el-col>
|
</div>
|
||||||
</el-row>
|
|
||||||
</div>
|
</div>
|
||||||
</el-card>
|
</el-card>
|
||||||
<el-card style="margin-top: 20px">
|
<el-card class="min-w-96 mt-5">
|
||||||
<template #header>
|
<template #header>
|
||||||
<div>flipped-aurora团队</div>
|
<div>flipped-aurora团队</div>
|
||||||
</template>
|
</template>
|
||||||
<div>
|
<div>
|
||||||
<el-row>
|
<div class="w-full flex items-center justify-center">
|
||||||
<el-col :span="8" :offset="8">
|
|
||||||
<a href="https://github.com/flipped-aurora">
|
<a href="https://github.com/flipped-aurora">
|
||||||
<img
|
<img
|
||||||
class="org-img dom-center"
|
class="org-img dom-center"
|
||||||
@@ -63,17 +54,13 @@
|
|||||||
alt="flipped-aurora"
|
alt="flipped-aurora"
|
||||||
/>
|
/>
|
||||||
</a>
|
</a>
|
||||||
</el-col>
|
</div>
|
||||||
</el-row>
|
<div class="grid grid-cols-1 sm:grid-cols-2 xl:grid-cols-3 2xl:grid-cols-4 gap-4 mt-4">
|
||||||
<div
|
<div v-for="(item, index) in members" :key="index" class="min-h-10 flex items-center">
|
||||||
class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4 mt-4"
|
<a :href="item.html_url" class="flex items-center group">
|
||||||
>
|
|
||||||
<div v-for="(item, index) in members" :key="index" :span="8">
|
|
||||||
<a :href="item.html_url" class="flex items-center">
|
|
||||||
<img class="w-8 h-8 rounded-full" :src="item.avatar_url" />
|
<img class="w-8 h-8 rounded-full" :src="item.avatar_url" />
|
||||||
<el-link
|
<el-link
|
||||||
class="text-blue-700 ml-2 text-xl font-bold font-sans"
|
class="text-blue-700 ml-2 text-lg font-bold font-sans break-all"
|
||||||
style=""
|
|
||||||
>{{ item.login }}</el-link
|
>{{ item.login }}</el-link
|
||||||
>
|
>
|
||||||
</a>
|
</a>
|
||||||
@@ -81,13 +68,13 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</el-card>
|
</el-card>
|
||||||
</el-col>
|
</div>
|
||||||
<el-col :span="12">
|
<div class="w-full md:w-1/2">
|
||||||
<el-card>
|
<el-card>
|
||||||
<template #header>
|
<template #header>
|
||||||
<div>提交记录</div>
|
<div>提交记录</div>
|
||||||
</template>
|
</template>
|
||||||
<div>
|
<div class="h-[calc(100vh-300px)] overflow-y-auto">
|
||||||
<el-timeline>
|
<el-timeline>
|
||||||
<el-timeline-item
|
<el-timeline-item
|
||||||
v-for="(item, index) in dataTimeline"
|
v-for="(item, index) in dataTimeline"
|
||||||
@@ -102,12 +89,14 @@
|
|||||||
</el-timeline-item>
|
</el-timeline-item>
|
||||||
</el-timeline>
|
</el-timeline>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="w-full flex items-center justify-center">
|
||||||
<el-button class="load-more" type="primary" link @click="loadMore">
|
<el-button class="load-more" type="primary" link @click="loadMore">
|
||||||
Load more
|
Load more
|
||||||
</el-button>
|
</el-button>
|
||||||
|
</div>
|
||||||
</el-card>
|
</el-card>
|
||||||
</el-col>
|
</div>
|
||||||
</el-row>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -155,10 +144,6 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
.load-more {
|
|
||||||
margin-left: 120px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.avatar-img {
|
.avatar-img {
|
||||||
float: left;
|
float: left;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
|
@@ -2,19 +2,19 @@
|
|||||||
<div
|
<div
|
||||||
class="grid grid-cols-1 md:grid-cols-3 lg:grid-cols-7 py-2 gap-4 md:gap-2 gva-container2"
|
class="grid grid-cols-1 md:grid-cols-3 lg:grid-cols-7 py-2 gap-4 md:gap-2 gva-container2"
|
||||||
>
|
>
|
||||||
<gva-card custom-class="col-span-1 lg:col-span-2 h-32">
|
<gva-card custom-class="col-span-1 lg:col-span-2 ">
|
||||||
<gva-chart :type="1" title="访问人数" />
|
<gva-chart :type="1" title="访问人数" />
|
||||||
</gva-card>
|
</gva-card>
|
||||||
<gva-card custom-class="col-span-1 lg:col-span-2 h-32 ">
|
<gva-card custom-class="col-span-1 lg:col-span-2 ">
|
||||||
<gva-chart :type="2" title="新增客户" />
|
<gva-chart :type="2" title="新增客户" />
|
||||||
</gva-card>
|
</gva-card>
|
||||||
<gva-card custom-class="col-span-1 lg:col-span-2 h-32">
|
<gva-card custom-class="col-span-1 lg:col-span-2 ">
|
||||||
<gva-chart :type="3" title="解决数量" />
|
<gva-chart :type="3" title="解决数量" />
|
||||||
</gva-card>
|
</gva-card>
|
||||||
<gva-card
|
<gva-card
|
||||||
title="快捷功能"
|
title="快捷功能"
|
||||||
show-action
|
show-action
|
||||||
custom-class="col-start-1 md:col-start-3 lg:col-start-7 row-span-2 h-38"
|
custom-class="col-start-1 md:col-start-3 lg:col-start-7 row-span-2 "
|
||||||
>
|
>
|
||||||
<gva-quick-link />
|
<gva-quick-link />
|
||||||
</gva-card>
|
</gva-card>
|
||||||
|
@@ -3,25 +3,27 @@
|
|||||||
<div class="gva-table-box">
|
<div class="gva-table-box">
|
||||||
<el-divider content-position="left">大文件上传</el-divider>
|
<el-divider content-position="left">大文件上传</el-divider>
|
||||||
<form id="fromCont" method="post">
|
<form id="fromCont" method="post">
|
||||||
<div class="fileUpload" @click="inputChange">
|
<!-- 新增按钮容器,使用 Flexbox 对齐按钮 -->
|
||||||
选择文件
|
<div class="button-container">
|
||||||
<input
|
<div class="fileUpload" @click="inputChange">
|
||||||
v-show="false"
|
<span class="takeFile">选择文件</span>
|
||||||
id="file"
|
<input
|
||||||
ref="FileInput"
|
v-show="false"
|
||||||
multiple="multiple"
|
id="file"
|
||||||
type="file"
|
ref="FileInput"
|
||||||
@change="choseFile"
|
multiple="multiple"
|
||||||
/>
|
type="file"
|
||||||
|
@change="choseFile"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<el-button
|
||||||
|
:disabled="limitFileSize"
|
||||||
|
type="primary"
|
||||||
|
class="uploadBtn"
|
||||||
|
@click="getFile"
|
||||||
|
>上传文件</el-button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
<el-button
|
|
||||||
:disabled="limitFileSize"
|
|
||||||
type="primary"
|
|
||||||
class="uploadBtn"
|
|
||||||
@click="getFile"
|
|
||||||
>上传文件</el-button
|
|
||||||
>
|
|
||||||
<div class="el-upload__tip">请上传不超过5MB的文件</div>
|
<div class="el-upload__tip">请上传不超过5MB的文件</div>
|
||||||
<div class="list">
|
<div class="list">
|
||||||
<transition name="list" tag="p">
|
<transition name="list" tag="p">
|
||||||
@@ -48,247 +50,291 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import SparkMD5 from 'spark-md5'
|
import SparkMD5 from 'spark-md5'
|
||||||
import {
|
import {
|
||||||
findFile,
|
findFile,
|
||||||
breakpointContinueFinish,
|
breakpointContinueFinish,
|
||||||
removeChunk,
|
removeChunk,
|
||||||
breakpointContinue
|
breakpointContinue
|
||||||
} from '@/api/breakpoint'
|
} from '@/api/breakpoint'
|
||||||
import { ref, watch } from 'vue'
|
import { ref, watch } from 'vue'
|
||||||
import { ElMessage } from 'element-plus'
|
import { ElMessage } from 'element-plus'
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: 'BreakPoint'
|
name: 'BreakPoint'
|
||||||
})
|
})
|
||||||
|
|
||||||
const file = ref(null)
|
const file = ref(null)
|
||||||
const fileMd5 = ref('')
|
const fileMd5 = ref('')
|
||||||
const formDataList = ref([])
|
const formDataList = ref([])
|
||||||
const waitUpLoad = ref([])
|
const waitUpLoad = ref([])
|
||||||
const waitNum = ref(NaN)
|
const waitNum = ref(NaN)
|
||||||
const limitFileSize = ref(false)
|
const limitFileSize = ref(false)
|
||||||
const percentage = ref(0)
|
const percentage = ref(0)
|
||||||
const percentageFlage = ref(true)
|
const percentageFlage = ref(true)
|
||||||
|
|
||||||
// 选中文件的函数
|
// 选中文件的函数
|
||||||
const choseFile = async (e) => {
|
const choseFile = async (e) => {
|
||||||
// 点击选择文件后取消 直接return
|
// 点击选择文件后取消 直接return
|
||||||
if (!e.target.files.length) {
|
if (!e.target.files.length) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
const fileR = new FileReader() // 创建一个reader用来读取文件流
|
const fileR = new FileReader() // 创建一个reader用来读取文件流
|
||||||
const fileInput = e.target.files[0] // 获取当前文件
|
const fileInput = e.target.files[0] // 获取当前文件
|
||||||
const maxSize = 5 * 1024 * 1024
|
const maxSize = 5 * 1024 * 1024
|
||||||
file.value = fileInput // file 丢全局方便后面用 可以改进为func传参形式
|
file.value = fileInput // file 丢全局方便后面用 可以改进为func传参形式
|
||||||
percentage.value = 0
|
percentage.value = 0
|
||||||
if (file.value.size < maxSize) {
|
if (file.value.size < maxSize) {
|
||||||
fileR.readAsArrayBuffer(file.value) // 把文件读成ArrayBuffer 主要为了保持跟后端的流一致
|
fileR.readAsArrayBuffer(file.value) // 把文件读成ArrayBuffer 主要为了保持跟后端的流一致
|
||||||
fileR.onload = async (e) => {
|
fileR.onload = async (e) => {
|
||||||
// 读成arrayBuffer的回调 e 为方法自带参数 相当于 dom的e 流存在e.target.result 中
|
// 读成arrayBuffer的回调 e 为方法自带参数 相当于 dom的e 流存在e.target.result 中
|
||||||
const blob = e.target.result
|
const blob = e.target.result
|
||||||
const spark = new SparkMD5.ArrayBuffer() // 创建md5制造工具 (md5用于检测文件一致性 这里不懂就打电话问我)
|
const spark = new SparkMD5.ArrayBuffer() // 创建md5制造工具 (md5用于检测文件一致性 这里不懂就打电话问我)
|
||||||
spark.append(blob) // 文件流丢进工具
|
spark.append(blob) // 文件流丢进工具
|
||||||
fileMd5.value = spark.end() // 工具结束 产生一个a 总文件的md5
|
fileMd5.value = spark.end() // 工具结束 产生一个a 总文件的md5
|
||||||
const FileSliceCap = 1 * 1024 * 1024 // 分片字节数
|
const FileSliceCap = 1 * 1024 * 1024 // 分片字节数
|
||||||
let start = 0 // 定义分片开始切的地方
|
let start = 0 // 定义分片开始切的地方
|
||||||
let end = 0 // 每片结束切的地方a
|
let end = 0 // 每片结束切的地方a
|
||||||
let i = 0 // 第几片
|
let i = 0 // 第几片
|
||||||
formDataList.value = [] // 分片存储的一个池子 丢全局
|
formDataList.value = [] // 分片存储的一个池子 丢全局
|
||||||
while (end < file.value.size) {
|
while (end < file.value.size) {
|
||||||
// 当结尾数字大于文件总size的时候 结束切片
|
// 当结尾数字大于文件总size的时候 结束切片
|
||||||
start = i * FileSliceCap // 计算每片开始位置
|
start = i * FileSliceCap // 计算每片开始位置
|
||||||
end = (i + 1) * FileSliceCap // 计算每片结束位置
|
end = (i + 1) * FileSliceCap // 计算每片结束位置
|
||||||
var fileSlice = file.value.slice(start, end) // 开始切 file.slice 为 h5方法 对文件切片 参数为 起止字节数
|
var fileSlice = file.value.slice(start, end) // 开始切 file.slice 为 h5方法 对文件切片 参数为 起止字节数
|
||||||
const formData = new window.FormData() // 创建FormData用于存储传给后端的信息
|
const formData = new window.FormData() // 创建FormData用于存储传给后端的信息
|
||||||
formData.append('fileMd5', fileMd5.value) // 存储总文件的Md5 让后端知道自己是谁的切片
|
formData.append('fileMd5', fileMd5.value) // 存储总文件的Md5 让后端知道自己是谁的切片
|
||||||
formData.append('file', fileSlice) // 当前的切片
|
formData.append('file', fileSlice) // 当前的切片
|
||||||
formData.append('chunkNumber', i) // 当前是第几片
|
formData.append('chunkNumber', i) // 当前是第几片
|
||||||
formData.append('fileName', file.value.name) // 当前文件的文件名 用于后端文件切片的命名 formData.appen 为 formData对象添加参数的方法
|
formData.append('fileName', file.value.name) // 当前文件的文件名 用于后端文件切片的命名 formData.appen 为 formData对象添加参数的方法
|
||||||
formDataList.value.push({ key: i, formData }) // 把当前切片信息 自己是第几片 存入我们方才准备好的池子
|
formDataList.value.push({ key: i, formData }) // 把当前切片信息 自己是第几片 存入我们方才准备好的池子
|
||||||
i++
|
i++
|
||||||
}
|
|
||||||
const params = {
|
|
||||||
fileName: file.value.name,
|
|
||||||
fileMd5: fileMd5.value,
|
|
||||||
chunkTotal: formDataList.value.length
|
|
||||||
}
|
|
||||||
const res = await findFile(params)
|
|
||||||
// 全部切完以后 发一个请求给后端 拉当前文件后台存储的切片信息 用于检测有多少上传成功的切片
|
|
||||||
const finishList = res.data.file.ExaFileChunk // 上传成功的切片
|
|
||||||
const IsFinish = res.data.file.IsFinish // 是否是同文件不同命 (文件md5相同 文件名不同 则默认是同一个文件但是不同文件名 此时后台数据库只需要拷贝一下数据库文件即可 不需要上传文件 即秒传功能)
|
|
||||||
if (!IsFinish) {
|
|
||||||
// 当是断点续传时候
|
|
||||||
waitUpLoad.value = formDataList.value.filter((all) => {
|
|
||||||
return !(
|
|
||||||
finishList &&
|
|
||||||
finishList.some((fi) => fi.FileChunkNumber === all.key)
|
|
||||||
) // 找出需要上传的切片
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
waitUpLoad.value = [] // 秒传则没有需要上传的切片
|
|
||||||
ElMessage.success('文件已秒传')
|
|
||||||
}
|
|
||||||
waitNum.value = waitUpLoad.value.length // 记录长度用于百分比展示
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
limitFileSize.value = true
|
|
||||||
ElMessage('请上传小于5M文件')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const getFile = () => {
|
|
||||||
// 确定按钮
|
|
||||||
if (file.value === null) {
|
|
||||||
ElMessage('请先上传文件')
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if (percentage.value === 100) {
|
|
||||||
percentageFlage.value = false
|
|
||||||
}
|
|
||||||
sliceFile() // 上传切片
|
|
||||||
}
|
|
||||||
|
|
||||||
const sliceFile = () => {
|
|
||||||
waitUpLoad.value &&
|
|
||||||
waitUpLoad.value.forEach((item) => {
|
|
||||||
// 需要上传的切片
|
|
||||||
item.formData.append('chunkTotal', formDataList.value.length) // 切片总数携带给后台 总有用的
|
|
||||||
const fileR = new FileReader() // 功能同上
|
|
||||||
const fileF = item.formData.get('file')
|
|
||||||
fileR.readAsArrayBuffer(fileF)
|
|
||||||
fileR.onload = (e) => {
|
|
||||||
const spark = new SparkMD5.ArrayBuffer()
|
|
||||||
spark.append(e.target.result)
|
|
||||||
item.formData.append('chunkMd5', spark.end()) // 获取当前切片md5 后端用于验证切片完整性
|
|
||||||
upLoadFileSlice(item)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
watch(
|
|
||||||
() => waitNum.value,
|
|
||||||
() => {
|
|
||||||
percentage.value = Math.floor(
|
|
||||||
((formDataList.value.length - waitNum.value) /
|
|
||||||
formDataList.value.length) *
|
|
||||||
100
|
|
||||||
)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
const upLoadFileSlice = async (item) => {
|
|
||||||
// 切片上传
|
|
||||||
const fileRe = await breakpointContinue(item.formData)
|
|
||||||
if (fileRe.code !== 0) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
waitNum.value-- // 百分数增加
|
|
||||||
if (waitNum.value === 0) {
|
|
||||||
// 切片传完以后 合成文件
|
|
||||||
const params = {
|
const params = {
|
||||||
fileName: file.value.name,
|
fileName: file.value.name,
|
||||||
fileMd5: fileMd5.value
|
fileMd5: fileMd5.value,
|
||||||
|
chunkTotal: formDataList.value.length
|
||||||
}
|
}
|
||||||
const res = await breakpointContinueFinish(params)
|
const res = await findFile(params)
|
||||||
if (res.code === 0) {
|
// 全部切完以后 发一个请求给后端 拉当前文件后台存储的切片信息 用于检测有多少上传成功的切片
|
||||||
// 合成文件过后 删除缓存切片
|
const finishList = res.data.file.ExaFileChunk // 上传成功的切片
|
||||||
const params = {
|
const IsFinish = res.data.file.IsFinish // 是否是同文件不同命 (文件md5相同 文件名不同 则默认是同一个文件但是不同文件名 此时后台数据库只需要拷贝一下数据库文件即可 不需要上传文件 即秒传功能)
|
||||||
fileName: file.value.name,
|
if (!IsFinish) {
|
||||||
fileMd5: fileMd5.value,
|
// 当是断点续传时候
|
||||||
filePath: res.data.filePath
|
waitUpLoad.value = formDataList.value.filter((all) => {
|
||||||
}
|
return !(
|
||||||
ElMessage.success('上传成功')
|
finishList &&
|
||||||
await removeChunk(params)
|
finishList.some((fi) => fi.FileChunkNumber === all.key)
|
||||||
|
) // 找出需要上传的切片
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
waitUpLoad.value = [] // 秒传则没有需要上传的切片
|
||||||
|
ElMessage.success('文件已秒传!')
|
||||||
}
|
}
|
||||||
|
waitNum.value = waitUpLoad.value.length // 记录长度用于百分比展示
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
limitFileSize.value = true
|
||||||
|
ElMessage('请上传小于5M文件!')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const getFile = () => {
|
||||||
|
// 确定按钮
|
||||||
|
if (file.value === null) {
|
||||||
|
ElMessage('请先上传文件!')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// 检查文件上传进度
|
||||||
|
if (percentage.value === 100) {
|
||||||
|
ElMessage.success('上传已完成!') // 添加提示消息
|
||||||
|
percentageFlage.value = false
|
||||||
|
return // 如果进度已完成,阻止继续执行后续代码
|
||||||
|
}
|
||||||
|
// 如果文件未上传完成,继续上传切片
|
||||||
|
sliceFile() // 上传切片
|
||||||
|
}
|
||||||
|
|
||||||
|
const sliceFile = () => {
|
||||||
|
waitUpLoad.value &&
|
||||||
|
waitUpLoad.value.forEach((item) => {
|
||||||
|
// 需要上传的切片
|
||||||
|
item.formData.append('chunkTotal', formDataList.value.length) // 切片总数携带给后台 总有用的
|
||||||
|
const fileR = new FileReader() // 功能同上
|
||||||
|
const fileF = item.formData.get('file')
|
||||||
|
fileR.readAsArrayBuffer(fileF)
|
||||||
|
fileR.onload = (e) => {
|
||||||
|
const spark = new SparkMD5.ArrayBuffer()
|
||||||
|
spark.append(e.target.result)
|
||||||
|
item.formData.append('chunkMd5', spark.end()) // 获取当前切片md5 后端用于验证切片完整性
|
||||||
|
upLoadFileSlice(item)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => waitNum.value,
|
||||||
|
() => {
|
||||||
|
percentage.value = Math.floor(
|
||||||
|
((formDataList.value.length - waitNum.value) /
|
||||||
|
formDataList.value.length) *
|
||||||
|
100
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
const upLoadFileSlice = async (item) => {
|
||||||
|
// 切片上传
|
||||||
|
const fileRe = await breakpointContinue(item.formData)
|
||||||
|
if (fileRe.code !== 0) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
waitNum.value-- // 百分数增加
|
||||||
|
if (waitNum.value === 0) {
|
||||||
|
// 切片传完以后 合成文件
|
||||||
|
const params = {
|
||||||
|
fileName: file.value.name,
|
||||||
|
fileMd5: fileMd5.value
|
||||||
|
}
|
||||||
|
const res = await breakpointContinueFinish(params)
|
||||||
|
if (res.code === 0) {
|
||||||
|
// 合成文件过后 删除缓存切片
|
||||||
|
const params = {
|
||||||
|
fileName: file.value.name,
|
||||||
|
fileMd5: fileMd5.value,
|
||||||
|
filePath: res.data.filePath
|
||||||
|
}
|
||||||
|
ElMessage.success('上传成功')
|
||||||
|
await removeChunk(params)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const FileInput = ref(null)
|
const FileInput = ref(null)
|
||||||
const inputChange = () => {
|
const inputChange = () => {
|
||||||
FileInput.value.dispatchEvent(new MouseEvent('click'))
|
FileInput.value.dispatchEvent(new MouseEvent('click'))
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
h3 {
|
h3 {
|
||||||
margin: 40px 0 0;
|
margin: 40px 0 0;
|
||||||
}
|
}
|
||||||
ul {
|
ul {
|
||||||
list-style-type: none;
|
list-style-type: none;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
li {
|
li {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
margin: 0 10px;
|
margin: 0 10px;
|
||||||
}
|
}
|
||||||
a {
|
a {
|
||||||
color: #42b983;
|
color: #42b983;
|
||||||
}
|
}
|
||||||
#fromCont {
|
#fromCont {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
.fileUpload {
|
|
||||||
padding: 3px 10px;
|
|
||||||
font-size: 12px;
|
|
||||||
height: 20px;
|
|
||||||
line-height: 20px;
|
|
||||||
position: relative;
|
|
||||||
cursor: pointer;
|
|
||||||
border: 1px solid #c1c1c1;
|
|
||||||
border-radius: 4px;
|
|
||||||
overflow: hidden;
|
|
||||||
display: inline-block;
|
|
||||||
input {
|
|
||||||
position: absolute;
|
|
||||||
font-size: 100px;
|
|
||||||
right: 0;
|
|
||||||
top: 0;
|
|
||||||
opacity: 0;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.fileName {
|
|
||||||
display: inline-block;
|
|
||||||
vertical-align: top;
|
|
||||||
margin: 6px 15px 0 15px;
|
|
||||||
}
|
|
||||||
.uploadBtn {
|
|
||||||
position: relative;
|
|
||||||
top: -10px;
|
|
||||||
margin-left: 15px;
|
|
||||||
}
|
|
||||||
.tips {
|
|
||||||
margin-top: 30px;
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: 400;
|
|
||||||
color: #606266;
|
|
||||||
}
|
|
||||||
.el-divider {
|
|
||||||
margin: 0 0 30px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.list {
|
.gva-table-box {
|
||||||
margin-top: 15px;
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-container {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fileUpload,
|
||||||
|
.uploadBtn {
|
||||||
|
width: 90px;
|
||||||
|
height: 35px;
|
||||||
|
line-height: 35px;
|
||||||
|
font-size: 14px;
|
||||||
|
display: inline-flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
border-radius: 5px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fileUpload {
|
||||||
|
padding: 0 15px;
|
||||||
|
background-color: #007bff;
|
||||||
|
color: #ffffff;
|
||||||
|
font-weight: 500;
|
||||||
|
transition: all 0.3s ease-in-out;
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.uploadBtn {
|
||||||
|
background-color: #007bff;
|
||||||
|
color: #fff;
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fileUpload:hover {
|
||||||
|
background-color: #0056b3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.uploadBtn:hover {
|
||||||
|
background-color: #0056b3;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.fileUpload:active,
|
||||||
|
.uploadBtn:active {
|
||||||
|
transform: translateY(2px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.fileUpload input {
|
||||||
|
position: relative;
|
||||||
|
font-size: 100px;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
opacity: 0;
|
||||||
|
cursor: pointer;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.fileName {
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: top;
|
||||||
|
margin: 6px 15px 0 15px;
|
||||||
|
}
|
||||||
|
.tips {
|
||||||
|
margin-top: 30px;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #606266;
|
||||||
|
}
|
||||||
|
.el-divider {
|
||||||
|
margin: 0 0 30px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.list {
|
||||||
|
margin-top: 15px;
|
||||||
|
}
|
||||||
|
.list-item {
|
||||||
|
display: block;
|
||||||
|
margin-right: 10px;
|
||||||
|
color: #606266;
|
||||||
|
line-height: 25px;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
width: 40%;
|
||||||
|
.percentage {
|
||||||
|
float: right;
|
||||||
}
|
}
|
||||||
.list-item {
|
}
|
||||||
display: block;
|
.list-enter-active,
|
||||||
margin-right: 10px;
|
.list-leave-active {
|
||||||
color: #606266;
|
transition: all 1s;
|
||||||
line-height: 25px;
|
}
|
||||||
margin-bottom: 5px;
|
.list-enter, .list-leave-to
|
||||||
width: 40%;
|
/* .list-leave-active for below version 2.1.8 */ {
|
||||||
.percentage {
|
opacity: 0;
|
||||||
float: right;
|
transform: translateY(-30px);
|
||||||
}
|
}
|
||||||
}
|
</style>
|
||||||
.list-enter-active,
|
|
||||||
.list-leave-active {
|
|
||||||
transition: all 1s;
|
|
||||||
}
|
|
||||||
.list-enter, .list-leave-to
|
|
||||||
/* .list-leave-active for below version 2.1.8 */ {
|
|
||||||
opacity: 0;
|
|
||||||
transform: translateY(-30px);
|
|
||||||
}
|
|
||||||
</style>
|
|
@@ -1,161 +1,233 @@
|
|||||||
<template>
|
<template>
|
||||||
<div v-loading.fullscreen.lock="fullscreenLoading">
|
<div v-loading.fullscreen.lock="fullscreenLoading">
|
||||||
<div class="gva-table-box">
|
<div class="flex gap-4 p-2">
|
||||||
<warning-bar title="点击“文件名/备注”可以编辑文件名或者备注内容。" />
|
<div class="flex-none w-64 bg-white text-slate-700 dark:text-slate-400 dark:bg-slate-900 rounded p-4">
|
||||||
<div class="gva-btn-list gap-3">
|
<el-scrollbar style="height: calc(100vh - 300px)">
|
||||||
<upload-common :image-common="imageCommon" @on-success="getTableData" />
|
<el-tree
|
||||||
<upload-image
|
:data="categories"
|
||||||
:image-url="imageUrl"
|
node-key="id"
|
||||||
:file-size="512"
|
:props="defaultProps"
|
||||||
:max-w-h="1080"
|
@node-click="handleNodeClick"
|
||||||
@on-success="getTableData"
|
default-expand-all
|
||||||
/>
|
>
|
||||||
<el-button type="primary" icon="upload" @click="importUrlFunc">
|
<template #default="{ node, data }">
|
||||||
导入URL
|
<div class="w-36" :class="search.classId === data.ID ? 'text-blue-500 font-bold' : ''">{{ data.name }}
|
||||||
</el-button>
|
</div>
|
||||||
<el-input
|
<el-dropdown>
|
||||||
v-model="search.keyword"
|
<el-icon class="ml-3 text-right" v-if="data.ID > 0"><MoreFilled /></el-icon>
|
||||||
class="w-72"
|
<el-icon class="ml-3 text-right mt-1" v-else><Plus /></el-icon>
|
||||||
placeholder="请输入文件名或备注"
|
<template #dropdown>
|
||||||
/>
|
<el-dropdown-menu>
|
||||||
<el-button type="primary" icon="search" @click="getTableData"
|
<el-dropdown-item @click="addCategoryFun(data)">添加分类</el-dropdown-item>
|
||||||
>查询</el-button
|
<el-dropdown-item @click="editCategory(data)" v-if="data.ID > 0">编辑分类</el-dropdown-item>
|
||||||
>
|
<el-dropdown-item @click="deleteCategoryFun(data.ID)" v-if="data.ID > 0">删除分类</el-dropdown-item>
|
||||||
|
</el-dropdown-menu>
|
||||||
|
</template>
|
||||||
|
</el-dropdown>
|
||||||
|
</template>
|
||||||
|
</el-tree>
|
||||||
|
</el-scrollbar>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="flex-1 bg-white text-slate-700 dark:text-slate-400 dark:bg-slate-900">
|
||||||
|
<div class="gva-table-box mt-0 mb-0">
|
||||||
|
<warning-bar title="点击“文件名”可以编辑;选择的类别即是上传的类别。" />
|
||||||
|
<div class="gva-btn-list gap-3">
|
||||||
|
<upload-common :image-common="imageCommon" :classId="search.classId" @on-success="onSuccess" />
|
||||||
|
<upload-image
|
||||||
|
:image-url="imageUrl"
|
||||||
|
:file-size="512"
|
||||||
|
:max-w-h="1080"
|
||||||
|
:classId="search.classId"
|
||||||
|
@on-success="onSuccess"
|
||||||
|
/>
|
||||||
|
<el-button type="primary" icon="upload" @click="importUrlFunc">
|
||||||
|
导入URL
|
||||||
|
</el-button>
|
||||||
|
<el-input
|
||||||
|
v-model="search.keyword"
|
||||||
|
class="w-72"
|
||||||
|
placeholder="请输入文件名或备注"
|
||||||
|
/>
|
||||||
|
<el-button type="primary" icon="search" @click="onSubmit"
|
||||||
|
>查询
|
||||||
|
</el-button
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
|
||||||
<el-table :data="tableData">
|
<el-table :data="tableData">
|
||||||
<el-table-column align="left" label="预览" width="100">
|
<el-table-column align="left" label="预览" width="100">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<CustomPic pic-type="file" :pic-src="scope.row.url" preview />
|
<CustomPic pic-type="file" :pic-src="scope.row.url" preview/>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="left" label="日期" prop="UpdatedAt" width="180">
|
<el-table-column align="left" label="日期" prop="UpdatedAt" width="180">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<div>{{ formatDate(scope.row.UpdatedAt) }}</div>
|
<div>{{ formatDate(scope.row.UpdatedAt) }}</div>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
align="left"
|
align="left"
|
||||||
label="文件名/备注"
|
label="文件名/备注"
|
||||||
prop="name"
|
prop="name"
|
||||||
width="180"
|
width="180"
|
||||||
>
|
|
||||||
<template #default="scope">
|
|
||||||
<div class="name" @click="editFileNameFunc(scope.row)">
|
|
||||||
{{ scope.row.name }}
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column align="left" label="链接" prop="url" min-width="300" />
|
|
||||||
<el-table-column align="left" label="标签" prop="tag" width="100">
|
|
||||||
<template #default="scope">
|
|
||||||
<el-tag
|
|
||||||
:type="scope.row.tag?.toLowerCase() === 'jpg' ? 'info' : 'success'"
|
|
||||||
disable-transitions
|
|
||||||
>{{ scope.row.tag }}
|
|
||||||
</el-tag>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column align="left" label="操作" width="160">
|
|
||||||
<template #default="scope">
|
|
||||||
<el-button
|
|
||||||
icon="download"
|
|
||||||
type="primary"
|
|
||||||
link
|
|
||||||
@click="downloadFile(scope.row)"
|
|
||||||
>下载</el-button
|
|
||||||
>
|
>
|
||||||
<el-button
|
<template #default="scope">
|
||||||
icon="delete"
|
<div class="cursor-pointer" @click="editFileNameFunc(scope.row)">
|
||||||
type="primary"
|
{{ scope.row.name }}
|
||||||
link
|
</div>
|
||||||
@click="deleteFileFunc(scope.row)"
|
</template>
|
||||||
>删除</el-button
|
</el-table-column>
|
||||||
>
|
<el-table-column align="left" label="链接" prop="url" min-width="300"/>
|
||||||
</template>
|
<el-table-column align="left" label="标签" prop="tag" width="100">
|
||||||
</el-table-column>
|
<template #default="scope">
|
||||||
</el-table>
|
<el-tag
|
||||||
<div class="gva-pagination">
|
:type="scope.row.tag?.toLowerCase() === 'jpg' ? 'info' : 'success'"
|
||||||
<el-pagination
|
disable-transitions
|
||||||
:current-page="page"
|
>{{ scope.row.tag }}
|
||||||
:page-size="pageSize"
|
</el-tag>
|
||||||
:page-sizes="[10, 30, 50, 100]"
|
</template>
|
||||||
:style="{ float: 'right', padding: '20px' }"
|
</el-table-column>
|
||||||
:total="total"
|
<el-table-column align="left" label="操作" width="160">
|
||||||
layout="total, sizes, prev, pager, next, jumper"
|
<template #default="scope">
|
||||||
@current-change="handleCurrentChange"
|
<el-button
|
||||||
@size-change="handleSizeChange"
|
icon="download"
|
||||||
/>
|
type="primary"
|
||||||
|
link
|
||||||
|
@click="downloadFile(scope.row)"
|
||||||
|
>下载
|
||||||
|
</el-button
|
||||||
|
>
|
||||||
|
<el-button
|
||||||
|
icon="delete"
|
||||||
|
type="primary"
|
||||||
|
link
|
||||||
|
@click="deleteFileFunc(scope.row)"
|
||||||
|
>删除
|
||||||
|
</el-button
|
||||||
|
>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<div class="gva-pagination">
|
||||||
|
<el-pagination
|
||||||
|
:current-page="page"
|
||||||
|
:page-size="pageSize"
|
||||||
|
:page-sizes="[10, 30, 50, 100]"
|
||||||
|
:style="{ float: 'right', padding: '20px' }"
|
||||||
|
:total="total"
|
||||||
|
layout="total, sizes, prev, pager, next, jumper"
|
||||||
|
@current-change="handleCurrentChange"
|
||||||
|
@size-change="handleSizeChange"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- 添加分类弹窗 -->
|
||||||
|
<el-dialog v-model="categoryDialogVisible" @close="closeAddCategoryDialog" width="520"
|
||||||
|
:title="(categoryFormData.ID === 0 ? '添加' : '编辑') + '分类'"
|
||||||
|
draggable
|
||||||
|
>
|
||||||
|
<el-form ref="categoryForm" :rules="rules" :model="categoryFormData" label-width="80px">
|
||||||
|
<el-form-item label="上级分类">
|
||||||
|
<el-tree-select
|
||||||
|
v-model="categoryFormData.pid"
|
||||||
|
:data="categories"
|
||||||
|
check-strictly
|
||||||
|
:props="defaultProps"
|
||||||
|
:render-after-expand="false"
|
||||||
|
style="width: 240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="分类名称" prop="name">
|
||||||
|
<el-input v-model.trim="categoryFormData.name" placeholder="分类名称"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<template #footer>
|
||||||
|
<el-button @click="closeAddCategoryDialog">取消</el-button>
|
||||||
|
<el-button type="primary" @click="confirmAddCategory">确定</el-button>
|
||||||
|
</template>
|
||||||
|
</el-dialog>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import {
|
import {
|
||||||
getFileList,
|
getFileList,
|
||||||
deleteFile,
|
deleteFile,
|
||||||
editFileName,
|
editFileName,
|
||||||
importURL
|
importURL
|
||||||
} from '@/api/fileUploadAndDownload'
|
} from '@/api/fileUploadAndDownload'
|
||||||
import { downloadImage } from '@/utils/downloadImg'
|
import {downloadImage} from '@/utils/downloadImg'
|
||||||
import CustomPic from '@/components/customPic/index.vue'
|
import CustomPic from '@/components/customPic/index.vue'
|
||||||
import UploadImage from '@/components/upload/image.vue'
|
import UploadImage from '@/components/upload/image.vue'
|
||||||
import UploadCommon from '@/components/upload/common.vue'
|
import UploadCommon from '@/components/upload/common.vue'
|
||||||
import { CreateUUID, formatDate } from '@/utils/format'
|
import {CreateUUID, formatDate} from '@/utils/format'
|
||||||
import WarningBar from '@/components/warningBar/warningBar.vue'
|
import WarningBar from '@/components/warningBar/warningBar.vue'
|
||||||
|
|
||||||
import { ref } from 'vue'
|
import {ref} from 'vue'
|
||||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
import {ElMessage, ElMessageBox} from 'element-plus'
|
||||||
|
import {addCategory, deleteCategory, getCategoryList} from "@/api/attachmentCategory";
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: 'Upload'
|
name: 'Upload'
|
||||||
})
|
})
|
||||||
|
|
||||||
const path = ref(import.meta.env.VITE_BASE_API)
|
const path = ref(import.meta.env.VITE_BASE_API)
|
||||||
|
|
||||||
const imageUrl = ref('')
|
const imageUrl = ref('')
|
||||||
const imageCommon = ref('')
|
const imageCommon = ref('')
|
||||||
|
|
||||||
const page = ref(1)
|
const page = ref(1)
|
||||||
const total = ref(0)
|
const total = ref(0)
|
||||||
const pageSize = ref(10)
|
const pageSize = ref(10)
|
||||||
const search = ref({})
|
const search = ref({
|
||||||
const tableData = ref([])
|
keyword: null,
|
||||||
|
classId: 0
|
||||||
|
})
|
||||||
|
const tableData = ref([])
|
||||||
|
|
||||||
// 分页
|
// 分页
|
||||||
const handleSizeChange = (val) => {
|
const handleSizeChange = (val) => {
|
||||||
pageSize.value = val
|
pageSize.value = val
|
||||||
getTableData()
|
|
||||||
}
|
|
||||||
|
|
||||||
const handleCurrentChange = (val) => {
|
|
||||||
page.value = val
|
|
||||||
getTableData()
|
|
||||||
}
|
|
||||||
|
|
||||||
// 查询
|
|
||||||
const getTableData = async () => {
|
|
||||||
const table = await getFileList({
|
|
||||||
page: page.value,
|
|
||||||
pageSize: pageSize.value,
|
|
||||||
...search.value
|
|
||||||
})
|
|
||||||
if (table.code === 0) {
|
|
||||||
tableData.value = table.data.list
|
|
||||||
total.value = table.data.total
|
|
||||||
page.value = table.data.page
|
|
||||||
pageSize.value = table.data.pageSize
|
|
||||||
}
|
|
||||||
}
|
|
||||||
getTableData()
|
getTableData()
|
||||||
|
}
|
||||||
|
|
||||||
const deleteFileFunc = async (row) => {
|
const handleCurrentChange = (val) => {
|
||||||
ElMessageBox.confirm('此操作将永久删除文件, 是否继续?', '提示', {
|
page.value = val
|
||||||
confirmButtonText: '确定',
|
getTableData()
|
||||||
cancelButtonText: '取消',
|
}
|
||||||
type: 'warning'
|
|
||||||
})
|
const onSubmit = () => {
|
||||||
|
search.value.classId = 0
|
||||||
|
page.value = 1
|
||||||
|
getTableData()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询
|
||||||
|
const getTableData = async () => {
|
||||||
|
const table = await getFileList({
|
||||||
|
page: page.value,
|
||||||
|
pageSize: pageSize.value,
|
||||||
|
...search.value
|
||||||
|
})
|
||||||
|
if (table.code === 0) {
|
||||||
|
tableData.value = table.data.list
|
||||||
|
total.value = table.data.total
|
||||||
|
page.value = table.data.page
|
||||||
|
pageSize.value = table.data.pageSize
|
||||||
|
}
|
||||||
|
}
|
||||||
|
getTableData()
|
||||||
|
|
||||||
|
const deleteFileFunc = async (row) => {
|
||||||
|
ElMessageBox.confirm('此操作将永久删除文件, 是否继续?', '提示', {
|
||||||
|
confirmButtonText: '确定',
|
||||||
|
cancelButtonText: '取消',
|
||||||
|
type: 'warning'
|
||||||
|
})
|
||||||
.then(async () => {
|
.then(async () => {
|
||||||
const res = await deleteFile(row)
|
const res = await deleteFile(row)
|
||||||
if (res.code === 0) {
|
if (res.code === 0) {
|
||||||
@@ -175,30 +247,30 @@
|
|||||||
message: '已取消删除'
|
message: '已取消删除'
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const downloadFile = (row) => {
|
const downloadFile = (row) => {
|
||||||
if (row.url.indexOf('http://') > -1 || row.url.indexOf('https://') > -1) {
|
if (row.url.indexOf('http://') > -1 || row.url.indexOf('https://') > -1) {
|
||||||
downloadImage(row.url, row.name)
|
downloadImage(row.url, row.name)
|
||||||
} else {
|
} else {
|
||||||
downloadImage(path.value + '/' + row.url, row.name)
|
downloadImage(path.value + '/' + row.url, row.name)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 编辑文件名或者备注
|
* 编辑文件名或者备注
|
||||||
* @param row
|
* @param row
|
||||||
* @returns {Promise<void>}
|
* @returns {Promise<void>}
|
||||||
*/
|
*/
|
||||||
const editFileNameFunc = async (row) => {
|
const editFileNameFunc = async (row) => {
|
||||||
ElMessageBox.prompt('请输入文件名或者备注', '编辑', {
|
ElMessageBox.prompt('请输入文件名或者备注', '编辑', {
|
||||||
confirmButtonText: '确定',
|
confirmButtonText: '确定',
|
||||||
cancelButtonText: '取消',
|
cancelButtonText: '取消',
|
||||||
inputPattern: /\S/,
|
inputPattern: /\S/,
|
||||||
inputErrorMessage: '不能为空',
|
inputErrorMessage: '不能为空',
|
||||||
inputValue: row.name
|
inputValue: row.name
|
||||||
})
|
})
|
||||||
.then(async ({ value }) => {
|
.then(async ({value}) => {
|
||||||
row.name = value
|
row.name = value
|
||||||
// console.log(row)
|
// console.log(row)
|
||||||
const res = await editFileName(row)
|
const res = await editFileName(row)
|
||||||
@@ -216,22 +288,22 @@
|
|||||||
message: '取消修改'
|
message: '取消修改'
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 导入URL
|
* 导入URL
|
||||||
*/
|
*/
|
||||||
const importUrlFunc = () => {
|
const importUrlFunc = () => {
|
||||||
ElMessageBox.prompt('格式:文件名|链接或者仅链接。', '导入', {
|
ElMessageBox.prompt('格式:文件名|链接或者仅链接。', '导入', {
|
||||||
confirmButtonText: '确定',
|
confirmButtonText: '确定',
|
||||||
cancelButtonText: '取消',
|
cancelButtonText: '取消',
|
||||||
inputType: 'textarea',
|
inputType: 'textarea',
|
||||||
inputPlaceholder:
|
inputPlaceholder:
|
||||||
'我的图片|https://my-oss.com/my.png\nhttps://my-oss.com/my_1.png',
|
'我的图片|https://my-oss.com/my.png\nhttps://my-oss.com/my_1.png',
|
||||||
inputPattern: /\S/,
|
inputPattern: /\S/,
|
||||||
inputErrorMessage: '不能为空'
|
inputErrorMessage: '不能为空'
|
||||||
})
|
})
|
||||||
.then(async ({ value }) => {
|
.then(async ({value}) => {
|
||||||
let data = value.split('\n')
|
let data = value.split('\n')
|
||||||
let importData = []
|
let importData = []
|
||||||
data.forEach((item) => {
|
data.forEach((item) => {
|
||||||
@@ -249,6 +321,7 @@
|
|||||||
importData.push({
|
importData.push({
|
||||||
name: name,
|
name: name,
|
||||||
url: url,
|
url: url,
|
||||||
|
classId: search.value.classId,
|
||||||
tag: url.substring(url.lastIndexOf('.') + 1),
|
tag: url.substring(url.lastIndexOf('.') + 1),
|
||||||
key: CreateUUID()
|
key: CreateUUID()
|
||||||
})
|
})
|
||||||
@@ -270,11 +343,101 @@
|
|||||||
message: '取消导入'
|
message: '取消导入'
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped>
|
const onSuccess = () => {
|
||||||
.name {
|
search.value.keyword = null
|
||||||
cursor: pointer;
|
page.value = 1
|
||||||
|
getTableData()
|
||||||
|
}
|
||||||
|
|
||||||
|
const defaultProps = {
|
||||||
|
children: 'children',
|
||||||
|
label: 'name',
|
||||||
|
value: 'ID'
|
||||||
|
}
|
||||||
|
|
||||||
|
const categories = ref([])
|
||||||
|
const fetchCategories = async () => {
|
||||||
|
const res = await getCategoryList()
|
||||||
|
let data = {
|
||||||
|
name: '全部分类',
|
||||||
|
ID: 0,
|
||||||
|
pid: 0,
|
||||||
|
children:[]
|
||||||
}
|
}
|
||||||
</style>
|
if (res.code === 0) {
|
||||||
|
categories.value = res.data || []
|
||||||
|
categories.value.unshift(data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleNodeClick = (node) => {
|
||||||
|
search.value.keyword = null
|
||||||
|
search.value.classId = node.ID
|
||||||
|
page.value = 1
|
||||||
|
getTableData()
|
||||||
|
}
|
||||||
|
|
||||||
|
const categoryDialogVisible = ref(false)
|
||||||
|
const categoryFormData = ref({
|
||||||
|
ID: 0,
|
||||||
|
pid: 0,
|
||||||
|
name: ''
|
||||||
|
})
|
||||||
|
|
||||||
|
const categoryForm = ref(null)
|
||||||
|
const rules = ref({
|
||||||
|
name: [
|
||||||
|
{required: true, message: '请输入分类名称', trigger: 'blur'},
|
||||||
|
{max: 20, message: '最多20位字符', trigger: 'blur'}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
|
||||||
|
const addCategoryFun = (category) => {
|
||||||
|
categoryDialogVisible.value = true
|
||||||
|
categoryFormData.value.ID = 0
|
||||||
|
categoryFormData.value.pid = category.ID
|
||||||
|
}
|
||||||
|
|
||||||
|
const editCategory = (category) => {
|
||||||
|
categoryFormData.value = {
|
||||||
|
ID: category.ID,
|
||||||
|
pid: category.pid,
|
||||||
|
name: category.name
|
||||||
|
}
|
||||||
|
categoryDialogVisible.value = true
|
||||||
|
}
|
||||||
|
|
||||||
|
const deleteCategoryFun = async (id) => {
|
||||||
|
const res = await deleteCategory({id: id})
|
||||||
|
if (res.code === 0) {
|
||||||
|
ElMessage.success({type: 'success', message: '删除成功'})
|
||||||
|
await fetchCategories()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const confirmAddCategory = async () => {
|
||||||
|
categoryForm.value.validate(async valid => {
|
||||||
|
if (valid) {
|
||||||
|
const res = await addCategory(categoryFormData.value)
|
||||||
|
if (res.code === 0) {
|
||||||
|
ElMessage({type: 'success', message: '操作成功'})
|
||||||
|
await fetchCategories()
|
||||||
|
closeAddCategoryDialog()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const closeAddCategoryDialog = () => {
|
||||||
|
categoryDialogVisible.value = false
|
||||||
|
categoryFormData.value = {
|
||||||
|
ID: 0,
|
||||||
|
pid: 0,
|
||||||
|
name: ''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fetchCategories()
|
||||||
|
</script>
|
||||||
|
@@ -95,7 +95,6 @@
|
|||||||
return config.value.layout_side_collapsed_width
|
return config.value.layout_side_collapsed_width
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
watchEffect(() => {
|
watchEffect(() => {
|
||||||
active.value = route.meta.activeName || route.name
|
active.value = route.meta.activeName || route.name
|
||||||
})
|
})
|
||||||
@@ -123,8 +122,10 @@
|
|||||||
})
|
})
|
||||||
if (index === route.name) return
|
if (index === route.name) return
|
||||||
if (index.indexOf('http://') > -1 || index.indexOf('https://') > -1) {
|
if (index.indexOf('http://') > -1 || index.indexOf('https://') > -1) {
|
||||||
window.open(index)
|
window.open(index, '_blank')
|
||||||
} else {
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if (!top) {
|
if (!top) {
|
||||||
router.push({ name: index, query, params })
|
router.push({ name: index, query, params })
|
||||||
return
|
return
|
||||||
@@ -136,7 +137,7 @@
|
|||||||
}
|
}
|
||||||
const firstMenu = leftMenu.find((item) => !item.hidden && item.path.indexOf("http://") === -1 && item.path.indexOf("https://") === -1)
|
const firstMenu = leftMenu.find((item) => !item.hidden && item.path.indexOf("http://") === -1 && item.path.indexOf("https://") === -1)
|
||||||
router.push({ name: firstMenu.name, query, params })
|
router.push({ name: firstMenu.name, query, params })
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const toggleCollapse = () => {
|
const toggleCollapse = () => {
|
||||||
|
@@ -40,6 +40,10 @@
|
|||||||
const isCollapse = ref(false)
|
const isCollapse = ref(false)
|
||||||
const active = ref('')
|
const active = ref('')
|
||||||
watchEffect(() => {
|
watchEffect(() => {
|
||||||
|
if (route.name === 'Iframe') {
|
||||||
|
active.value = decodeURIComponent(route.query.url)
|
||||||
|
return
|
||||||
|
}
|
||||||
active.value = route.meta.activeName || route.name
|
active.value = route.meta.activeName || route.name
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -66,7 +70,18 @@
|
|||||||
})
|
})
|
||||||
if (index === route.name) return
|
if (index === route.name) return
|
||||||
if (index.indexOf('http://') > -1 || index.indexOf('https://') > -1) {
|
if (index.indexOf('http://') > -1 || index.indexOf('https://') > -1) {
|
||||||
window.open(index)
|
if (index === 'Iframe') {
|
||||||
|
query.url = decodeURIComponent(index)
|
||||||
|
router.push({
|
||||||
|
name: 'Iframe',
|
||||||
|
query,
|
||||||
|
params
|
||||||
|
})
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
window.open(index, '_blank')
|
||||||
|
return
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
router.push({ name: index, query, params })
|
router.push({ name: index, query, params })
|
||||||
}
|
}
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
unique-opened
|
unique-opened
|
||||||
@select="selectMenuItem"
|
@select="selectMenuItem"
|
||||||
>
|
>
|
||||||
<template v-for="item in routerStore.asyncRouters[0].children">
|
<template v-for="item in routerStore.asyncRouters[0]?.children || []">
|
||||||
<aside-component
|
<aside-component
|
||||||
v-if="!item.hidden"
|
v-if="!item.hidden"
|
||||||
:key="item.name"
|
:key="item.name"
|
||||||
@@ -65,6 +65,10 @@
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
watchEffect(() => {
|
watchEffect(() => {
|
||||||
|
if (route.name === 'Iframe') {
|
||||||
|
active.value = decodeURIComponent(route.query.url)
|
||||||
|
return
|
||||||
|
}
|
||||||
active.value = route.meta.activeName || route.name
|
active.value = route.meta.activeName || route.name
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -91,7 +95,18 @@
|
|||||||
})
|
})
|
||||||
if (index === route.name) return
|
if (index === route.name) return
|
||||||
if (index.indexOf('http://') > -1 || index.indexOf('https://') > -1) {
|
if (index.indexOf('http://') > -1 || index.indexOf('https://') > -1) {
|
||||||
window.open(index)
|
if (index === 'Iframe') {
|
||||||
|
query.url = decodeURIComponent(index)
|
||||||
|
router.push({
|
||||||
|
name: 'Iframe',
|
||||||
|
query,
|
||||||
|
params
|
||||||
|
})
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
window.open(index, '_blank')
|
||||||
|
return
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
router.push({ name: index, query, params })
|
router.push({ name: index, query, params })
|
||||||
}
|
}
|
||||||
|
70
web/src/view/layout/iframe.vue
Normal file
70
web/src/view/layout/iframe.vue
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
<template>
|
||||||
|
<div
|
||||||
|
class="bg-gray-50 text-slate-700 dark:text-slate-500 dark:bg-slate-800 w-screen h-screen"
|
||||||
|
>
|
||||||
|
<iframe
|
||||||
|
v-if="reloadFlag"
|
||||||
|
id="gva-base-load-dom"
|
||||||
|
class="gva-body-h bg-gray-50 dark:bg-slate-800 w-full border-t border-gray-200 dark:border-slate-700"
|
||||||
|
src="https://www.gin-vue-admin.com"
|
||||||
|
></iframe>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import useResponsive from '@/hooks/responsive'
|
||||||
|
import { emitter } from '@/utils/bus.js'
|
||||||
|
import { ref, onMounted, nextTick, reactive, watchEffect } from 'vue'
|
||||||
|
import { useRouter, useRoute } from 'vue-router'
|
||||||
|
import { useUserStore } from '@/pinia/modules/user'
|
||||||
|
import { useAppStore } from '@/pinia'
|
||||||
|
import { storeToRefs } from 'pinia'
|
||||||
|
const appStore = useAppStore()
|
||||||
|
const { isDark } = storeToRefs(appStore)
|
||||||
|
|
||||||
|
defineOptions({
|
||||||
|
name: 'GvaLayoutIframe'
|
||||||
|
})
|
||||||
|
|
||||||
|
useResponsive(true)
|
||||||
|
const font = reactive({
|
||||||
|
color: 'rgba(0, 0, 0, .15)'
|
||||||
|
})
|
||||||
|
|
||||||
|
watchEffect(() => {
|
||||||
|
font.color = isDark.value ? 'rgba(255,255,255, .15)' : 'rgba(0, 0, 0, .15)'
|
||||||
|
})
|
||||||
|
|
||||||
|
const router = useRouter()
|
||||||
|
const route = useRoute()
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
// 挂载一些通用的事件
|
||||||
|
emitter.on('reload', reload)
|
||||||
|
if (userStore.loadingInstance) {
|
||||||
|
userStore.loadingInstance.close()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const userStore = useUserStore()
|
||||||
|
|
||||||
|
const reloadFlag = ref(true)
|
||||||
|
let reloadTimer = null
|
||||||
|
const reload = async () => {
|
||||||
|
if (reloadTimer) {
|
||||||
|
window.clearTimeout(reloadTimer)
|
||||||
|
}
|
||||||
|
reloadTimer = window.setTimeout(async () => {
|
||||||
|
if (route.meta.keepAlive) {
|
||||||
|
reloadFlag.value = false
|
||||||
|
await nextTick()
|
||||||
|
reloadFlag.value = true
|
||||||
|
} else {
|
||||||
|
const title = route.meta.title
|
||||||
|
router.push({ name: 'Reload', params: { title } })
|
||||||
|
}
|
||||||
|
}, 400)
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss"></style>
|
@@ -74,8 +74,7 @@
|
|||||||
})
|
})
|
||||||
|
|
||||||
watchEffect(() => {
|
watchEffect(() => {
|
||||||
font.color =
|
font.color = isDark.value ? 'rgba(255,255,255, .15)' : 'rgba(0, 0, 0, .15)'
|
||||||
isDark.value ? 'rgba(255,255,255, .15)' : 'rgba(0, 0, 0, .15)'
|
|
||||||
})
|
})
|
||||||
|
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
|
@@ -12,18 +12,24 @@
|
|||||||
<div class="flex flex-col lg:flex-row items-start gap-8">
|
<div class="flex flex-col lg:flex-row items-start gap-8">
|
||||||
<!-- 左侧头像 -->
|
<!-- 左侧头像 -->
|
||||||
<div class="profile-avatar-wrapper flex-shrink-0 mx-auto lg:mx-0">
|
<div class="profile-avatar-wrapper flex-shrink-0 mx-auto lg:mx-0">
|
||||||
<ProfileAvatar
|
<SelectImage
|
||||||
v-model="userStore.userInfo.headerImg"
|
v-model="userStore.userInfo.headerImg"
|
||||||
@update:modelValue="handleAvatarChange"
|
file-type="image"
|
||||||
|
rounded
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 右侧信息 -->
|
<!-- 右侧信息 -->
|
||||||
<div class="flex-1 pt-20 w-full">
|
<div class="flex-1 pt-12 lg:pt-20 w-full">
|
||||||
<div class="flex flex-col lg:flex-row items-start lg:items-center justify-between gap-4">
|
<div
|
||||||
<div>
|
class="flex flex-col lg:flex-row items-start lg:items-start justify-between gap-4"
|
||||||
|
>
|
||||||
|
<div class="lg:mt-4">
|
||||||
<div class="flex items-center gap-4 mb-4">
|
<div class="flex items-center gap-4 mb-4">
|
||||||
<div v-if="!editFlag" class="text-2xl font-bold flex items-center gap-3 text-gray-800 dark:text-gray-100">
|
<div
|
||||||
|
v-if="!editFlag"
|
||||||
|
class="text-2xl font-bold flex items-center gap-3 text-gray-800 dark:text-gray-100"
|
||||||
|
>
|
||||||
{{ userStore.userInfo.nickName }}
|
{{ userStore.userInfo.nickName }}
|
||||||
<el-icon
|
<el-icon
|
||||||
class="cursor-pointer text-gray-400 hover:text-gray-600 dark:hover:text-gray-200 transition-colors duration-200"
|
class="cursor-pointer text-gray-400 hover:text-gray-600 dark:hover:text-gray-200 transition-colors duration-200"
|
||||||
@@ -32,29 +38,27 @@
|
|||||||
<edit />
|
<edit />
|
||||||
</el-icon>
|
</el-icon>
|
||||||
</div>
|
</div>
|
||||||
<div v-else class="flex items-center gap-3">
|
<div v-else class="flex items-center">
|
||||||
<el-input
|
<el-input v-model="nickName" class="w-48 mr-4" />
|
||||||
v-model="nickName"
|
<el-button type="primary" plain @click="enterEdit">
|
||||||
class="w-48"
|
确认
|
||||||
size="large"
|
|
||||||
/>
|
|
||||||
<el-button type="success" circle @click="enterEdit">
|
|
||||||
<el-icon><check /></el-icon>
|
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button type="danger" circle @click="closeEdit">
|
<el-button type="danger" plain @click="closeEdit">
|
||||||
<el-icon><close /></el-icon>
|
取消
|
||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex flex-col lg:flex-row items-start lg:items-center gap-4 lg:gap-8 text-gray-500 dark:text-gray-400">
|
<div
|
||||||
|
class="flex flex-col lg:flex-row items-start lg:items-center gap-4 lg:gap-8 text-gray-500 dark:text-gray-400"
|
||||||
|
>
|
||||||
<div class="flex items-center gap-2">
|
<div class="flex items-center gap-2">
|
||||||
<el-icon><location /></el-icon>
|
<el-icon><location /></el-icon>
|
||||||
<span>中国·北京市·朝阳区</span>
|
<span>中国·北京市·朝阳区</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex items-center gap-2">
|
<div class="flex items-center gap-2">
|
||||||
<el-icon><office-building /></el-icon>
|
<el-icon><office-building /></el-icon>
|
||||||
<span>北京反转极光科技有限公司</span>
|
<span>北京翻转极光科技有限公司</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex items-center gap-2">
|
<div class="flex items-center gap-2">
|
||||||
<el-icon><user /></el-icon>
|
<el-icon><user /></el-icon>
|
||||||
@@ -63,15 +67,11 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex gap-4 mt-4 lg:mt-0">
|
<div class="flex gap-4 mt-4">
|
||||||
<el-button type="primary" plain>
|
<el-button type="primary" plain icon="message">
|
||||||
<el-icon><message /></el-icon>
|
|
||||||
发送消息
|
发送消息
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button>
|
<el-button icon="share"> 分享主页 </el-button>
|
||||||
<el-icon><share /></el-icon>
|
|
||||||
分享主页
|
|
||||||
</el-button>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -83,13 +83,17 @@
|
|||||||
<div class="grid lg:grid-cols-12 md:grid-cols-1 gap-8">
|
<div class="grid lg:grid-cols-12 md:grid-cols-1 gap-8">
|
||||||
<!-- 左侧信息栏 -->
|
<!-- 左侧信息栏 -->
|
||||||
<div class="lg:col-span-4">
|
<div class="lg:col-span-4">
|
||||||
<div class="bg-white dark:bg-slate-800 rounded-xl p-6 mb-6 profile-card">
|
<div
|
||||||
|
class="bg-white dark:bg-slate-800 rounded-xl p-6 mb-6 profile-card"
|
||||||
|
>
|
||||||
<h2 class="text-lg font-semibold mb-4 flex items-center gap-2">
|
<h2 class="text-lg font-semibold mb-4 flex items-center gap-2">
|
||||||
<el-icon class="text-blue-500"><info-filled /></el-icon>
|
<el-icon class="text-blue-500"><info-filled /></el-icon>
|
||||||
基本信息
|
基本信息
|
||||||
</h2>
|
</h2>
|
||||||
<div class="space-y-4">
|
<div class="space-y-4">
|
||||||
<div class="flex items-center gap-3 text-gray-600 dark:text-gray-300">
|
<div
|
||||||
|
class="flex items-center gap-1 lg:gap-3 text-gray-600 dark:text-gray-300"
|
||||||
|
>
|
||||||
<el-icon class="text-blue-500"><phone /></el-icon>
|
<el-icon class="text-blue-500"><phone /></el-icon>
|
||||||
<span class="font-medium">手机号码:</span>
|
<span class="font-medium">手机号码:</span>
|
||||||
<span>{{ userStore.userInfo.phone || '未设置' }}</span>
|
<span>{{ userStore.userInfo.phone || '未设置' }}</span>
|
||||||
@@ -102,9 +106,11 @@
|
|||||||
修改
|
修改
|
||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex items-center gap-3 text-gray-600 dark:text-gray-300">
|
<div
|
||||||
|
class="flex items-center gap-1 lg:gap-3 text-gray-600 dark:text-gray-300"
|
||||||
|
>
|
||||||
<el-icon class="text-green-500"><message /></el-icon>
|
<el-icon class="text-green-500"><message /></el-icon>
|
||||||
<span class="font-medium">邮箱地址:</span>
|
<span class="font-medium flex-shrink-0">邮箱地址:</span>
|
||||||
<span>{{ userStore.userInfo.email || '未设置' }}</span>
|
<span>{{ userStore.userInfo.email || '未设置' }}</span>
|
||||||
<el-button
|
<el-button
|
||||||
link
|
link
|
||||||
@@ -115,7 +121,9 @@
|
|||||||
修改
|
修改
|
||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex items-center gap-3 text-gray-600 dark:text-gray-300">
|
<div
|
||||||
|
class="flex items-center gap-1 lg:gap-3 text-gray-600 dark:text-gray-300"
|
||||||
|
>
|
||||||
<el-icon class="text-purple-500"><lock /></el-icon>
|
<el-icon class="text-purple-500"><lock /></el-icon>
|
||||||
<span class="font-medium">账号密码:</span>
|
<span class="font-medium">账号密码:</span>
|
||||||
<span>已设置</span>
|
<span>已设置</span>
|
||||||
@@ -162,19 +170,35 @@
|
|||||||
</template>
|
</template>
|
||||||
<div class="grid grid-cols-2 md:grid-cols-4 gap-4 lg:gap-6 py-6">
|
<div class="grid grid-cols-2 md:grid-cols-4 gap-4 lg:gap-6 py-6">
|
||||||
<div class="stat-card">
|
<div class="stat-card">
|
||||||
<div class="text-2xl lg:text-4xl font-bold text-blue-500 mb-2">138</div>
|
<div
|
||||||
|
class="text-2xl lg:text-4xl font-bold text-blue-500 mb-2"
|
||||||
|
>
|
||||||
|
138
|
||||||
|
</div>
|
||||||
<div class="text-gray-500 text-sm">项目参与</div>
|
<div class="text-gray-500 text-sm">项目参与</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="stat-card">
|
<div class="stat-card">
|
||||||
<div class="text-2xl lg:text-4xl font-bold text-green-500 mb-2">2.3k</div>
|
<div
|
||||||
|
class="text-2xl lg:text-4xl font-bold text-green-500 mb-2"
|
||||||
|
>
|
||||||
|
2.3k
|
||||||
|
</div>
|
||||||
<div class="text-gray-500 text-sm">代码提交</div>
|
<div class="text-gray-500 text-sm">代码提交</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="stat-card">
|
<div class="stat-card">
|
||||||
<div class="text-2xl lg:text-4xl font-bold text-purple-500 mb-2">95%</div>
|
<div
|
||||||
|
class="text-2xl lg:text-4xl font-bold text-purple-500 mb-2"
|
||||||
|
>
|
||||||
|
95%
|
||||||
|
</div>
|
||||||
<div class="text-gray-500 text-sm">任务完成</div>
|
<div class="text-gray-500 text-sm">任务完成</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="stat-card">
|
<div class="stat-card">
|
||||||
<div class="text-2xl lg:text-4xl font-bold text-yellow-500 mb-2">12</div>
|
<div
|
||||||
|
class="text-2xl lg:text-4xl font-bold text-yellow-500 mb-2"
|
||||||
|
>
|
||||||
|
12
|
||||||
|
</div>
|
||||||
<div class="text-gray-500 text-sm">获得勋章</div>
|
<div class="text-gray-500 text-sm">获得勋章</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -196,7 +220,9 @@
|
|||||||
:hollow="true"
|
:hollow="true"
|
||||||
class="pb-6"
|
class="pb-6"
|
||||||
>
|
>
|
||||||
<h3 class="text-base font-medium mb-1">{{ activity.title }}</h3>
|
<h3 class="text-base font-medium mb-1">
|
||||||
|
{{ activity.title }}
|
||||||
|
</h3>
|
||||||
<p class="text-gray-500 text-sm">{{ activity.content }}</p>
|
<p class="text-gray-500 text-sm">{{ activity.content }}</p>
|
||||||
</el-timeline-item>
|
</el-timeline-item>
|
||||||
</el-timeline>
|
</el-timeline>
|
||||||
@@ -258,7 +284,7 @@
|
|||||||
<div class="flex gap-4">
|
<div class="flex gap-4">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="phoneForm.code"
|
v-model="phoneForm.code"
|
||||||
placeholder="请输入验证码"
|
placeholder="请输入验证码[模拟]"
|
||||||
class="flex-1"
|
class="flex-1"
|
||||||
>
|
>
|
||||||
<template #prefix>
|
<template #prefix>
|
||||||
@@ -302,7 +328,7 @@
|
|||||||
<div class="flex gap-4">
|
<div class="flex gap-4">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="emailForm.code"
|
v-model="emailForm.code"
|
||||||
placeholder="请输入验证码"
|
placeholder="请输入验证码[模拟]"
|
||||||
class="flex-1"
|
class="flex-1"
|
||||||
>
|
>
|
||||||
<template #prefix>
|
<template #prefix>
|
||||||
@@ -332,11 +358,10 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { setSelfInfo, changePassword } from '@/api/user.js'
|
import { setSelfInfo, changePassword } from '@/api/user.js'
|
||||||
import { reactive, ref } from 'vue'
|
import { reactive, ref, watch } from 'vue'
|
||||||
import { ElMessage } from 'element-plus'
|
import { ElMessage } from 'element-plus'
|
||||||
import { useUserStore } from '@/pinia/modules/user'
|
import { useUserStore } from '@/pinia/modules/user'
|
||||||
import ProfileAvatar from '@/components/Avatar/ProfileAvatar.vue'
|
import SelectImage from '@/components/selectImage/selectImage.vue'
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: 'Person'
|
name: 'Person'
|
||||||
})
|
})
|
||||||
@@ -486,12 +511,16 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleAvatarChange = async (newUrl) => {
|
watch(() => userStore.userInfo.headerImg, async(val) => {
|
||||||
const res = await setSelfInfo({ headerImg: newUrl })
|
const res = await setSelfInfo({ headerImg: val })
|
||||||
if (res.code === 0) {
|
if (res.code === 0) {
|
||||||
userStore.ResetUserInfo({ headerImg: newUrl })
|
userStore.ResetUserInfo({ headerImg: val })
|
||||||
|
ElMessage({
|
||||||
|
type: 'success',
|
||||||
|
message: '设置成功',
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
})
|
||||||
|
|
||||||
// 添加活动数据
|
// 添加活动数据
|
||||||
const activities = [
|
const activities = [
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
|
<warning-bar title="获取参数且缓存方法已在前端utils/params 已经封装完成 不必自己书写 使用方法查看文件内注释" />
|
||||||
<div class="gva-search-box">
|
<div class="gva-search-box">
|
||||||
<el-form
|
<el-form
|
||||||
ref="elSearchFormRef"
|
ref="elSearchFormRef"
|
||||||
@@ -231,7 +232,7 @@
|
|||||||
<p class="mb-2 text-sm text-gray-600">
|
<p class="mb-2 text-sm text-gray-600">
|
||||||
前端可以通过引入
|
前端可以通过引入
|
||||||
<code class="bg-blue-100 px-1 py-0.5 rounded"
|
<code class="bg-blue-100 px-1 py-0.5 rounded"
|
||||||
>import { getParams } from '@/utils/dictionary'</code
|
>import { getParams } from '@/utils/params'</code
|
||||||
>
|
>
|
||||||
然后通过
|
然后通过
|
||||||
<code class="bg-blue-100 px-1 py-0.5 rounded"
|
<code class="bg-blue-100 px-1 py-0.5 rounded"
|
||||||
@@ -297,6 +298,7 @@
|
|||||||
import { formatDate } from '@/utils/format'
|
import { formatDate } from '@/utils/format'
|
||||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||||
import { ref, reactive } from 'vue'
|
import { ref, reactive } from 'vue'
|
||||||
|
import WarningBar from "@/components/warningBar/warningBar.vue";
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: 'SysParams'
|
name: 'SysParams'
|
||||||
|
@@ -115,5 +115,5 @@
|
|||||||
ElMessage.success('复制成功')
|
ElMessage.success('复制成功')
|
||||||
}
|
}
|
||||||
|
|
||||||
defineExpose({ copy })
|
defineExpose({ copy, selectText })
|
||||||
</script>
|
</script>
|
||||||
|
@@ -329,142 +329,159 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
<el-row>
|
|
||||||
<el-col :span="3">
|
|
||||||
<el-form-item>
|
|
||||||
<template #label>
|
|
||||||
<el-tooltip
|
|
||||||
content="注:会自动在结构体global.Model其中包含主键和软删除相关操作配置"
|
|
||||||
placement="bottom"
|
|
||||||
effect="light"
|
|
||||||
>
|
|
||||||
<div>
|
|
||||||
使用GVA结构 <el-icon><QuestionFilled /></el-icon>
|
|
||||||
</div>
|
|
||||||
</el-tooltip>
|
|
||||||
</template>
|
|
||||||
<el-checkbox v-model="form.gvaModel" @change="useGva" />
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="3">
|
|
||||||
<el-form-item>
|
|
||||||
<template #label>
|
|
||||||
<el-tooltip
|
|
||||||
content="注:把自动生成的API注册进数据库"
|
|
||||||
placement="bottom"
|
|
||||||
effect="light"
|
|
||||||
>
|
|
||||||
<div>
|
|
||||||
自动创建API <el-icon><QuestionFilled /></el-icon>
|
|
||||||
</div>
|
|
||||||
</el-tooltip>
|
|
||||||
</template>
|
|
||||||
<el-checkbox v-model="form.autoCreateApiToSql" />
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="3">
|
|
||||||
<el-form-item>
|
|
||||||
<template #label>
|
|
||||||
<el-tooltip
|
|
||||||
content="注:把自动生成的菜单注册进数据库"
|
|
||||||
placement="bottom"
|
|
||||||
effect="light"
|
|
||||||
>
|
|
||||||
<div>
|
|
||||||
自动创建菜单 <el-icon><QuestionFilled /></el-icon>
|
|
||||||
</div>
|
|
||||||
</el-tooltip>
|
|
||||||
</template>
|
|
||||||
<el-checkbox v-model="form.autoCreateMenuToSql" />
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="3">
|
|
||||||
<el-form-item>
|
|
||||||
<template #label>
|
|
||||||
<el-tooltip
|
|
||||||
content="注:自动同步数据库表结构,如果不需要可以选择关闭。"
|
|
||||||
placement="bottom"
|
|
||||||
effect="light"
|
|
||||||
>
|
|
||||||
<div>
|
|
||||||
同步表结构 <el-icon><QuestionFilled /></el-icon>
|
|
||||||
</div>
|
|
||||||
</el-tooltip>
|
|
||||||
</template>
|
|
||||||
<el-checkbox v-model="form.autoMigrate" />
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="3">
|
|
||||||
<el-form-item>
|
|
||||||
<template #label>
|
|
||||||
<el-tooltip
|
|
||||||
content="注:会自动产生页面内的按钮权限配置,若不在角色管理中进行按钮分配则按钮不可见"
|
|
||||||
placement="bottom"
|
|
||||||
effect="light"
|
|
||||||
>
|
|
||||||
<div>
|
|
||||||
创建按钮权限 <el-icon><QuestionFilled /></el-icon>
|
|
||||||
</div>
|
|
||||||
</el-tooltip>
|
|
||||||
</template>
|
|
||||||
<el-checkbox v-model="form.autoCreateBtnAuth" />
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="3">
|
|
||||||
<el-form-item>
|
|
||||||
<template #label>
|
|
||||||
<el-tooltip
|
|
||||||
content="注:会自动在结构体添加 created_by updated_by deleted_by,方便用户进行资源权限控制"
|
|
||||||
placement="bottom"
|
|
||||||
effect="light"
|
|
||||||
>
|
|
||||||
<div>
|
|
||||||
创建资源标识 <el-icon><QuestionFilled /></el-icon>
|
|
||||||
</div>
|
|
||||||
</el-tooltip>
|
|
||||||
</template>
|
|
||||||
<el-checkbox v-model="form.autoCreateResource" />
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="3">
|
|
||||||
<el-form-item>
|
|
||||||
<template #label>
|
|
||||||
<el-tooltip
|
|
||||||
content="注:使用基础模板将不会生成任何结构体和CURD,仅仅配置enter等属性方便自行开发非CURD逻辑"
|
|
||||||
placement="bottom"
|
|
||||||
effect="light"
|
|
||||||
>
|
|
||||||
<div>
|
|
||||||
基础模板 <el-icon><QuestionFilled /></el-icon>
|
|
||||||
</div>
|
|
||||||
</el-tooltip>
|
|
||||||
</template>
|
|
||||||
<el-checkbox v-model="form.onlyTemplate" />
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="9">
|
|
||||||
<el-form-item>
|
|
||||||
<template #label>
|
|
||||||
<el-tooltip
|
|
||||||
content="注:会自动创建parentID来进行父子关系关联,仅支持主键为int类型"
|
|
||||||
placement="bottom"
|
|
||||||
effect="light"
|
|
||||||
>
|
|
||||||
<div>
|
|
||||||
树型结构 <el-icon><QuestionFilled /></el-icon>
|
|
||||||
</div>
|
|
||||||
</el-tooltip>
|
|
||||||
</template>
|
|
||||||
<div class="flex gap-2 items-center">
|
|
||||||
<el-checkbox v-model="form.isTree" />
|
|
||||||
<el-input v-model="form.treeJson" :disabled="!form.isTree" placeholder="前端展示json属性"></el-input>
|
|
||||||
</div>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
</el-row>
|
|
||||||
</el-form>
|
</el-form>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="gva-search-box">
|
||||||
|
<el-collapse class="no-border-collapse">
|
||||||
|
<el-collapse-item>
|
||||||
|
<template #title>
|
||||||
|
<div class="text-lg text-gray-600 font-normal">
|
||||||
|
专家模式
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<template #icon="{ isActive }">
|
||||||
|
<span class="text-lg ml-auto mr-4 font-normal">
|
||||||
|
{{ isActive ? '收起' : '展开' }}
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
<div class="p-4">
|
||||||
|
<!-- 基础设置组 -->
|
||||||
|
<div class="border-b border-gray-200 last:border-0">
|
||||||
|
<h3 class="text-lg font-medium mb-4 text-gray-700">基础设置</h3>
|
||||||
|
<el-row :gutter="20">
|
||||||
|
<el-col :span="3">
|
||||||
|
<el-tooltip
|
||||||
|
content="注:会自动在结构体global.Model其中包含主键和软删除相关操作配置"
|
||||||
|
placement="top"
|
||||||
|
effect="light"
|
||||||
|
>
|
||||||
|
<el-form-item label="使用GVA结构">
|
||||||
|
<el-checkbox v-model="form.gvaModel" @change="useGva" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-tooltip>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="3">
|
||||||
|
<el-tooltip
|
||||||
|
content="注:会自动产生页面内的按钮权限配置,若不在角色管理中进行按钮分配则按钮不可见"
|
||||||
|
placement="top"
|
||||||
|
effect="light"
|
||||||
|
>
|
||||||
|
<el-form-item label="创建按钮权限">
|
||||||
|
<el-checkbox :disabled="!form.generateWeb" v-model="form.autoCreateBtnAuth" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-tooltip>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="3">
|
||||||
|
<el-form-item label="生成前端">
|
||||||
|
<el-checkbox v-model="form.generateWeb" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="3">
|
||||||
|
<el-form-item label="生成后端">
|
||||||
|
<el-checkbox v-model="form.generateServer" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 自动化设置组 -->
|
||||||
|
<div class="border-b border-gray-200 last:border-0">
|
||||||
|
<h3 class="text-lg font-medium mb-4 text-gray-700">自动化设置</h3>
|
||||||
|
<el-row :gutter="20">
|
||||||
|
<el-col :span="3">
|
||||||
|
<el-tooltip
|
||||||
|
content="注:把自动生成的API注册进数据库"
|
||||||
|
placement="top"
|
||||||
|
effect="light"
|
||||||
|
>
|
||||||
|
<el-form-item label="自动创建API">
|
||||||
|
<el-checkbox :disabled="!form.generateServer" v-model="form.autoCreateApiToSql" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-tooltip>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="3">
|
||||||
|
<el-tooltip
|
||||||
|
content="注:把自动生成的菜单注册进数据库"
|
||||||
|
placement="top"
|
||||||
|
effect="light"
|
||||||
|
>
|
||||||
|
<el-form-item label="自动创建菜单">
|
||||||
|
<el-checkbox :disabled="!form.generateWeb" v-model="form.autoCreateMenuToSql" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-tooltip>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="3">
|
||||||
|
<el-tooltip
|
||||||
|
content="注:自动同步数据库表结构,如果不需要可以选择关闭"
|
||||||
|
placement="top"
|
||||||
|
effect="light"
|
||||||
|
>
|
||||||
|
<el-form-item label="同步表结构">
|
||||||
|
<el-checkbox :disabled="!form.generateServer" v-model="form.autoMigrate" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-tooltip>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 高级设置组 -->
|
||||||
|
<div class="border-b border-gray-200 last:border-0">
|
||||||
|
<h3 class="text-lg font-medium mb-4 text-gray-700">高级设置</h3>
|
||||||
|
<el-row :gutter="20">
|
||||||
|
<el-col :span="3">
|
||||||
|
<el-tooltip
|
||||||
|
content="注:会自动在结构体添加 created_by updated_by deleted_by,方便用户进行资源权限控制"
|
||||||
|
placement="top"
|
||||||
|
effect="light"
|
||||||
|
>
|
||||||
|
<el-form-item label="创建资源标识">
|
||||||
|
<el-checkbox v-model="form.autoCreateResource" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-tooltip>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="3">
|
||||||
|
<el-tooltip
|
||||||
|
content="注:使用基础模板将不会生成任何结构体和CURD,仅仅配置enter等属性方便自行开发非CURD逻辑"
|
||||||
|
placement="top"
|
||||||
|
effect="light"
|
||||||
|
>
|
||||||
|
<el-form-item label="基础模板">
|
||||||
|
<el-checkbox v-model="form.onlyTemplate" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-tooltip>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 树形结构设置 -->
|
||||||
|
<div class="last:pb-0">
|
||||||
|
<h3 class="text-lg font-medium mb-4 text-gray-700">树形结构设置</h3>
|
||||||
|
<el-row :gutter="20" align="middle">
|
||||||
|
<el-col :span="24">
|
||||||
|
<el-form-item label="树型结构">
|
||||||
|
<div class="flex items-center gap-4">
|
||||||
|
<el-tooltip
|
||||||
|
content="注:会自动创建parentID来进行父子关系关联,仅支持主键为int类型"
|
||||||
|
placement="top"
|
||||||
|
effect="light"
|
||||||
|
>
|
||||||
|
<el-checkbox v-model="form.isTree" />
|
||||||
|
</el-tooltip>
|
||||||
|
<el-input
|
||||||
|
v-model="form.treeJson"
|
||||||
|
:disabled="!form.isTree"
|
||||||
|
placeholder="前端展示json属性"
|
||||||
|
class="flex-1"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-collapse-item>
|
||||||
|
</el-collapse>
|
||||||
|
</div>
|
||||||
<!-- 组件列表 -->
|
<!-- 组件列表 -->
|
||||||
<div class="gva-table-box">
|
<div class="gva-table-box">
|
||||||
<div class="gva-btn-list">
|
<div class="gva-btn-list">
|
||||||
@@ -929,6 +946,10 @@
|
|||||||
for (let key in json) {
|
for (let key in json) {
|
||||||
form.value[key] = json[key]
|
form.value[key] = json[key]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
form.value.generateServer = true
|
||||||
|
form.value.generateWeb = true
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1118,6 +1139,8 @@
|
|||||||
autoCreateResource: false,
|
autoCreateResource: false,
|
||||||
onlyTemplate: false,
|
onlyTemplate: false,
|
||||||
isTree: false,
|
isTree: false,
|
||||||
|
generateWeb:true,
|
||||||
|
generateServer:true,
|
||||||
treeJson: "",
|
treeJson: "",
|
||||||
fields: []
|
fields: []
|
||||||
})
|
})
|
||||||
@@ -1239,6 +1262,13 @@
|
|||||||
})
|
})
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
if(!form.value.generateWeb && !form.value.generateServer){
|
||||||
|
ElMessage({
|
||||||
|
type: 'error',
|
||||||
|
message: '请至少选择一个生成项'
|
||||||
|
})
|
||||||
|
return false
|
||||||
|
}
|
||||||
if (!form.value.onlyTemplate) {
|
if (!form.value.onlyTemplate) {
|
||||||
if (form.value.fields.length <= 0) {
|
if (form.value.fields.length <= 0) {
|
||||||
ElMessage({
|
ElMessage({
|
||||||
@@ -1403,6 +1433,8 @@
|
|||||||
form.value.abbreviation = toLowerCase(tbHump)
|
form.value.abbreviation = toLowerCase(tbHump)
|
||||||
form.value.description = tbHump + '表'
|
form.value.description = tbHump + '表'
|
||||||
form.value.autoCreateApiToSql = true
|
form.value.autoCreateApiToSql = true
|
||||||
|
form.value.generateServer = true
|
||||||
|
form.value.generateWeb = true
|
||||||
form.value.fields = []
|
form.value.fields = []
|
||||||
res.data.columns &&
|
res.data.columns &&
|
||||||
res.data.columns.forEach((item) => {
|
res.data.columns.forEach((item) => {
|
||||||
@@ -1520,6 +1552,20 @@
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
watch(()=>form.value.generateServer,()=>{
|
||||||
|
if(!form.value.generateServer){
|
||||||
|
form.value.autoCreateApiToSql = false
|
||||||
|
form.value.autoMigrate = false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
watch(()=>form.value.generateWeb,()=>{
|
||||||
|
if(!form.value.generateWeb){
|
||||||
|
form.value.autoCreateMenuToSql = false
|
||||||
|
form.value.autoCreateBtnAuth = false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
const catchData = () => {
|
const catchData = () => {
|
||||||
window.sessionStorage.setItem('autoCode', JSON.stringify(form.value))
|
window.sessionStorage.setItem('autoCode', JSON.stringify(form.value))
|
||||||
}
|
}
|
||||||
@@ -1607,3 +1653,18 @@
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.no-border-collapse{
|
||||||
|
@apply border-none;
|
||||||
|
.el-collapse-item__header{
|
||||||
|
@apply border-none;
|
||||||
|
}
|
||||||
|
.el-collapse-item__wrap{
|
||||||
|
@apply border-none;
|
||||||
|
}
|
||||||
|
.el-collapse-item__content{
|
||||||
|
@apply pb-0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
Reference in New Issue
Block a user