feat: add gormv2 and support sqlite

This commit is contained in:
engigu
2024-04-29 17:31:13 +08:00
parent 44054ae157
commit 33e44ce596
22 changed files with 236 additions and 279 deletions
+1 -1
View File
@@ -32,4 +32,4 @@ go.work
/runtime
.idea/
.release_version
conf/database.db
+1
View File
@@ -18,3 +18,4 @@
18. 支持docker部署,从环境变量启动
19. 支持微信测试公众号模板消息发送
20. 支持设置自定义的定时消息推送
21. 支持sqlite部署,支持不同版本mysql
+48 -62
View File
@@ -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
</details>
<details>
<summary>docker/docker-compose环境变量部署(推荐🍀🍀🍀🍀🍀)</summary>
<summary>docker/docker-compose环境变量部署(推荐🍀🍀🍀🍀🍀🍀🍀</summary>
环境变量介绍
| 变量 | 说明 |
|--------------------|------------------------------------|
| JWT_SECRET | jwt秘钥,可选,默认为message-nest |
| LOG_LEVEL | 日志等级,可选,默认为INFODEBUG/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 | 日志等级,可选,默认为INFODEBUG/INFO/ERROR |
| RUN_MODE | 运行模式,可选,默认release,为debug将自动添加跨域 |
| | |
| DB_TYPE | 数据库类型,sqlite/mysql。默认为sqlite,存储路径为conf/database.db |
| | |
| MYSQL_HOST | mysql-hostDB_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_
```
```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运行(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
# 正式运行
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`都没关系。
## 完整配置说明 ⚙️
<details>
@@ -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)
+14 -9
View File
@@ -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
)
+31 -27
View File
@@ -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=
+16 -13
View File
@@ -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...")
+4 -4
View File
@@ -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 检查用户信息
+12 -12
View File
@@ -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
}
+33 -91
View File
@@ -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
}
+8 -8
View File
@@ -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
}
+11 -10
View File
@@ -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
}
+27 -21
View File
@@ -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")
+7 -7
View File
@@ -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
}
+6 -6
View File
@@ -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
}
+2 -1
View File
@@ -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")
+2
View File
@@ -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
+8 -2
View File
@@ -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
}
+1 -1
View File
@@ -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())
}
+1 -1
View File
@@ -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())
}
+1 -1
View File
@@ -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())
}
+1 -1
View File
@@ -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())
}
+1 -1
View File
@@ -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())
}