diff --git a/.gitignore b/.gitignore index f83ffad..158a301 100644 --- a/.gitignore +++ b/.gitignore @@ -32,4 +32,4 @@ go.work /runtime .idea/ .release_version - +conf/database.db diff --git a/.release_log b/.release_log index a497020..60ad585 100644 --- a/.release_log +++ b/.release_log @@ -18,3 +18,4 @@ 18. 支持docker部署,从环境变量启动 19. 支持微信测试公众号模板消息发送 20. 支持设置自定义的定时消息推送 +21. 支持sqlite部署,支持不同版本mysql diff --git a/README.md b/README.md index 9152541..e6e97f0 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,10 @@ Message Nest 是一个灵活而强大的消息推送整合平台,旨在简化 关于日志,考虑到目前多数服务以收集控制台输出为主,暂时不支持写出日志文件。 +2024.04.29 + +- [x] 支持sqlite部署,支持不同版本mysql + 2024.04.11 - [x] 支持自定义的定时消息发送 @@ -102,6 +106,7 @@ WriteTimeout = 60 ; 关闭SQL打印 ; SqlDebug = enable +; Type = sqlite Type = mysql User = root Password = Aa123456 @@ -176,9 +181,6 @@ TablePrefix = message_ JwtSecret = message-nest LogLevel = INFO -; 第一次运行务必打开,初始化数据 -InitData = enable - [server] ; RunMode务必设置成debug,会自动添加跨域 RunMode = debug @@ -192,6 +194,7 @@ EmbedHtml = disable ; 开启SQL打印 SqlDebug = enable +; Type = sqlite Type = mysql User = root Password = Aa123456 @@ -237,9 +240,6 @@ npm run dev JwtSecret = message-nest LogLevel = INFO -; 第一次运行务必打开,初始化数据 -InitData = enable - [server] RunMode = release ; docker模式下端口配置文件中只能为8000 @@ -253,6 +253,7 @@ WriteTimeout = 60 ; 关闭SQL打印 ; SqlDebug = enable +; Type = sqlite Type = mysql User = root Password = Aa123456 @@ -326,41 +327,32 @@ docker-compose up -d
- docker/docker-compose环境变量部署(推荐🍀🍀🍀🍀🍀) + docker/docker-compose环境变量部署(推荐🍀🍀🍀🍀🍀🍀🍀) 环境变量介绍 -| 变量 | 说明 | -|--------------------|------------------------------------| -| JWT_SECRET | jwt秘钥,可选,默认为message-nest | -| LOG_LEVEL | 日志等级,可选,默认为INFO,DEBUG/INFO/ERROR | -| INIT_DATA | 是否初始化数据,可选,默认关,第一次运行需要将该值设置为enable | -| RUN_MODE | 运行模式,可选,默认release,为debug将自动添加跨域 | -| | | -| MYSQL_HOST | mysql-host,必填 | -| MYSQL_PORT | mysql端口,必填 | -| MYSQL_USER | mysql用户名,必填 | -| MYSQL_PASSWORD | mysql数据库密码,必填 | -| MYSQL_DB | mysql数据库名字,必填 | -| MYSQL_TABLE_PREFIX | mysql数据表前缀,必填 | -| SQL_DEBUG | 是否打印SQL,可选,默认关,设置enable为开启 | +| 变量 | 说明 | +|--------------------|----------------------------------------------------| +| JWT_SECRET | jwt秘钥,可选,默认为message-nest | +| LOG_LEVEL | 日志等级,可选,默认为INFO,DEBUG/INFO/ERROR | +| RUN_MODE | 运行模式,可选,默认release,为debug将自动添加跨域 | +| | | +| DB_TYPE | 数据库类型,sqlite/mysql。默认为sqlite,存储路径为conf/database.db | +| | | +| MYSQL_HOST | mysql-host,DB_TYPE=mysql必填 | +| MYSQL_PORT | mysql端口,DB_TYPE=mysql必填 | +| MYSQL_USER | mysql用户名,DB_TYPE=mysql必填 | +| MYSQL_PASSWORD | mysql数据库密码,DB_TYPE=mysql必填 | +| MYSQL_DB | mysql数据库名字,DB_TYPE=mysql必填 | +| MYSQL_TABLE_PREFIX | mysql数据表前缀,DB_TYPE=mysql必填 | +| | | +| SQL_DEBUG | 是否打印SQL,可选,默认关,设置enable为开启 | docker运行 ```shell -# 首次运行指定INIT_DATA=enable初始化数据 -docker run --rm -ti \ - -p 8000:8000 \ - -e INIT_DATA=enable \ - -e MYSQL_HOST=192.168.64.133 \ - -e MYSQL_PORT=3308 \ - -e MYSQL_USER=root \ - -e MYSQL_PASSWORD=Aa123456 \ - -e MYSQL_DB=test_11 \ - -e MYSQL_TABLE_PREFIX=message_ \ - engigu/message-nest:latest -# 正式运行 +# 正式运行(mysql) docker run -d \ -p 8000:8000 \ -e MYSQL_HOST=192.168.64.133 \ @@ -370,9 +362,15 @@ docker run -d \ -e MYSQL_DB=test_11 \ -e MYSQL_TABLE_PREFIX=message_ \ engigu/message-nest:latest + +# 正式运行(sqlite) +docker run -d \ + -p 8000:8000 \ + -v you/path/database.db=conf/database.db \ + engigu/message-nest:latest ``` -docker-compose运行 +docker-compose运行(mysql) ```yml version: "3.7" @@ -393,19 +391,23 @@ services: - MYSQL_TABLE_PREFIX=message_ ``` +docker-compose运行(sqlite) + +```yml +version: "3.7" +services: + + message-nest: + image: engigu/message-nest:latest + container_name: message-nest + restart: always + ports: + - "8000:8000" + volumes: + - you/path/database.db:conf/database.db +``` + ```shell -# 首次运行指定INIT_DATA=enable初始化数据 -docker run --rm -ti \ - -p 8000:8000 \ - -e INIT_DATA=enable \ - -e MYSQL_HOST=192.168.64.133 \ - -e MYSQL_PORT=3308 \ - -e MYSQL_USER=root \ - -e MYSQL_PASSWORD=Aa123456 \ - -e MYSQL_DB=test_11 \ - -e MYSQL_TABLE_PREFIX=message_ \ - engigu/message-nest:latest - # 正式运行 docker-compose -up -d ``` @@ -426,21 +428,6 @@ docker-compose -up -d > > 两种方式各有优缺点,综合考虑下来,推荐直接使用release的打包执行文件(或者docker环境变量进行部署),其中已经内置了页面静态资源,只用运行一个服务。 -#### 关于InitData配置的说明 - -> 从功能上开启`InitData=enable`是使用gorm的model进行migrate表字段更改,是将代码中的定义的表结构自动完成sql语句进行表结构的维护。 -> -> 1. 为什么这么设计,不直接使用完整的建表sql?我想了很久,我觉得migrate目前能够满足现在的需求,而且不用手动维护sql的变动。 -> -> 2. 为什么初始化要单独加一个配置开关`InitData=enable`,而不是使用一个标识进行判断? 目前现在确实只需要判断是否初始化标识就可以满足,但是后面如果项目更新添加了新字段, -> 就不再适用了。也就是说这个配置设计上既可以完成初始化,也可以完成的后面的字段升级。 -> -> 3. 我一直指定`InitData=enable`运行项目有没影响,会不会数据错、丢失? 不会。一直指定`InitData=enable`,只是每次服务启动多一步会检查, -> 检查表字段变动。并且只是新增的表字段会进行添加,已经存在的字段不会进行变更,所以不用担心数据问题。 -> -> 只要初始化指定`InitData=enable`进行了初始化,后续如果项目不升级,后面指不指定`InitData=enable`都没关系。 - - ## 完整配置说明 ⚙️
@@ -548,7 +535,6 @@ TablePrefix = message_ [![Star History Chart](https://api.star-history.com/svg?repos=engigu/Message-Push-Nest&type=Date)](https://star-history.com/#engigu/Message-Push-Nest&Date) - ## 许可证 📝 [LICENSE](LICENSE) diff --git a/go.mod b/go.mod index 594d5ae..b84a6ab 100644 --- a/go.mod +++ b/go.mod @@ -5,17 +5,19 @@ go 1.20 require ( github.com/engigu/logrus-prefixed-formatter v0.5.3-0.20240113025353-498bcddfa6b5 github.com/gin-gonic/gin v1.9.1 + github.com/glebarez/sqlite v1.11.0 github.com/go-ini/ini v1.32.1-0.20180214101753-32e4be5f41bb github.com/go-playground/locales v0.14.1 github.com/go-playground/universal-translator v0.18.1 github.com/go-playground/validator/v10 v10.16.0 github.com/golang-jwt/jwt/v5 v5.2.0 - github.com/jinzhu/gorm v0.0.0-20180213101209-6e1387b44c64 github.com/robfig/cron/v3 v3.0.1 github.com/silenceper/wechat/v2 v2.1.6 github.com/sirupsen/logrus v1.9.3 github.com/unknwon/com v1.0.1 gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df + gorm.io/driver/mysql v1.5.6 + gorm.io/gorm v1.25.10 ) require ( @@ -24,31 +26,31 @@ require ( github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect github.com/chenzhuoyu/iasm v0.9.1 // indirect - github.com/denisenkom/go-mssqldb v0.0.0-20190920000552-128d9f4ae1cd // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect github.com/fatih/structs v1.1.0 // indirect github.com/gabriel-vasile/mimetype v1.4.3 // indirect github.com/gin-contrib/sse v0.1.0 // indirect + github.com/glebarez/go-sqlite v1.21.2 // indirect github.com/go-redis/redis/v8 v8.11.5 // indirect - github.com/go-sql-driver/mysql v1.4.1-0.20190510102335-877a9775f068 // indirect + github.com/go-sql-driver/mysql v1.7.0 // indirect github.com/goccy/go-json v0.10.2 // indirect github.com/google/go-cmp v0.6.0 // indirect - github.com/jinzhu/inflection v0.0.0-20170102125226-1c35d901db3d // indirect - github.com/jinzhu/now v1.0.1 // indirect + github.com/google/uuid v1.3.0 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/cpuid/v2 v2.2.6 // indirect github.com/kr/pretty v0.1.0 // indirect github.com/leodido/go-urn v1.2.4 // indirect - github.com/lib/pq v1.2.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-sqlite3 v1.11.0 // indirect github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/onsi/gomega v1.30.0 // indirect github.com/pelletier/go-toml/v2 v2.1.1 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337 // indirect github.com/spf13/cast v1.4.1 // indirect github.com/tidwall/gjson v1.14.1 // indirect @@ -63,10 +65,13 @@ require ( golang.org/x/sys v0.16.0 // indirect golang.org/x/term v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect - google.golang.org/appengine v1.6.3 // indirect google.golang.org/protobuf v1.32.0 // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect gopkg.in/ini.v1 v1.47.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + modernc.org/libc v1.22.5 // indirect + modernc.org/mathutil v1.5.0 // indirect + modernc.org/memory v1.5.0 // indirect + modernc.org/sqlite v1.23.1 // indirect ) diff --git a/go.sum b/go.sum index ffb0d9d..764b8ac 100644 --- a/go.sum +++ b/go.sum @@ -23,14 +23,12 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denisenkom/go-mssqldb v0.0.0-20190920000552-128d9f4ae1cd h1:tXCgEGHPT4XELDS7nB0OBb9968yCOd+MnyNf+6m1u40= -github.com/denisenkom/go-mssqldb v0.0.0-20190920000552-128d9f4ae1cd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +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/engigu/logrus-prefixed-formatter v0.5.3-0.20240113025353-498bcddfa6b5 h1:XRkGO/dTf/3p1SDYr/BNtDmqwLtI+jssymsCgzvqf5c= github.com/engigu/logrus-prefixed-formatter v0.5.3-0.20240113025353-498bcddfa6b5/go.mod h1:wpl/H0ZIheoONzhaJIPU5Qe+lmLxPXEdY1PNWjla63E= -github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y= -github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -42,6 +40,10 @@ github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= +github.com/glebarez/go-sqlite v1.21.2 h1:3a6LFC4sKahUunAmynQKLZceZCOzUthkRkEAl9gAXWo= +github.com/glebarez/go-sqlite v1.21.2/go.mod h1:sfxdZyhQjTM2Wry3gVYWaW072Ri1WMdWJi0k6+3382k= +github.com/glebarez/sqlite v1.11.0 h1:wSG0irqzP6VurnMEpFGer5Li19RpIRi2qvQz++w0GMw= +github.com/glebarez/sqlite v1.11.0/go.mod h1:h8/o8j5wiAsqSPoWELDUdJXhjAhsVliSn7bWZjOhrgQ= github.com/go-ini/ini v1.32.1-0.20180214101753-32e4be5f41bb h1:v+YnQ81wH+hTjaP5nFSpqASFbe9UETYm1vG65qp7Zc0= github.com/go-ini/ini v1.32.1-0.20180214101753-32e4be5f41bb/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= @@ -53,17 +55,14 @@ github.com/go-playground/validator/v10 v10.16.0 h1:x+plE831WK4vaKHO/jpgUGsvLKIqR github.com/go-playground/validator/v10 v10.16.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= -github.com/go-sql-driver/mysql v1.4.1-0.20190510102335-877a9775f068 h1:q2kwd9Bcgl2QpSi/Wjcx9jzwyICt3EWTP5to43QhwaA= -github.com/go-sql-driver/mysql v1.4.1-0.20190510102335-877a9775f068/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw= github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= @@ -80,6 +79,9 @@ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e h1:JKmoR8x90Iww1ks85zJ1lfDGgIiMDuIptTOhJq+zKyg= github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -87,12 +89,10 @@ github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 h1:2VTzZjLZBgl62/EtslC github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/jinzhu/gorm v0.0.0-20180213101209-6e1387b44c64 h1:8I4kQ5M5OjZKNsgRUs20soTdIoo1GbiGApV31kJ9e6Y= -github.com/jinzhu/gorm v0.0.0-20180213101209-6e1387b44c64/go.mod h1:Vla75njaFJ8clLU1W44h34PjIkijhjHIYnZxMqCdxqo= -github.com/jinzhu/inflection v0.0.0-20170102125226-1c35d901db3d h1:jRQLvyVGL+iVtDElaEIDdKwpPqUIZJfzkNLV34htpEc= -github.com/jinzhu/inflection v0.0.0-20170102125226-1c35d901db3d/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.0.1 h1:HjfetcXq097iXP0uoPCdnM4Efp5/9MsM0/M+XOTeR3M= -github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= @@ -109,15 +109,11 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= -github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-sqlite3 v1.11.0 h1:LDdKkqtYlom37fkvqs8rMPFKAMe8+SgjbwZ6ex1/A/Q= -github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -145,6 +141,9 @@ github.com/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOS github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +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/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/silenceper/wechat/v2 v2.1.6 h1:2br2DxNzhksmvIBJ+PfMqjqsvoZmd/5BnMIfjKYUBgc= @@ -194,8 +193,6 @@ golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUu golang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc= golang.org/x/arch v0.6.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-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -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-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= @@ -205,7 +202,6 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -220,7 +216,6 @@ golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -242,22 +237,18 @@ golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9sn golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.6.3 h1:hvZejVcIxAKHR8Pq2gXaDggf6CWT1QEqO+JEBeOKCG8= -google.golang.org/appengine v1.6.3/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -289,5 +280,18 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8= +gorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM= +gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s= +gorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +modernc.org/libc v1.22.5 h1:91BNch/e5B0uPbJFgqbxXuOnxBQjlS//icfQEGmvyjE= +modernc.org/libc v1.22.5/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY= +modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds= +modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/sqlite v1.23.1 h1:nrSBg4aRQQwq59JpvGEQ15tNxoO5pX/kUjcRNwSAGQM= +modernc.org/sqlite v1.23.1/go.mod h1:OrDj17Mggn6MhE+iPbBNf7RGKODDE9NFT0f3EwDzJqk= nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/migrate/migrate.go b/migrate/migrate.go index 0056369..2d12bf8 100644 --- a/migrate/migrate.go +++ b/migrate/migrate.go @@ -3,10 +3,9 @@ package migrate import ( "errors" "fmt" - "github.com/jinzhu/gorm" "github.com/sirupsen/logrus" + "gorm.io/gorm" "message-nest/models" - "message-nest/pkg/setting" "message-nest/service/settings_service" ) @@ -43,16 +42,16 @@ func InitAuthTableData() { func Setup() { db := models.Setup() - defer func(db *gorm.DB) { - err := db.Close() - if err != nil { + //defer func(db *gorm.DB) { + // err := db.Close() + // if err != nil { + // + // } + //}(db) - } - }(db) - - if setting.AppSetting.InitData != "enable" { - return - } + //if setting.AppSetting.InitData != "enable" { + // return + //} entry := logrus.WithFields(logrus.Fields{ "prefix": "[Init Data]", @@ -69,9 +68,13 @@ func Setup() { } for _, table := range tables { - tableName := db.NewScope(table).TableName() + //tableName := db.NewScope(table).TableName() + tableName := models.GetSchema(table) entry.Infof("Migrate table: %s", tableName) - db.AutoMigrate(table) + err := db.AutoMigrate(table) + if err != nil { + entry.Infof("Migrate table erorr: %s", err.Error()) + } } entry.Infof("Init Account data...") diff --git a/models/auth.go b/models/auth.go index acbc7fc..d609366 100644 --- a/models/auth.go +++ b/models/auth.go @@ -2,13 +2,13 @@ package models import ( "errors" - "github.com/jinzhu/gorm" + "gorm.io/gorm" ) type Auth struct { - ID int `json:"id" gorm:"type:int(11) AUTO_INCREMENT comment 'id';primary_key" json:"id"` - Username string `json:"username" gorm:"type:varchar(100) comment '用户名';default:'';"` - Password string `json:"password" gorm:"type:varchar(100) comment '密码';default:'';"` + ID int `json:"id" gorm:"autoIncrement;type:integer ;primaryKey" json:"id"` + Username string `json:"username" gorm:"type:varchar(100);default:'';"` + Password string `json:"password" gorm:"type:varchar(100);default:'';"` } // CheckAuth 检查用户信息 diff --git a/models/cron_messages.go b/models/cron_messages.go index ea0c7d4..e12ada8 100644 --- a/models/cron_messages.go +++ b/models/cron_messages.go @@ -3,21 +3,21 @@ package models import ( "errors" "fmt" - "github.com/jinzhu/gorm" + "gorm.io/gorm" "message-nest/pkg/util" ) type CronMessages struct { UUIDModel - Name string `json:"name" gorm:"type:varchar(200) comment '关联的消息名称';default:'';"` - TaskID string `json:"task_id" gorm:"type:varchar(36) comment '关联的消息ID';default:'';"` - Cron string `json:"cron" gorm:"type:varchar(4096) comment '定时表达式';default:'';"` - Title string `json:"title" gorm:"type:varchar(1000) comment '消息名称';default:'';"` - Content string `json:"content" gorm:"type:varchar(4096) comment '消息内容';default:'';"` - //MarkDown string `json:"markdown" gorm:"type:varchar(4096) comment 'markdown内容';default:'';"` - Url string `json:"url" gorm:"type:varchar(4096) comment 'url地址';default:'';"` - Enable int `json:"enable" gorm:"type:int comment '开启、暂停状态';default:1;"` + Name string `json:"name" gorm:"type:varchar(200) ;default:'';"` + TaskID string `json:"task_id" gorm:"type:varchar(36) ;default:'';"` + Cron string `json:"cron" gorm:"type:varchar(4096) ;default:'';"` + Title string `json:"title" gorm:"type:varchar(1000) ;default:'';"` + Content string `json:"content" gorm:"type:varchar(4096) ;default:'';"` + //MarkDown string `json:"markdown" gorm:"type:varchar(4096) ;default:'';"` + Url string `json:"url" gorm:"type:varchar(4096) ;default:'';"` + Enable int `json:"enable" gorm:"type:int ;default:1;"` } func GenerateMsgUniqueID() string { @@ -77,10 +77,10 @@ func GetCronMessages(pageNum int, pageSize int, name string, maps interface{}) ( } // GetCronMessagesTotal 获取所有任务总数 -func GetCronMessagesTotal(name string, maps interface{}) (int, error) { +func GetCronMessagesTotal(name string, maps interface{}) (int64, error) { var ( err error - total int + total int64 ) query := db.Model(&CronMessages{}).Where(maps) if name != "" { @@ -110,7 +110,7 @@ func EditCronMsg(id string, data interface{}) error { func GetCronMsgByID(id string) (CronMessages, error) { var msg CronMessages - err := db.Where("id = ? ", id).Find(&msg).Error + err := db.Where("id = ? ", id).Take(&msg).Error if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { return msg, err } diff --git a/models/models.go b/models/models.go index da91948..4d4417b 100644 --- a/models/models.go +++ b/models/models.go @@ -2,32 +2,33 @@ package models import ( "fmt" - "github.com/jinzhu/gorm" - _ "github.com/jinzhu/gorm/dialects/mysql" + "github.com/glebarez/sqlite" + "gorm.io/driver/mysql" + "gorm.io/gorm" + "gorm.io/gorm/schema" "log" "message-nest/pkg/setting" "message-nest/pkg/util" - "time" ) var db *gorm.DB type IDModel struct { - ID int `gorm:"type:int(11) AUTO_INCREMENT comment 'id';primary_key" json:"id"` + ID uint `gorm:"autoIncrement;type:integer;primaryKey" json:"id"` - CreatedBy string `json:"created_by" gorm:"type:varchar(100) comment '创建人';default:'';"` - ModifiedBy string `json:"modified_by" gorm:"type:varchar(100) comment '修改人';default:'';"` - CreatedOn util.Time `json:"created_on" gorm:"type:timestamp comment '创建时间';default:current_timestamp;"` - ModifiedOn util.Time `json:"modified_on" gorm:"type:timestamp comment '更新时间';"` + CreatedBy string `json:"created_by" gorm:"type:varchar(100) ;default:'';"` + ModifiedBy string `json:"modified_by" gorm:"type:varchar(100) ;default:'';"` + CreatedAt util.Time `json:"created_on" gorm:"column:created_on;autoCreateTime "` + UpdatedAt util.Time `json:"modified_on" gorm:"column:modified_on;autoUpdateTime ;"` } type UUIDModel struct { - ID string `gorm:"type:varchar(12) comment 'id';primary_key" json:"id"` + ID string `gorm:"type:varchar(12) ;primaryKey" json:"id"` - CreatedBy string `json:"created_by" gorm:"type:varchar(100) comment '创建人';default:'';"` - ModifiedBy string `json:"modified_by" gorm:"type:varchar(100) comment '修改人';default:'';"` - CreatedOn util.Time `json:"created_on" gorm:"type:timestamp comment '创建时间';default:current_timestamp;"` - ModifiedOn util.Time `json:"modified_on" gorm:"type:timestamp comment '更新时间';"` + CreatedBy string `json:"created_by" gorm:"type:varchar(100) ;default:'';"` + ModifiedBy string `json:"modified_by" gorm:"type:varchar(100) ;default:'';"` + CreatedAt util.Time `json:"created_on" gorm:"column:created_on;autoCreateTime "` + UpdatedAt util.Time `json:"modified_on" gorm:"column:modified_on;autoUpdateTime ;"` } // Setup initializes the database instance @@ -39,92 +40,33 @@ func Setup() *gorm.DB { setting.DatabaseSetting.Host, setting.DatabaseSetting.Port, setting.DatabaseSetting.Name) - db, err = gorm.Open(setting.DatabaseSetting.Type, connStr) + + config := &gorm.Config{ + NamingStrategy: schema.NamingStrategy{ + TablePrefix: setting.DatabaseSetting.TablePrefix, + }, + } + + switch setting.DatabaseSetting.Type { + case "mysql": + db, err = gorm.Open(mysql.Open(connStr), config) + case "sqlite": + db, err = gorm.Open(sqlite.Open("conf/database.db"), config) + } if err != nil { log.Fatalf("models.Setup err: %v", err) } - gorm.DefaultTableNameHandler = func(db *gorm.DB, defaultTableName string) string { - return setting.DatabaseSetting.TablePrefix + defaultTableName - } if setting.DatabaseSetting.SqlDebug == "enable" { - db.LogMode(true) + db = db.Debug() } - db.SingularTable(true) - db.Callback().Create().Replace("gorm:update_time_stamp", updateTimeStampForCreateCallback) - db.Callback().Update().Replace("gorm:update_time_stamp", updateTimeStampForUpdateCallback) - db.Callback().Delete().Replace("gorm:delete", deleteCallback) - db.DB().SetMaxIdleConns(10) - db.DB().SetMaxOpenConns(100) + return db } -// CloseDB closes database connection (unnecessary) -func CloseDB() { - defer db.Close() -} - -// updateTimeStampForCreateCallback will set `CreatedOn`, `ModifiedOn` when creating -func updateTimeStampForCreateCallback(scope *gorm.Scope) { - if !scope.HasError() { - nowTime := time.Now() - - if createTimeField, ok := scope.FieldByName("CreatedOn"); ok { - if createTimeField.IsBlank { - createTimeField.Set(nowTime) - } - } - - if modifyTimeField, ok := scope.FieldByName("ModifiedOn"); ok { - if modifyTimeField.IsBlank { - modifyTimeField.Set(nowTime) - } - } - } -} - -// updateTimeStampForUpdateCallback will set `ModifiedOn` when updating -func updateTimeStampForUpdateCallback(scope *gorm.Scope) { - if _, ok := scope.Get("gorm:update_column"); !ok { - scope.SetColumn("ModifiedOn", time.Now()) - } -} - -// deleteCallback will set `DeletedOn` where deleting -func deleteCallback(scope *gorm.Scope) { - if !scope.HasError() { - var extraOption string - if str, ok := scope.Get("gorm:delete_option"); ok { - extraOption = fmt.Sprint(str) - } - - deletedOnField, hasDeletedOnField := scope.FieldByName("DeletedOn") - - if !scope.Search.Unscoped && hasDeletedOnField { - scope.Raw(fmt.Sprintf( - "UPDATE %v SET %v=%v%v%v", - scope.QuotedTableName(), - scope.Quote(deletedOnField.DBName), - scope.AddToVars(time.Now().Unix()), - addExtraSpaceIfExist(scope.CombinedConditionSql()), - addExtraSpaceIfExist(extraOption), - )).Exec() - } else { - scope.Raw(fmt.Sprintf( - "DELETE FROM %v%v%v", - scope.QuotedTableName(), - addExtraSpaceIfExist(scope.CombinedConditionSql()), - addExtraSpaceIfExist(extraOption), - )).Exec() - } - } -} - -// addExtraSpaceIfExist adds a separator -func addExtraSpaceIfExist(str string) string { - if str != "" { - return " " + str - } - return "" +func GetSchema(table any) string { + stmt := &gorm.Statement{DB: db} + stmt.Parse(table) + return stmt.Schema.Table } diff --git a/models/send_ins.go b/models/send_ins.go index af2c4b0..dff0219 100644 --- a/models/send_ins.go +++ b/models/send_ins.go @@ -3,13 +3,13 @@ package models type SendTasksIns struct { UUIDModel - TaskID string `json:"task_id" gorm:"type:varchar(12) comment '任务id';default:'';index:task_id"` - WayID string `json:"way_id" gorm:"type:varchar(12) comment '渠道id';default:'';index:way_id"` - WayType string `json:"way_type" gorm:"type:varchar(100) comment '渠道类型';default:'';index:way_type"` - ContentType string `json:"content_type" gorm:"type:varchar(100) comment '实例类型';default:'';index:content_type"` - Config string `json:"config" gorm:"type:text comment '实例配置';"` - Extra string `json:"extra" gorm:"type:text comment '额外信息';"` - Enable int `json:"enable" gorm:"type:int comment '开启、暂停状态';default:1;"` + TaskID string `json:"task_id" gorm:"type:varchar(12) ;default:'';index"` + WayID string `json:"way_id" gorm:"type:varchar(12) ;default:'';index"` + WayType string `json:"way_type" gorm:"type:varchar(100) ;default:'';index"` + ContentType string `json:"content_type" gorm:"type:varchar(100) ;default:'';index"` + Config string `json:"config" gorm:"type:text ;"` + Extra string `json:"extra" gorm:"type:text ;"` + Enable int `json:"enable" gorm:"type:int ;default:1;"` } // InsEmailConfig 实例里面的邮箱config @@ -39,7 +39,7 @@ func ManyAddTaskIns(taskIns []SendTasksIns) error { tx := db.Begin() for _, ins := range taskIns { // 存在就跳过这条ins记录 - err := db.Where("id = ?", ins.ID).Find(&SendTasksIns{}).Error + err := db.Where("id = ?", ins.ID).Take(&SendTasksIns{}).Error if err == nil { continue } diff --git a/models/send_tasks.go b/models/send_tasks.go index 852461c..ac6e349 100644 --- a/models/send_tasks.go +++ b/models/send_tasks.go @@ -3,14 +3,14 @@ package models import ( "errors" "fmt" - "github.com/jinzhu/gorm" + "gorm.io/gorm" "message-nest/pkg/util" ) type SendTasks struct { UUIDModel - Name string `json:"name" gorm:"type:varchar(100) comment '任务名称';default:'';"` + Name string `json:"name" gorm:"type:varchar(100) ;default:'';"` } func GenerateTaskUniqueID() string { @@ -20,7 +20,7 @@ func GenerateTaskUniqueID() string { // AddSendTaskWithID 添加实例的时候添加任务 func AddSendTaskWithID(name string, id string, createdBy string) error { - err := db.Where("id = ?", id).Find(&SendTasks{}).Error + err := db.Where("id = ?", id).Take(&SendTasks{}).Error if err == nil { return nil } @@ -77,10 +77,10 @@ func GetSendTasks(pageNum int, pageSize int, name string, maps interface{}) ([]S } // GetSendTasksTotal 获取所有任务总数 -func GetSendTasksTotal(name string, maps interface{}) (int, error) { +func GetSendTasksTotal(name string, maps interface{}) (int64, error) { var ( err error - total int + total int64 ) query := db.Model(&SendTasks{}).Where(maps) if name != "" { @@ -108,8 +108,9 @@ type TaskIns struct { // GetTasksIns 获取所有任务下所有的实例 func GetTasksIns(id string) (TaskIns, error) { - insTable := db.NewScope(SendTasksIns{}).TableName() - waysTable := db.NewScope(SendWays{}).TableName() + //insTable := GetSchema(SendTasksIns{}) + insTable := GetSchema(SendTasksIns{}) + waysTable := GetSchema(SendWays{}) var ( task SendTasks taskIns []SendTasksInsRes @@ -136,8 +137,8 @@ func GetTasksIns(id string) (TaskIns, error) { // FindTaskByWayId 通过way_id找到关联的任务 func FindTaskByWayId(wayId string) []SendTasks { - insTable := db.NewScope(SendTasksIns{}).TableName() - taskTable := db.NewScope(SendTasks{}).TableName() + insTable := GetSchema(SendTasksIns{}) + taskTable := GetSchema(SendTasks{}) var ( tasks []SendTasks ) @@ -177,7 +178,7 @@ func EditSendTask(id string, data interface{}) error { func GetTaskByID(id string) (SendTasks, error) { var task SendTasks - err := db.Where("id = ? ", id).Find(&task).Error + err := db.Where("id = ? ", id).Take(&task).Error if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { return task, err } diff --git a/models/send_tasks_logs.go b/models/send_tasks_logs.go index fc91bd7..333b28a 100644 --- a/models/send_tasks_logs.go +++ b/models/send_tasks_logs.go @@ -3,17 +3,18 @@ package models import ( "fmt" "message-nest/pkg/util" + //"time" ) type SendTasksLogs struct { - ID int `gorm:"primary_key" json:"id" ` - TaskID string `json:"task_id" gorm:"type:varchar(12) comment '任务id';default:'';index:task_id"` - Log string `json:"log" gorm:"type:text comment '日志';"` - Status *int `json:"status" gorm:"type:int comment '状态';default:0;"` - CallerIp string `json:"caller_ip" gorm:"type:varchar(256) comment '发送者的ip';default:'';"` + ID int `gorm:"primaryKey" json:"id" ` + TaskID string `json:"task_id" gorm:"type:varchar(12) ;default:'';index:task_id"` + Log string `json:"log" gorm:"type:text ;"` + Status *int `json:"status" gorm:"type:int ;default:0;"` + CallerIp string `json:"caller_ip" gorm:"type:varchar(256) ;default:'';"` - CreatedOn util.Time `json:"created_on" gorm:"type:timestamp comment '创建时间';default:current_timestamp;"` - ModifiedOn util.Time `json:"modified_on" gorm:"type:timestamp comment '更新时间';"` + CreatedAt util.Time `json:"created_on" gorm:"column:created_on;autoCreateTime "` + UpdatedAt util.Time `json:"modified_on" gorm:"column:modified_on;autoUpdateTime ;"` } // Add 添加日志记录 @@ -39,8 +40,8 @@ type LogsResult struct { // GetSendLogs 获取所有日志记录 func GetSendLogs(pageNum int, pageSize int, name string, taskId string, maps map[string]interface{}) ([]LogsResult, error) { var logs []LogsResult - logt := db.NewScope(SendTasksLogs{}).TableName() - taskt := db.NewScope(SendTasks{}).TableName() + logt := GetSchema(SendTasksLogs{}) + taskt := GetSchema(SendTasks{}) query := db. Table(logt). @@ -70,10 +71,10 @@ func GetSendLogs(pageNum int, pageSize int, name string, taskId string, maps map } // GetSendLogsTotal 获取所有日志总数 -func GetSendLogsTotal(name string, taskId string, maps map[string]interface{}) (int, error) { - var total int - logt := db.NewScope(SendTasksLogs{}).TableName() - taskt := db.NewScope(SendTasks{}).TableName() +func GetSendLogsTotal(name string, taskId string, maps map[string]interface{}) (int64, error) { + var total int64 + logt := GetSchema(SendTasksLogs{}) + taskt := GetSchema(SendTasks{}) query := db. Table(logt). Joins(fmt.Sprintf("LEFT JOIN %s ON %s.task_id = %s.id", taskt, logt, taskt)) @@ -98,7 +99,7 @@ func GetSendLogsTotal(name string, taskId string, maps map[string]interface{}) ( // GetSendLogsTotal 获取所有日志总数 func DeleteOutDateLogs(keepNum int) (int, error) { var affectedRows int - logt := db.NewScope(SendTasksLogs{}).TableName() + logt := GetSchema(SendTasksLogs{}) sql := fmt.Sprintf(`DELETE FROM %s WHERE id NOT IN ( SELECT id FROM ( @@ -122,8 +123,8 @@ type StatisticData struct { TodayFailedNum int `json:"today_failed_num"` TodayTotalNum int `json:"today_total_num"` - LatestSendData []LatestSendData `json:"latest_send_data"` - WayCateData []WayCateData `json:"way_cate_data"` + LatestSendData []LatestSendData `json:"latest_send_data" gorm:"many2many:latest_send_data;"` + WayCateData []WayCateData `json:"way_cate_data" gorm:"many2many:way_cate_data;"` } type LatestSendData struct { @@ -144,9 +145,9 @@ func GetStatisticData() (StatisticData, error) { var statistic StatisticData var latestData []LatestSendData var wayCateData []WayCateData - logt := db.NewScope(SendTasksLogs{}).TableName() - inst := db.NewScope(SendTasksIns{}).TableName() - wayst := db.NewScope(SendWays{}).TableName() + logt := GetSchema(SendTasksLogs{}) + inst := GetSchema(SendTasksIns{}) + wayst := GetSchema(SendWays{}) currDay := util.GetNowTimeStr()[:10] // 今日统计数据 @@ -158,10 +159,15 @@ func GetStatisticData() (StatisticData, error) { SUM(CASE WHEN status != 1 or status is null THEN 1 ELSE 0 END) AS today_failed_num`). Where("DATE(created_on) = ?", currDay) - query.First(&statistic) + query.Take(&statistic) // 最近30天数据 days := 30 + now := util.GetNowTime() + past := now.AddDate(0, 0, -days) + pastDate := past.Format("2006-01-02") + next := now.AddDate(0, 0, 1) + nextDate := next.Format("2006-01-02") queryData := db. Table(logt). Select(` @@ -169,7 +175,7 @@ func GetStatisticData() (StatisticData, error) { SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END) AS day_succ_num, SUM(CASE WHEN status != 1 or status is null THEN 1 ELSE 0 END) AS day_failed_num, COUNT(*) AS num`). - Where(" created_on >= DATE(?) - INTERVAL ? DAY", currDay, days). + Where(fmt.Sprintf(" created_on >= '%s' and created_on <= '%s' ", pastDate, nextDate)). Group("day"). Order("day") diff --git a/models/send_ways.go b/models/send_ways.go index 2b19541..1041e4d 100644 --- a/models/send_ways.go +++ b/models/send_ways.go @@ -3,16 +3,16 @@ package models import ( "errors" "fmt" - "github.com/jinzhu/gorm" + "gorm.io/gorm" "message-nest/pkg/util" ) type SendWays struct { UUIDModel - Name string `json:"name" gorm:"type:varchar(100) comment '渠道名称';default:'';"` - Type string `json:"type" gorm:"type:varchar(100) comment '渠道类型';default:'';index:type"` - Auth string `json:"auth" gorm:"type:varchar(2048) comment '认证信息';default:'';"` + Name string `json:"name" gorm:"type:varchar(100) ;default:'';"` + Type string `json:"type" gorm:"type:varchar(100) ;default:'';index"` + Auth string `json:"auth" gorm:"type:varchar(2048) ;default:'';"` } func GenerateWayUniqueID() string { @@ -63,10 +63,10 @@ func GetSendWays(pageNum int, pageSize int, name string, type_ string, maps inte return ways, nil } -func GetSendWaysTotal(name string, type_ string, maps interface{}) (int, error) { +func GetSendWaysTotal(name string, type_ string, maps interface{}) (int64, error) { var ( err error - total int + total int64 ) query := db.Model(&SendWays{}).Where(maps) if name != "" { @@ -85,7 +85,7 @@ func GetSendWaysTotal(name string, type_ string, maps interface{}) (int, error) func GetWayByID(id string) (SendWays, error) { var way SendWays - err := db.Where("id = ? ", id).Find(&way).Error + err := db.Where("id = ? ", id).Take(&way).Error if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { return way, err } diff --git a/models/settings.go b/models/settings.go index f601a98..858b148 100644 --- a/models/settings.go +++ b/models/settings.go @@ -2,15 +2,15 @@ package models import ( "errors" - "github.com/jinzhu/gorm" + "gorm.io/gorm" ) type Settings struct { IDModel - Section string `json:"section" gorm:"type:varchar(100) comment '实例类型';default:'';index:section"` - Key string `json:"key" gorm:"type:varchar(100) comment '实例类型';default:'';"` - Value string `json:"value" gorm:"type:text comment '实例类型';"` + Section string `json:"section" gorm:"type:varchar(100) ;default:'';index"` + Key string `json:"key" gorm:"type:varchar(100) ;default:'';"` + Value string `json:"value" gorm:"type:text ;"` } // AddOneSetting 添加一条设置 @@ -22,7 +22,7 @@ func AddOneSetting(setting Settings) error { } // EditSetting 编辑设置 -func EditSetting(id int, data interface{}) error { +func EditSetting(id uint, data interface{}) error { if err := db.Model(&Settings{}).Where("id = ? ", id).Updates(data).Error; err != nil { return err } @@ -49,7 +49,7 @@ func GetSettingByKey(section string, key string) (Settings, error) { func GetSettingBySection(section string) ([]Settings, error) { var settings []Settings - err := db.Table(db.NewScope(Settings{}).TableName()).Where("`section` = ? ", section).Scan(&settings).Error + err := db.Table(GetSchema(Settings{})).Where("`section` = ? ", section).Scan(&settings).Error if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { return settings, err } diff --git a/pkg/setting/env.go b/pkg/setting/env.go index e0d67ce..094287a 100644 --- a/pkg/setting/env.go +++ b/pkg/setting/env.go @@ -50,7 +50,8 @@ func loadConfigFromEnv() { ServerSetting.ReadTimeout = 60 ServerSetting.WriteTimeout = 60 - DatabaseSetting.Type = "mysql" + DatabaseSetting.Type = getOptionEnvValue("DB_TYPE", "sqlite") + DatabaseSetting.Host = getMustEnvValue("MYSQL_HOST") DatabaseSetting.Port = com.StrTo(getMustEnvValue("MYSQL_PORT")).MustInt() DatabaseSetting.User = getMustEnvValue("MYSQL_USER") diff --git a/pkg/setting/setting.go b/pkg/setting/setting.go index 95b9868..426756e 100644 --- a/pkg/setting/setting.go +++ b/pkg/setting/setting.go @@ -72,6 +72,8 @@ func Setup() { ServerSetting.ReadTimeout = ServerSetting.ReadTimeout * time.Second ServerSetting.WriteTimeout = ServerSetting.WriteTimeout * time.Second + log.Printf("[message-nest] DB type: %s", DatabaseSetting.Type) + } // mapTo map section diff --git a/pkg/util/time.go b/pkg/util/time.go index d1235a7..bf71fa0 100644 --- a/pkg/util/time.go +++ b/pkg/util/time.go @@ -56,8 +56,14 @@ func (t *Time) Scan(v interface{}) error { // GetNowTimeStr 获取当前的时间字符串 func GetNowTimeStr() string { - currentTimeUTC := time.Now().UTC() - chinaTime := currentTimeUTC.Add(8 * time.Hour) + chinaTime := GetNowTime() formattedTime := chinaTime.Format("2006-01-02 15:04:05") return formattedTime } + +// GetNowTimeStr 获取当前的时间字符串 +func GetNowTime() time.Time { + currentTimeUTC := time.Now().UTC() + chinaTime := currentTimeUTC.Add(8 * time.Hour) + return chinaTime +} diff --git a/service/cron_msg_service/cron_msg.go b/service/cron_msg_service/cron_msg.go index c2e8e77..c3b479b 100644 --- a/service/cron_msg_service/cron_msg.go +++ b/service/cron_msg_service/cron_msg.go @@ -42,7 +42,7 @@ func (st *CronMsgService) GetByID() (models.CronMessages, error) { return models.GetCronMsgByID(st.ID) } -func (st *CronMsgService) Count() (int, error) { +func (st *CronMsgService) Count() (int64, error) { return models.GetCronMessagesTotal(st.Name, st.getMaps()) } diff --git a/service/send_ins_service/send_ins.go b/service/send_ins_service/send_ins.go index 0c554e3..636dd45 100644 --- a/service/send_ins_service/send_ins.go +++ b/service/send_ins_service/send_ins.go @@ -95,7 +95,7 @@ func (st *SendTaskInsService) Update(data map[string]interface{}) error { return models.UpdateMsgTaskIns(st.ID, data) } -func (st *SendTaskInsService) Count() (int, error) { +func (st *SendTaskInsService) Count() (int64, error) { return models.GetSendTasksTotal(st.Name, st.getMaps()) } diff --git a/service/send_logs_service/send_logs.go b/service/send_logs_service/send_logs.go index 55cd116..6395f2c 100644 --- a/service/send_logs_service/send_logs.go +++ b/service/send_logs_service/send_logs.go @@ -17,7 +17,7 @@ type SendTaskLogsService struct { PageSize int } -func (st *SendTaskLogsService) Count() (int, error) { +func (st *SendTaskLogsService) Count() (int64, error) { return models.GetSendLogsTotal(st.Name, st.TaskId, st.getMaps()) } diff --git a/service/send_task_service/send_task.go b/service/send_task_service/send_task.go index 42e4d6a..702f9a6 100644 --- a/service/send_task_service/send_task.go +++ b/service/send_task_service/send_task.go @@ -35,7 +35,7 @@ func (st *SendTaskService) GetTaskWithIns() (models.TaskIns, error) { return models.GetTasksIns(st.ID) } -func (st *SendTaskService) Count() (int, error) { +func (st *SendTaskService) Count() (int64, error) { return models.GetSendTasksTotal(st.Name, st.getMaps()) } diff --git a/service/send_way_service/send_way.go b/service/send_way_service/send_way.go index 92ca930..20a4ead 100644 --- a/service/send_way_service/send_way.go +++ b/service/send_way_service/send_way.go @@ -110,7 +110,7 @@ func (sw *SendWay) Delete() error { return models.DeleteMsgWay(sw.ID) } -func (sw *SendWay) Count() (int, error) { +func (sw *SendWay) Count() (int64, error) { return models.GetSendWaysTotal(sw.Name, sw.Type, sw.getMaps()) }