From 232aaad090944c7d99851a35cbf0a36e3cc28b55 Mon Sep 17 00:00:00 2001
From: SliverHorn <503551462@qq.com>
Date: Sat, 14 Oct 2023 13:59:30 +0800
Subject: [PATCH] =?UTF-8?q?feature:=20mongoDB=20=E6=94=AF=E6=8C=81=20(#156?=
=?UTF-8?q?5)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* feature: mongoDB 支持
* update: 修改错误mongo索引示例
* update: 在system添加use-mongo 开关开启或者关闭mongo
---
server/config.docker.yaml | 17 +++
server/config.yaml | 17 +++
server/config/config.go | 1 +
server/config/mongo.go | 40 +++++++
server/config/system.go | 1 +
server/core/server.go | 7 +-
server/global/global.go | 2 +
server/go.mod | 8 ++
server/go.sum | 25 ++++
server/initialize/internal/mongo.go | 29 +++++
server/initialize/mongo.go | 130 +++++++++++++++++++++
web/src/view/systemTools/system/system.vue | 69 +++++++++++
12 files changed, 345 insertions(+), 1 deletion(-)
create mode 100644 server/config/mongo.go
create mode 100644 server/initialize/internal/mongo.go
create mode 100644 server/initialize/mongo.go
diff --git a/server/config.docker.yaml b/server/config.docker.yaml
index 5d6e1eb62..a7783716f 100644
--- a/server/config.docker.yaml
+++ b/server/config.docker.yaml
@@ -23,6 +23,22 @@ redis:
addr: 177.7.0.14:6379
password: ""
+# mongo configuration
+mongo:
+ coll: ''
+ options: ''
+ database: ''
+ username: ''
+ password: ''
+ min-pool-size: 0
+ max-pool-size: 100
+ socket-timeout-ms: 0
+ connect-timeout-ms: 0
+ is-zap: false
+ hosts:
+ - host: ''
+ port: ''
+
# email configuration
email:
to: xxx@qq.com
@@ -40,6 +56,7 @@ system:
db-type: mysql
oss-type: local # 控制oss选择走本地还是 七牛等其他仓 自行增加其他oss仓可以在 server/utils/upload/upload.go 中 NewOss函数配置
use-redis: false # 使用redis
+ use-mongo: false # 使用mongo
use-multipoint: false
# IP限制次数 一个小时15000次
iplimit-count: 15000
diff --git a/server/config.yaml b/server/config.yaml
index 44e88afe4..787075940 100644
--- a/server/config.yaml
+++ b/server/config.yaml
@@ -23,6 +23,22 @@ redis:
addr: 127.0.0.1:6379
password: ""
+# mongo configuration
+mongo:
+ coll: ''
+ options: ''
+ database: ''
+ username: ''
+ password: ''
+ min-pool-size: 0
+ max-pool-size: 100
+ socket-timeout-ms: 0
+ connect-timeout-ms: 0
+ is-zap: false
+ hosts:
+ - host: ''
+ port: ''
+
# email configuration
email:
to: xxx@qq.com
@@ -40,6 +56,7 @@ system:
db-type: mysql
oss-type: local # 控制oss选择走本地还是 七牛等其他仓 自行增加其他oss仓可以在 server/utils/upload/upload.go 中 NewOss函数配置
use-redis: false # 使用redis
+ use-mongo: false # 使用mongo
use-multipoint: false
# IP限制次数 一个小时15000次
iplimit-count: 15000
diff --git a/server/config/config.go b/server/config/config.go
index f88c14bc8..892c28a22 100644
--- a/server/config/config.go
+++ b/server/config/config.go
@@ -4,6 +4,7 @@ type Server struct {
JWT JWT `mapstructure:"jwt" json:"jwt" yaml:"jwt"`
Zap Zap `mapstructure:"zap" json:"zap" yaml:"zap"`
Redis Redis `mapstructure:"redis" json:"redis" yaml:"redis"`
+ Mongo Mongo `json:"mongo" yaml:"mongo" mapstructure:"mongo"`
Email Email `mapstructure:"email" json:"email" yaml:"email"`
System System `mapstructure:"system" json:"system" yaml:"system"`
Captcha Captcha `mapstructure:"captcha" json:"captcha" yaml:"captcha"`
diff --git a/server/config/mongo.go b/server/config/mongo.go
new file mode 100644
index 000000000..fe4f0e096
--- /dev/null
+++ b/server/config/mongo.go
@@ -0,0 +1,40 @@
+package config
+
+import (
+ "fmt"
+ "strings"
+)
+
+type Mongo struct {
+ Coll string `json:"coll" yaml:"coll" mapstructure:"coll"` // collection name
+ Options string `json:"options" yaml:"options" mapstructure:"options"` // mongodb options
+ Database string `json:"database" yaml:"database" mapstructure:"database"` // database name
+ Username string `json:"username" yaml:"username" mapstructure:"username"` // 用户名
+ Password string `json:"password" yaml:"password" mapstructure:"password"` // 密码
+ MinPoolSize uint64 `json:"min-pool-size" yaml:"min-pool-size" mapstructure:"min-pool-size"` // 最小连接池
+ MaxPoolSize uint64 `json:"max-pool-size" yaml:"max-pool-size" mapstructure:"max-pool-size"` // 最大连接池
+ SocketTimeoutMs int64 `json:"socket-timeout-ms" yaml:"socket-timeout-ms" mapstructure:"socket-timeout-ms"` // socket超时时间
+ ConnectTimeoutMs int64 `json:"connect-timeout-ms" yaml:"connect-timeout-ms" mapstructure:"connect-timeout-ms"` // 连接超时时间
+ IsZap bool `json:"is-zap" yaml:"is-zap" mapstructure:"is-zap"` // 是否开启zap日志
+ Hosts []*MongoHost `json:"hosts" yaml:"hosts" mapstructure:"hosts"` // 主机列表
+}
+
+type MongoHost struct {
+ Host string `json:"host" yaml:"host" mapstructure:"host"` // ip地址
+ Port string `json:"port" yaml:"port" mapstructure:"port"` // 端口
+}
+
+// Uri .
+func (x *Mongo) Uri() string {
+ length := len(x.Hosts)
+ hosts := make([]string, 0, length)
+ for i := 0; i < length; i++ {
+ if x.Hosts[i].Host != "" && x.Hosts[i].Port != "" {
+ hosts = append(hosts, x.Hosts[i].Host+":"+x.Hosts[i].Port)
+ }
+ }
+ if x.Options != "" {
+ return fmt.Sprintf("mongodb://%s/%s?%s", strings.Join(hosts, ","), x.Database, x.Options)
+ }
+ return fmt.Sprintf("mongodb://%s/%s", strings.Join(hosts, ","), x.Database)
+}
diff --git a/server/config/system.go b/server/config/system.go
index bb1cfceb4..7ab338762 100644
--- a/server/config/system.go
+++ b/server/config/system.go
@@ -10,4 +10,5 @@ type System struct {
LimitTimeIP int `mapstructure:"iplimit-time" json:"iplimit-time" yaml:"iplimit-time"`
UseMultipoint bool `mapstructure:"use-multipoint" json:"use-multipoint" yaml:"use-multipoint"` // 多点登录拦截
UseRedis bool `mapstructure:"use-redis" json:"use-redis" yaml:"use-redis"` // 使用redis
+ UseMongo bool `mapstructure:"use-mongo" json:"use-mongo" yaml:"use-mongo"` // 使用redis
}
diff --git a/server/core/server.go b/server/core/server.go
index ff71dd0a2..8161e620d 100644
--- a/server/core/server.go
+++ b/server/core/server.go
@@ -19,7 +19,12 @@ func RunWindowsServer() {
// 初始化redis服务
initialize.Redis()
}
-
+ if global.GVA_CONFIG.System.UseMongo {
+ err := initialize.Mongo.Initialization()
+ if err != nil {
+ zap.L().Error(fmt.Sprintf("%+v", err))
+ }
+ }
// 从db加载jwt数据
if global.GVA_DB != nil {
system.LoadAll()
diff --git a/server/global/global.go b/server/global/global.go
index 130b7e548..f7f93c2bb 100644
--- a/server/global/global.go
+++ b/server/global/global.go
@@ -1,6 +1,7 @@
package global
import (
+ "github.com/qiniu/qmgo"
"sync"
"github.com/flipped-aurora/gin-vue-admin/server/utils/timer"
@@ -21,6 +22,7 @@ var (
GVA_DB *gorm.DB
GVA_DBList map[string]*gorm.DB
GVA_REDIS *redis.Client
+ GVA_MONGO *qmgo.QmgoClient
GVA_CONFIG config.Server
GVA_VP *viper.Viper
// GVA_LOG *oplogging.Logger
diff --git a/server/go.mod b/server/go.mod
index 6e93a532f..f5270e164 100644
--- a/server/go.mod
+++ b/server/go.mod
@@ -22,6 +22,7 @@ require (
github.com/otiai10/copy v1.7.0
github.com/pkg/errors v0.9.1
github.com/qiniu/api.v7/v7 v7.4.1
+ github.com/qiniu/qmgo v1.1.8
github.com/redis/go-redis/v9 v9.0.5
github.com/robfig/cron/v3 v3.0.1
github.com/sashabaranov/go-openai v1.14.1
@@ -34,6 +35,7 @@ require (
github.com/swaggo/swag v1.16.1
github.com/tencentyun/cos-go-sdk-v5 v0.7.42
github.com/unrolled/secure v1.13.0
+ go.mongodb.org/mongo-driver v1.12.1
go.uber.org/zap v1.24.0
golang.org/x/crypto v0.10.0
golang.org/x/sync v0.3.0
@@ -70,6 +72,7 @@ require (
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect
github.com/golang-sql/sqlexp v0.1.0 // indirect
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
+ github.com/golang/snappy v0.0.1 // indirect
github.com/google/go-querystring v1.0.0 // indirect
github.com/google/uuid v1.3.0 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
@@ -92,6 +95,7 @@ require (
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
+ github.com/montanaflynn/stats v0.7.0 // indirect
github.com/mozillazg/go-httpheader v0.2.1 // indirect
github.com/pelletier/go-toml/v2 v2.0.8 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
@@ -108,7 +112,11 @@ require (
github.com/tklauser/numcpus v0.6.0 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.2.11 // indirect
+ github.com/xdg-go/pbkdf2 v1.0.0 // indirect
+ github.com/xdg-go/scram v1.1.2 // indirect
+ github.com/xdg-go/stringprep v1.0.4 // indirect
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect
+ github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
github.com/yusufpapurcu/wmi v1.2.3 // indirect
go.uber.org/atomic v1.9.0 // indirect
go.uber.org/multierr v1.8.0 // indirect
diff --git a/server/go.sum b/server/go.sum
index cea4cb1c5..1b31a98db 100644
--- a/server/go.sum
+++ b/server/go.sum
@@ -138,6 +138,7 @@ github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
+github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js=
github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU=
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
@@ -191,6 +192,8 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
+github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
+github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
@@ -323,6 +326,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/mojocn/base64Captcha v1.3.5 h1:Qeilr7Ta6eDtG4S+tQuZ5+hO+QHbiGAJdi4PfoagaA0=
github.com/mojocn/base64Captcha v1.3.5/go.mod h1:/tTTXn4WTpX9CfrmipqRytCpJ27Uw3G6I7NcP2WwcmY=
+github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
+github.com/montanaflynn/stats v0.7.0 h1:r3y12KyNxj/Sb/iOE46ws+3mS1+MZca1wlHQFPsY/JU=
github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow=
github.com/mozillazg/go-httpheader v0.2.1 h1:geV7TrjbL8KXSyvghnFm+NyTux/hxwueTSrwhe88TQQ=
github.com/mozillazg/go-httpheader v0.2.1/go.mod h1:jJ8xECTlalr6ValeXYdOF8fFUISeBAdw6E61aqQma60=
@@ -348,6 +353,8 @@ github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:Om
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/qiniu/api.v7/v7 v7.4.1 h1:BnNUBimLk6nrA/mIwsww9yJRupmViSsb1ndLMC7a9OY=
github.com/qiniu/api.v7/v7 v7.4.1/go.mod h1:VE5oC5rkE1xul0u1S2N0b2Uxq9/6hZzhyqjgK25XDcM=
+github.com/qiniu/qmgo v1.1.8 h1:E64M+P59aqQpXKI24ClVtluYkLaJLkkeD2hTVhrdMks=
+github.com/qiniu/qmgo v1.1.8/go.mod h1:QvZkzWNEv0buWPx0kdZsSs6URhESVubacxFPlITmvB8=
github.com/redis/go-redis/v9 v9.0.5 h1:CuQcn5HIEeK7BgElubPP8CGtE0KakrnbBSTLjathl5o=
github.com/redis/go-redis/v9 v9.0.5/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk=
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
@@ -380,6 +387,7 @@ github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc=
github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
@@ -406,6 +414,7 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.563/go.mod
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.42 h1:Up1704BJjI5orycXKjpVpvuOInt9GC5pqY4knyE9Uds=
github.com/tencentyun/cos-go-sdk-v5 v0.7.42/go.mod h1:LUFnaqRmGk6pEHOaRmdn2dCZR2j0cSsM5xowWFPTPao=
+github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM=
github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI=
github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms=
@@ -418,8 +427,18 @@ github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4d
github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
github.com/unrolled/secure v1.13.0 h1:sdr3Phw2+f8Px8HE5sd1EHdj1aV3yUwed/uZXChLFsk=
github.com/unrolled/secure v1.13.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/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/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/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8=
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs=
+github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA=
+github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
@@ -427,6 +446,9 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw=
github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
+go.mongodb.org/mongo-driver v1.11.6/go.mod h1:G9TgswdsWjX4tmDA5zfs2+6AEPpYJwqblyjsfuh8oXY=
+go.mongodb.org/mongo-driver v1.12.1 h1:nLkghSU8fQNaK7oUmDhQFsnrtcoNy7Z6LVFKsEecqgE=
+go.mongodb.org/mongo-driver v1.12.1/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
@@ -455,6 +477,7 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
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.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
@@ -558,6 +581,7 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-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.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
@@ -627,6 +651,7 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
golang.org/x/text v0.4.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=
diff --git a/server/initialize/internal/mongo.go b/server/initialize/internal/mongo.go
new file mode 100644
index 000000000..c4992d712
--- /dev/null
+++ b/server/initialize/internal/mongo.go
@@ -0,0 +1,29 @@
+package internal
+
+import (
+ "context"
+ "fmt"
+ "github.com/qiniu/qmgo/options"
+ "go.mongodb.org/mongo-driver/event"
+ opt "go.mongodb.org/mongo-driver/mongo/options"
+ "go.uber.org/zap"
+)
+
+var Mongo = new(mongo)
+
+type mongo struct{}
+
+func (m *mongo) GetClientOptions() []options.ClientOptions {
+ cmdMonitor := &event.CommandMonitor{
+ Started: func(ctx context.Context, event *event.CommandStartedEvent) {
+ zap.L().Info(fmt.Sprintf("[MongoDB][RequestID:%d][database:%s] %s\n", event.RequestID, event.DatabaseName, event.Command), zap.String("business", "mongo"))
+ },
+ Succeeded: func(ctx context.Context, event *event.CommandSucceededEvent) {
+ zap.L().Info(fmt.Sprintf("[MongoDB][RequestID:%d] [%s] %s\n", event.RequestID, event.Duration.String(), event.Reply), zap.String("business", "mongo"))
+ },
+ Failed: func(ctx context.Context, event *event.CommandFailedEvent) {
+ zap.L().Error(fmt.Sprintf("[MongoDB][RequestID:%d] [%s] %s\n", event.RequestID, event.Duration.String(), event.Failure), zap.String("business", "mongo"))
+ },
+ }
+ return []options.ClientOptions{{ClientOptions: &opt.ClientOptions{Monitor: cmdMonitor}}}
+}
diff --git a/server/initialize/mongo.go b/server/initialize/mongo.go
new file mode 100644
index 000000000..99d255fc1
--- /dev/null
+++ b/server/initialize/mongo.go
@@ -0,0 +1,130 @@
+package initialize
+
+import (
+ "context"
+ "github.com/flipped-aurora/gin-vue-admin/server/global"
+ "github.com/flipped-aurora/gin-vue-admin/server/initialize/internal"
+ "github.com/pkg/errors"
+ "github.com/qiniu/qmgo"
+ "github.com/qiniu/qmgo/options"
+ "go.mongodb.org/mongo-driver/bson"
+ "strings"
+)
+
+var Mongo = new(mongo)
+
+type (
+ mongo struct{}
+ Index struct {
+ V any `bson:"v"`
+ Ns any `bson:"ns"`
+ Key []bson.E `bson:"key"`
+ Name string `bson:"name"`
+ }
+)
+
+func (m *mongo) Indexes(ctx context.Context) error {
+ // 表名:索引列表 列: "表名": [][]string{{"index1", "index2"}}
+ indexMap := map[string][][]string{}
+ for collection, indexes := range indexMap {
+ err := m.CreateIndexes(ctx, collection, indexes)
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+func (m *mongo) Initialization() error {
+ var opts []options.ClientOptions
+ if global.GVA_CONFIG.Mongo.IsZap {
+ opts = internal.Mongo.GetClientOptions()
+ }
+ ctx := context.Background()
+ client, err := qmgo.Open(ctx, &qmgo.Config{
+ Uri: global.GVA_CONFIG.Mongo.Uri(),
+ Coll: global.GVA_CONFIG.Mongo.Coll,
+ Database: global.GVA_CONFIG.Mongo.Database,
+ MinPoolSize: &global.GVA_CONFIG.Mongo.MinPoolSize,
+ MaxPoolSize: &global.GVA_CONFIG.Mongo.MaxPoolSize,
+ SocketTimeoutMS: &global.GVA_CONFIG.Mongo.SocketTimeoutMs,
+ ConnectTimeoutMS: &global.GVA_CONFIG.Mongo.ConnectTimeoutMs,
+ Auth: &qmgo.Credential{
+ Username: global.GVA_CONFIG.Mongo.Username,
+ Password: global.GVA_CONFIG.Mongo.Password,
+ },
+ }, opts...)
+ if err != nil {
+ return errors.Wrap(err, "链接mongodb数据库失败!")
+ }
+ global.GVA_MONGO = client
+ err = m.Indexes(ctx)
+ if err != nil {
+ return err
+ }
+ return nil
+}
+
+func (m *mongo) CreateIndexes(ctx context.Context, name string, indexes [][]string) error {
+ collection, err := global.GVA_MONGO.Database.Collection(name).CloneCollection()
+ if err != nil {
+ return errors.Wrapf(err, "获取[%s]的表对象失败!", name)
+ }
+ list, err := collection.Indexes().List(ctx)
+ if err != nil {
+ return errors.Wrapf(err, "获取[%s]的索引对象失败!", name)
+ }
+ var entities []Index
+ err = list.All(ctx, &entities)
+ if err != nil {
+ return errors.Wrapf(err, "获取[%s]的索引列表失败!", name)
+ }
+ length := len(indexes)
+ indexMap1 := make(map[string][]string, length)
+ for i := 0; i < length; i++ {
+ length1 := len(indexes[i])
+ keys := make([]string, 0, length1)
+ for j := 0; j < length1; j++ {
+ if indexes[i][i][0] == '-' {
+ keys = append(keys, indexes[i][j], "-1")
+ continue
+ }
+ keys = append(keys, indexes[i][j], "1")
+ }
+ key := strings.Join(keys, "_")
+ _, o1 := indexMap1[key]
+ if o1 {
+ return errors.Errorf("索引[%s]重复!", key)
+ }
+ indexMap1[key] = indexes[i]
+ }
+ length = len(entities)
+ indexMap2 := make(map[string]map[string]string, length)
+ for i := 0; i < length; i++ {
+ v1, o1 := indexMap2[entities[i].Name]
+ if !o1 {
+ keyLength := len(entities[i].Key)
+ v1 = make(map[string]string, keyLength)
+ for j := 0; j < keyLength; j++ {
+ v2, o2 := v1[entities[i].Key[j].Key]
+ if !o2 {
+ v1 = make(map[string]string)
+ }
+ v2 = entities[i].Key[j].Key
+ v1[entities[i].Key[j].Key] = v2
+ indexMap2[entities[i].Name] = v1
+ }
+ }
+ }
+ for k1, v1 := range indexMap1 {
+ _, o2 := indexMap2[k1]
+ if o2 {
+ continue
+ } // 索引存在
+ err = global.GVA_MONGO.Database.Collection(name).CreateOneIndex(ctx, options.IndexModel{Key: v1})
+ if err != nil {
+ return errors.Wrapf(err, "创建索引[%s]失败!", k1)
+ }
+ }
+ return nil
+}
diff --git a/web/src/view/systemTools/system/system.vue b/web/src/view/systemTools/system/system.vue
index 534b93f8f..ac0049340 100644
--- a/web/src/view/systemTools/system/system.vue
+++ b/web/src/view/systemTools/system/system.vue
@@ -130,6 +130,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+