Skip to content

Commit ab2dd0c

Browse files
author
奇淼(piexlmax
authored
Merge pull request flipped-aurora#583 from RickieL/master
新增验证码使用redis存储方式
2 parents b96c357 + 0ed3b8c commit ab2dd0c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

65 files changed

+25943
-16423
lines changed

README-en.md

Lines changed: 107 additions & 174 deletions
Large diffs are not rendered by default.

README.md

Lines changed: 109 additions & 193 deletions
Large diffs are not rendered by default.

SECURITY.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# Security Policy
2+
3+
## Reporting a Vulnerability
4+
5+
Please report security issues to qimiaojiangjizhao@gmail.com

server/Dockerfile

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
FROM golang:alpine
22

3-
ENV GO111MODULE=on
4-
ENV GOPROXY=https://goproxy.io,direct
53
WORKDIR /go/src/gin-vue-admin
64
COPY . .
75

8-
RUN go env && go build -o server .
6+
RUN go generate && go env && go build -o server .
97

108
FROM alpine:latest
119
LABEL MAINTAINER="SliverHorn@sliver_horn@qq.com"

server/README.md

Lines changed: 53 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,54 @@
1+
## server项目结构
2+
3+
```shell
4+
├── api
5+
│   └── v1
6+
├── config
7+
├── core
8+
├── docs
9+
├── global
10+
├── initialize
11+
│   └── internal
12+
├── middleware
13+
├── model
14+
│   ├── request
15+
│   └── response
16+
├── packfile
17+
├── resource
18+
│   ├── excel
19+
│   ├── page
20+
│   └── template
21+
├── router
22+
├── service
23+
├── source
24+
└── utils
25+
├── timer
26+
└── upload
27+
```
28+
29+
| 文件夹 | 说明 | 描述 |
30+
| ------------ | ----------------------- | --------------------------- |
31+
| `api` | api层 | api层 |
32+
| `--v1` | v1版本接口 | v1版本接口 |
33+
| `config` | 配置包 | config.yaml对应的配置结构体 |
34+
| `core` | 核心文件 | 核心组件(zap, viper, server)的初始化 |
35+
| `docs` | swagger文档目录 | swagger文档目录 |
36+
| `global` | 全局对象 | 全局对象 |
37+
| `initialize` | 初始化 | router,redis,gorm,validator, timer的初始化 |
38+
| `--internal` | 初始化内部函数 | gorm 的 longger 自定义,在此文件夹的函数只能由 `initialize` 层进行调用 |
39+
| `middleware` | 中间件层 | 用于存放 `gin` 中间件代码 |
40+
| `model` | 模型层 | 模型对应数据表 |
41+
| `--request` | 入参结构体 | 接收前端发送到后端的数据。 |
42+
| `--response` | 出参结构体 | 返回给前端的数据结构体 |
43+
| `packfile` | 静态文件打包 | 静态文件打包 |
44+
| `resource` | 静态资源文件夹 | 负责存放静态文件 |
45+
| `--excel` | excel导入导出默认路径 | excel导入导出默认路径 |
46+
| `--page` | 表单生成器 | 表单生成器 打包后的dist |
47+
| `--template` | 模板 | 模板文件夹,存放的是代码生成器的模板 |
48+
| `router` | 路由层 | 路由层 |
49+
| `service` | service层 | 存放业务逻辑问题 |
50+
| `source` | source层 | 存放初始化数据的函数 |
51+
| `utils` | 工具包 | 工具函数封装 |
52+
| `--timer` | timer | 定时器接口封装 |
53+
| `--upload` | oss | oss接口封装 |
154

2-
整理代码结构
3-
``` lua
4-
web
5-
├── api/v1 -- 主要API
6-
| ├── sys_initdb.go -- ico
7-
| └── sys_user.go --
8-
├── config -- 配置文件 设定操作的结构体
9-
| ├── auto_code.go -- ico captcha.go
10-
| ├── ... -- ico captcha.go
11-
| └── zap.go -- core
12-
├── core -- 主要结构代码
13-
| ├── server_other.go -- ico captcha.go
14-
| ├── ... -- ico captcha.go
15-
| └── zap.go --
16-
├── docs -- 文档系统
17-
| ├── docs.go -- ico captcha.go
18-
| ├── swagger.json -- json
19-
| └── swagger.yaml -- yaml
20-
├── global -- global
21-
├── initialize -- initialize
22-
├── middleware -- 中间键
23-
├── model -- global
24-
│ ├── request -- 所有请求model结构体
25-
| | ├── common.go
26-
| | ├── ...
27-
| | └── sys_user.go -- yaml
28-
| ├── response -- 返回数据
29-
| | ├── common.go
30-
| | ├── ...
31-
| | └── sys_user.go -- yaml
32-
├── packfile -- 文件写入
33-
├── resource -- 资源文件
34-
├── router -- 路由
35-
├── service -- service层
36-
├── source -- 文件目录操作
37-
├── utils
38-
├── config.yaml --
39-
├── Dockerfile -- docker配置
40-
├── go.mod -- mod 配置
41-
├── go.sum -- sum
42-
├── latest_log -- vue-cli 配置
43-
└── main.go -- package.json
44-
```

server/api/v1/sys_captcha.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import (
88
"go.uber.org/zap"
99
)
1010

11+
// 当开启多服务器部署时,替换下面的配置,使用redis共享存储验证码
12+
// var store = captcha.NewDefaultRedisStore()
1113
var store = base64Captcha.DefaultMemStore
1214

1315
// @Tags Base

server/config.docker.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ mysql:
6161
password: ''
6262
max-idle-conns: 10
6363
max-open-conns: 100
64-
log-mode: false
65-
log-zap: ""
64+
log-mode: ""
65+
log-zap: false
6666

6767
# local configuration
6868
local:

server/config.yaml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ mysql:
6262
password: ''
6363
max-idle-conns: 10
6464
max-open-conns: 100
65-
log-mode: false
66-
log-zap: ""
65+
log-mode: ""
66+
log-zap: false
6767

6868
# local configuration
6969
local:
@@ -104,6 +104,7 @@ aliyun-oss:
104104
access-key-secret: 'yourAccessKeySecret'
105105
bucket-name: 'yourBucketName'
106106
bucket-url: 'yourBucketUrl'
107+
base-path: 'yourBasePath'
107108

108109
# tencent cos configuration
109110
tencent-cos:

server/config/gorm.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ type Mysql struct {
88
Password string `mapstructure:"password" json:"password" yaml:"password"` // 数据库密码
99
MaxIdleConns int `mapstructure:"max-idle-conns" json:"maxIdleConns" yaml:"max-idle-conns"` // 空闲中的最大连接数
1010
MaxOpenConns int `mapstructure:"max-open-conns" json:"maxOpenConns" yaml:"max-open-conns"` // 打开到数据库的最大连接数
11-
LogMode bool `mapstructure:"log-mode" json:"logMode" yaml:"log-mode"` // 是否开启Gorm全局日志
12-
LogZap string `mapstructure:"log-zap" json:"logZap" yaml:"log-zap"`
11+
LogMode string `mapstructure:"log-mode" json:"logMode" yaml:"log-mode"` // 是否开启Gorm全局日志
12+
LogZap bool `mapstructure:"log-zap" json:"logZap" yaml:"log-zap"` // 是否通过zap写入日志文件
1313
}
1414

1515
func (m *Mysql) Dsn() string {

server/config/oss.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ type AliyunOSS struct {
2020
AccessKeySecret string `mapstructure:"access-key-secret" json:"accessKeySecret" yaml:"access-key-secret"`
2121
BucketName string `mapstructure:"bucket-name" json:"bucketName" yaml:"bucket-name"`
2222
BucketUrl string `mapstructure:"bucket-url" json:"bucketUrl" yaml:"bucket-url"`
23+
BasePath string `mapstructure:"base-path" json:"basePath" yaml:"base-path"`
2324
}
2425
type TencentCOS struct {
2526
Bucket string `mapstructure:"bucket" json:"bucket" yaml:"bucket"`

server/core/server.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ func RunWindowsServer() {
2929

3030
fmt.Printf(`
3131
欢迎使用 Gin-Vue-Admin
32-
当前版本:V2.4.2
32+
当前版本:V2.4.3
3333
加群方式:微信号:shouzi_1994 QQ群:622360840
3434
默认自动化文档地址:http://127.0.0.1%s/swagger/index.html
3535
默认前端文件运行地址:http://127.0.0.1:8080

server/global/global.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package global
33
import (
44
"gin-vue-admin/utils/timer"
55

6+
"golang.org/x/sync/singleflight"
7+
68
"go.uber.org/zap"
79

810
"gin-vue-admin/config"
@@ -18,6 +20,7 @@ var (
1820
GVA_CONFIG config.Server
1921
GVA_VP *viper.Viper
2022
//GVA_LOG *oplogging.Logger
21-
GVA_LOG *zap.Logger
22-
GVA_Timer timer.Timer = timer.NewTimerTask()
23+
GVA_LOG *zap.Logger
24+
GVA_Timer timer.Timer = timer.NewTimerTask()
25+
GVA_Concurrency_Control = &singleflight.Group{}
2326
)

server/go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ require (
5151
github.com/unrolled/secure v1.0.7
5252
go.uber.org/zap v1.10.0
5353
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 // indirect
54+
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
5455
golang.org/x/tools v0.0.0-20200324003944-a576cf524670 // indirect
5556
google.golang.org/protobuf v1.24.0 // indirect
5657
gopkg.in/ini.v1 v1.55.0 // indirect

server/initialize/gorm.go

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ func GormMysql() *gorm.DB {
7878
DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
7979
SkipInitializeWithVersion: false, // 根据版本自动配置
8080
}
81-
if db, err := gorm.Open(mysql.New(mysqlConfig), gormConfig(m.LogMode)); err != nil {
81+
if db, err := gorm.Open(mysql.New(mysqlConfig), gormConfig()); err != nil {
8282
//global.GVA_LOG.Error("MySQL启动异常", zap.Any("err", err))
8383
//os.Exit(0)
8484
//return nil
@@ -97,9 +97,9 @@ func GormMysql() *gorm.DB {
9797
//@param: mod bool
9898
//@return: *gorm.Config
9999

100-
func gormConfig(mod bool) *gorm.Config {
101-
var config = &gorm.Config{DisableForeignKeyConstraintWhenMigrating: true}
102-
switch global.GVA_CONFIG.Mysql.LogZap {
100+
func gormConfig() *gorm.Config {
101+
config := &gorm.Config{DisableForeignKeyConstraintWhenMigrating: true}
102+
switch global.GVA_CONFIG.Mysql.LogMode {
103103
case "silent", "Silent":
104104
config.Logger = internal.Default.LogMode(logger.Silent)
105105
case "error", "Error":
@@ -108,14 +108,8 @@ func gormConfig(mod bool) *gorm.Config {
108108
config.Logger = internal.Default.LogMode(logger.Warn)
109109
case "info", "Info":
110110
config.Logger = internal.Default.LogMode(logger.Info)
111-
case "zap", "Zap":
112-
config.Logger = internal.Default.LogMode(logger.Info)
113111
default:
114-
if mod {
115-
config.Logger = internal.Default.LogMode(logger.Info)
116-
break
117-
}
118-
config.Logger = internal.Default.LogMode(logger.Silent)
112+
config.Logger = internal.Default.LogMode(logger.Info)
119113
}
120114
return config
121115
}

server/initialize/internal/logger.go

Lines changed: 21 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"context"
55
"fmt"
66
"gin-vue-admin/global"
7-
"go.uber.org/zap"
87
"gorm.io/gorm/logger"
98
"gorm.io/gorm/utils"
109
"io/ioutil"
@@ -13,11 +12,6 @@ import (
1312
"time"
1413
)
1514

16-
// writer log writer interface
17-
type writer interface {
18-
Printf(string, ...interface{})
19-
}
20-
2115
type config struct {
2216
SlowThreshold time.Duration
2317
Colorful bool
@@ -34,27 +28,27 @@ var (
3428
Recorder = traceRecorder{Interface: Default, BeginAt: time.Now()}
3529
)
3630

37-
func New(writer writer, config config) logger.Interface {
31+
func New(writer logger.Writer, config config) logger.Interface {
3832
var (
3933
infoStr = "%s\n[info] "
4034
warnStr = "%s\n[warn] "
4135
errStr = "%s\n[error] "
42-
traceStr = "%s\n[%.3fms] [rows:%v] %s"
43-
traceWarnStr = "%s %s\n[%.3fms] [rows:%v] %s"
44-
traceErrStr = "%s %s\n[%.3fms] [rows:%v] %s"
36+
traceStr = "%s\n[%.3fms] [rows:%v] %s\n"
37+
traceWarnStr = "%s %s\n[%.3fms] [rows:%v] %s\n"
38+
traceErrStr = "%s %s\n[%.3fms] [rows:%v] %s\n"
4539
)
4640

4741
if config.Colorful {
4842
infoStr = logger.Green + "%s\n" + logger.Reset + logger.Green + "[info] " + logger.Reset
4943
warnStr = logger.BlueBold + "%s\n" + logger.Reset + logger.Magenta + "[warn] " + logger.Reset
5044
errStr = logger.Magenta + "%s\n" + logger.Reset + logger.Red + "[error] " + logger.Reset
51-
traceStr = logger.Green + "%s\n" + logger.Reset + logger.Yellow + "[%.3fms] " + logger.BlueBold + "[rows:%v]" + logger.Reset + " %s"
52-
traceWarnStr = logger.Green + "%s " + logger.Yellow + "%s\n" + logger.Reset + logger.RedBold + "[%.3fms] " + logger.Yellow + "[rows:%v]" + logger.Magenta + " %s" + logger.Reset
53-
traceErrStr = logger.RedBold + "%s " + logger.MagentaBold + "%s\n" + logger.Reset + logger.Yellow + "[%.3fms] " + logger.BlueBold + "[rows:%v]" + logger.Reset + " %s"
45+
traceStr = logger.Green + "%s\n" + logger.Reset + logger.Yellow + "[%.3fms] " + logger.BlueBold + "[rows:%v]" + logger.Reset + " %s\n"
46+
traceWarnStr = logger.Green + "%s " + logger.Yellow + "%s\n" + logger.Reset + logger.RedBold + "[%.3fms] " + logger.Yellow + "[rows:%v]" + logger.Magenta + " %s\n" + logger.Reset
47+
traceErrStr = logger.RedBold + "%s " + logger.MagentaBold + "%s\n" + logger.Reset + logger.Yellow + "[%.3fms] " + logger.BlueBold + "[rows:%v]" + logger.Reset + " %s\n"
5448
}
5549

56-
return &customLogger{
57-
writer: writer,
50+
return &_logger{
51+
Writer: writer,
5852
config: config,
5953
infoStr: infoStr,
6054
warnStr: warnStr,
@@ -65,43 +59,43 @@ func New(writer writer, config config) logger.Interface {
6559
}
6660
}
6761

68-
type customLogger struct {
69-
writer
62+
type _logger struct {
7063
config
64+
logger.Writer
7165
infoStr, warnStr, errStr string
7266
traceStr, traceErrStr, traceWarnStr string
7367
}
7468

7569
// LogMode log mode
76-
func (c *customLogger) LogMode(level logger.LogLevel) logger.Interface {
70+
func (c *_logger) LogMode(level logger.LogLevel) logger.Interface {
7771
newLogger := *c
7872
newLogger.LogLevel = level
7973
return &newLogger
8074
}
8175

8276
// Info print info
83-
func (c *customLogger) Info(ctx context.Context, message string, data ...interface{}) {
77+
func (c *_logger) Info(ctx context.Context, message string, data ...interface{}) {
8478
if c.LogLevel >= logger.Info {
8579
c.Printf(c.infoStr+message, append([]interface{}{utils.FileWithLineNum()}, data...)...)
8680
}
8781
}
8882

8983
// Warn print warn messages
90-
func (c *customLogger) Warn(ctx context.Context, message string, data ...interface{}) {
84+
func (c *_logger) Warn(ctx context.Context, message string, data ...interface{}) {
9185
if c.LogLevel >= logger.Warn {
9286
c.Printf(c.warnStr+message, append([]interface{}{utils.FileWithLineNum()}, data...)...)
9387
}
9488
}
9589

9690
// Error print error messages
97-
func (c *customLogger) Error(ctx context.Context, message string, data ...interface{}) {
91+
func (c *_logger) Error(ctx context.Context, message string, data ...interface{}) {
9892
if c.LogLevel >= logger.Error {
9993
c.Printf(c.errStr+message, append([]interface{}{utils.FileWithLineNum()}, data...)...)
10094
}
10195
}
10296

10397
// Trace print sql message
104-
func (c *customLogger) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) {
98+
func (c *_logger) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) {
10599
if c.LogLevel > 0 {
106100
elapsed := time.Since(begin)
107101
switch {
@@ -131,35 +125,11 @@ func (c *customLogger) Trace(ctx context.Context, begin time.Time, fc func() (st
131125
}
132126
}
133127

134-
func (c *customLogger) Printf(message string, data ...interface{}) {
135-
if global.GVA_CONFIG.Mysql.LogZap != "" {
136-
switch len(data) {
137-
case 0:
138-
global.GVA_LOG.Info(message)
139-
case 1:
140-
global.GVA_LOG.Info("gorm", zap.Any("src", data[0]))
141-
case 2:
142-
global.GVA_LOG.Info("gorm", zap.Any("src", data[0]), zap.Any("duration", data[1]))
143-
case 3:
144-
global.GVA_LOG.Info("gorm", zap.Any("src", data[0]), zap.Any("duration", data[1]), zap.Any("rows", data[2]))
145-
case 4:
146-
global.GVA_LOG.Info("gorm", zap.Any("src", data[0]), zap.Any("duration", data[1]), zap.Any("rows", data[2]), zap.Any("sql", data[3]))
147-
}
148-
return
149-
}
150-
switch len(data) {
151-
case 0:
152-
c.writer.Printf(message, "")
153-
case 1:
154-
c.writer.Printf(message, data[0])
155-
case 2:
156-
c.writer.Printf(message, data[0], data[1])
157-
case 3:
158-
c.writer.Printf(message, data[0], data[1], data[2])
159-
case 4:
160-
c.writer.Printf(message, data[0], data[1], data[2], data[3])
161-
case 5:
162-
c.writer.Printf(message, data[0], data[1], data[2], data[3], data[4])
128+
func (c *_logger) Printf(message string, data ...interface{}) {
129+
if global.GVA_CONFIG.Mysql.LogZap {
130+
global.GVA_LOG.Info(fmt.Sprintf(message, data...))
131+
} else {
132+
c.Writer.Printf(message, data...)
163133
}
164134
}
165135

0 commit comments

Comments
 (0)