Skip to content

Commit 82da491

Browse files
committed
全部调整完成
1 parent 7856ee8 commit 82da491

File tree

17 files changed

+1607
-186
lines changed

17 files changed

+1607
-186
lines changed

README.md

Lines changed: 63 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,73 @@
11
# golang-web-template
22
## 说明
3-
这个项目主要是一个golang的web开发模板,当你在用golang进行web开发的时候可以直接将项目拷贝然后作为脚手架,减少前期构建项目的工作。
3+
这个项目是一个golang的web开发模板,想着当你在用golang进行web开发的时候可以直接将项目拷贝然后作为脚手架,减少前期构建项目的工作。想法来源于之前写过的 spring-boot-template
44

5-
使用golang进行web开发现在当前还没有非常成熟的一站式解决方案,所以项目的构建也是见仁见智的,这里我只是根据之前java开发的经验来给到我认为合适的样子,适合小项目快速构建。不适用于巨大项目的构建。请斟酌参考。
6-
7-
## 使用框架
8-
- gin
9-
- xorm
10-
- viper
11-
- zap
12-
- swagger
13-
-
14-
15-
## 项目说明
16-
17-
## 日志说明
18-
controller 如果出现异常则直接返回相关请求错误,不进行日志打印
19-
service 如果出现非
20-
dao出现异常,封装daoerr并返回,不进行打印,统一处理
5+
使用golang进行web开发现在当前还没有非常成熟的一站式解决方案,没有类似java中的spring,所以项目的构建也是见仁见智的,这里我只是根据之前java开发的经验来给到我认为合适的样子,适合小项目快速构建。不适用于巨大项目的构建。请斟酌参考。
216

7+
PS: 如果其中有写的不好的地方,或者有可以优化的地方也请点击上方直接提 issue 拜托🙏
228

9+
## 使用的三方库
10+
- gin web框架
11+
- xorm 数据库
12+
- viper 读取配置文件
13+
- zap 日志
14+
- validator.v9 验证器
15+
- jinzhu/copier 数据映射拷贝
16+
- pkg/errors 错误处理
17+
- swagger 接口文档
2318

24-
info日志和sql日志分离,这样可以用于后续的监控或者是数据展示,可以用于数据分析等
25-
stack日志优化打印,其实已经可以了但是还是想要更加完善
26-
27-
将分页逻辑抽离出去,不要和整个模板混在一起
28-
我们可以弄个什么适配器什么的,搞个分页器,这样只要传递条件就可以了,然后会默认的去走分页的逻辑
29-
30-
31-
#### 新增
32-
- 全量新增
19+
## 项目说明
20+
### 目录说明
21+
```
22+
.
23+
├── README.md
24+
├── doc
25+
│   ├── default-conf.yml 默认配置
26+
│   ├── golang-web-template.postman_collection.json postman测试文件
27+
│   └── golang_web_template.sql 数据库sql
28+
└── src
29+
├── base
30+
│   ├── config 配置文件
31+
│   ├── db 数据库
32+
│   ├── httper 请求统一定义处理器
33+
│   ├── logger 日志
34+
│   ├── router 路由
35+
│   └── validator 验证器
36+
├── cmd 启动项
37+
│   ├── api 接口文档依赖
38+
│   ├── docs 接口文档文件
39+
│   └── main.go 启动文件
40+
├── controller
41+
├── dao
42+
├── model
43+
├── myerr 自定义错误
44+
├── service
45+
├── util 工具类
46+
└── val 验证器
47+
```
3348

34-
#### 删除
35-
- 根据id删除
36-
- 根据条件删除(定制)
49+
### 配置文件
50+
- 项目启动之后会默认去读取doc目录下的配置文件 default-conf.yml 根据配置文件中的配置进行启动
51+
- doc中还包含:数据库的sql文件,postman测试文件
3752

38-
#### 修改
39-
- 根据id修改
40-
- 修改全量(防止未提交的值进行修改)
41-
- 修改不服(定制)
42-
- 根据条件修改(定制)
53+
### 日志说明
54+
- 当前的日志使用zap日志框架,当前配置为在启动的根目录创建log文件夹并记录日志
55+
- debug级别的日志不记录文件,info日志单独记录文件,error与warn日志单独记录文件
56+
- 可以根据自己的需要进行调整或者切换,切换日志框架只需要实现具体接口和方法就可以了
57+
- 打印日志方式在main.go中有案例
4358

44-
#### 查询
45-
- 根据id查询
46-
- 查询全量数据
47-
- 查询部分数据(定制)
48-
- 分页查询
49-
- 查询全量数据,且条件为非主键所有条件
50-
- 查询部分数据(定制)
51-
- 根据条件查询(定制)
52-
- 查询多表数据(定制)
53-
59+
### 错误处理
60+
- 错误处理使用`pkg/errors`进行封装,或者进行自定义错误在myerr中
61+
- 错误统一交由一个地方进行处理和日志打印
62+
- 当项目在进行过程中,如果错误需要统一进行处理的,那么就会自定义错误
63+
- 在调用链比较长的业务中或者一些三方网络调用中需要主动手动去记录日志,精确定位
5464

65+
### 接口文档
66+
- 使用swagger来自动生成接口文档
67+
https://github.com/go-swagger/go-swagger/
68+
https://github.com/swaggo/swag
69+
- 使用之前需要安装 go get -u github.com/swaggo/swag/cmd/swag 相关的库,查看上面两个库中的说明进行安装即可
70+
- 使用命令 `swag init -g ./src/cmd/main.go -o ./src/cmd/docs` 会生成对应的接口文档json,yml到对应位置
71+
- 使用命令 `swagger serve ./src/cmd/docs/swagger.yaml` 会在本地启动接口文档的服务进行查看
72+
- 生成文档的时候会生成一个docs.go文件,在启动的main.go上面已经有了这个文件的依赖,所以直接启动项目访问:http://localhost:8080/swagger/index.html 也可以看到接口文档,并且可以直接使用其中的try进行测试
73+
- 生成的命令记录在脚本 gen-swagger-doc.sh 中
File renamed without changes.
Lines changed: 228 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,228 @@
1+
{
2+
"info": {
3+
"_postman_id": "c24fc99d-2578-4c8f-8254-aee722eb11ea",
4+
"name": "golang-web-template",
5+
"description": "# Introduction\nWhat does your API do?\n\n# Overview\nThings that the developers should know about\n\n# Authentication\nWhat is the preferred way of using the API?\n\n# Error Codes\nWhat errors and status codes can a user expect?\n\n# Rate limit\nIs there a limit to the number of requests an user can send?",
6+
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
7+
},
8+
"item": [
9+
{
10+
"name": "新增用户",
11+
"request": {
12+
"method": "POST",
13+
"header": [
14+
{
15+
"key": "Content-Type",
16+
"name": "Content-Type",
17+
"type": "text",
18+
"value": "application/json"
19+
}
20+
],
21+
"body": {
22+
"mode": "raw",
23+
"raw": "{\"username\":\"123111231112\",\"nickname\":\"123123213\",\"age\":9}"
24+
},
25+
"url": {
26+
"raw": "http://127.0.0.1:8080/gwt/api/v1/user",
27+
"protocol": "http",
28+
"host": [
29+
"127",
30+
"0",
31+
"0",
32+
"1"
33+
],
34+
"port": "8080",
35+
"path": [
36+
"gwt",
37+
"api",
38+
"v1",
39+
"user"
40+
]
41+
}
42+
},
43+
"response": []
44+
},
45+
{
46+
"name": "删除用户",
47+
"request": {
48+
"method": "DELETE",
49+
"header": [
50+
{
51+
"key": "Content-Type",
52+
"name": "Content-Type",
53+
"value": "application/json",
54+
"type": "text"
55+
}
56+
],
57+
"body": {
58+
"mode": "raw",
59+
"raw": "{\"id\":1}"
60+
},
61+
"url": {
62+
"raw": "http://127.0.0.1:8080/gwt/api/v1/user",
63+
"protocol": "http",
64+
"host": [
65+
"127",
66+
"0",
67+
"0",
68+
"1"
69+
],
70+
"port": "8080",
71+
"path": [
72+
"gwt",
73+
"api",
74+
"v1",
75+
"user"
76+
]
77+
}
78+
},
79+
"response": []
80+
},
81+
{
82+
"name": "修改用户",
83+
"request": {
84+
"method": "PUT",
85+
"header": [
86+
{
87+
"key": "Content-Type",
88+
"name": "Content-Type",
89+
"type": "text",
90+
"value": "application/json"
91+
}
92+
],
93+
"body": {
94+
"mode": "raw",
95+
"raw": "{\"id\":88,\"username\":\"asdasdasd123123123123as\",\"nickname\":\"\",\"age\":9}"
96+
},
97+
"url": {
98+
"raw": "http://127.0.0.1:8080/gwt/api/v1/user",
99+
"protocol": "http",
100+
"host": [
101+
"127",
102+
"0",
103+
"0",
104+
"1"
105+
],
106+
"port": "8080",
107+
"path": [
108+
"gwt",
109+
"api",
110+
"v1",
111+
"user"
112+
]
113+
}
114+
},
115+
"response": []
116+
},
117+
{
118+
"name": "查询用户 单个",
119+
"request": {
120+
"method": "GET",
121+
"header": [],
122+
"url": {
123+
"raw": "http://127.0.0.1:8080/gwt/api/v1/user/4",
124+
"protocol": "http",
125+
"host": [
126+
"127",
127+
"0",
128+
"0",
129+
"1"
130+
],
131+
"port": "8080",
132+
"path": [
133+
"gwt",
134+
"api",
135+
"v1",
136+
"user",
137+
"4"
138+
]
139+
}
140+
},
141+
"response": []
142+
},
143+
{
144+
"name": "查询用户 列表",
145+
"request": {
146+
"method": "GET",
147+
"header": [],
148+
"url": {
149+
"raw": "http://127.0.0.1:8080/gwt/api/v1/users?age=9",
150+
"protocol": "http",
151+
"host": [
152+
"127",
153+
"0",
154+
"0",
155+
"1"
156+
],
157+
"port": "8080",
158+
"path": [
159+
"gwt",
160+
"api",
161+
"v1",
162+
"users"
163+
],
164+
"query": [
165+
{
166+
"key": "age",
167+
"value": "9"
168+
}
169+
]
170+
}
171+
},
172+
"response": []
173+
},
174+
{
175+
"name": "查询用户 分页",
176+
"request": {
177+
"method": "GET",
178+
"header": [
179+
{
180+
"key": "Content-Type",
181+
"name": "Content-Type",
182+
"value": "application/json",
183+
"type": "text",
184+
"disabled": true
185+
}
186+
],
187+
"url": {
188+
"raw": "http://127.0.0.1:8080/gwt/api/v1/users/page?pageNum=1&pageSize=1&nickname\"=\"\"&age=0",
189+
"protocol": "http",
190+
"host": [
191+
"127",
192+
"0",
193+
"0",
194+
"1"
195+
],
196+
"port": "8080",
197+
"path": [
198+
"gwt",
199+
"api",
200+
"v1",
201+
"users",
202+
"page"
203+
],
204+
"query": [
205+
{
206+
"key": "pageNum",
207+
"value": "1"
208+
},
209+
{
210+
"key": "pageSize",
211+
"value": "1"
212+
},
213+
{
214+
"key": "nickname\"",
215+
"value": "\"\""
216+
},
217+
{
218+
"key": "age",
219+
"value": "0"
220+
}
221+
]
222+
}
223+
},
224+
"response": []
225+
}
226+
],
227+
"protocolProfileBehavior": {}
228+
}

doc/golang_web_template.sql

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
SET NAMES utf8mb4;
2+
SET FOREIGN_KEY_CHECKS = 0;
3+
4+
-- ----------------------------
5+
-- Table structure for user
6+
-- ----------------------------
7+
DROP TABLE IF EXISTS `user`;
8+
CREATE TABLE `user` (
9+
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',
10+
`username` varchar(16) NOT NULL COMMENT '用户名',
11+
`nickname` varchar(16) DEFAULT NULL COMMENT '昵称',
12+
`age` int(11) NOT NULL COMMENT '年龄',
13+
PRIMARY KEY (`id`)
14+
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8 COMMENT='用户';
15+
16+
SET FOREIGN_KEY_CHECKS = 1;

gen-swagger-doc.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/usr/bin/env bash
2+
swag init -g ./src/cmd/main.go -o ./src/cmd/docs
3+
swagger serve ./src/cmd/docs/swagger.yaml

src/base/httper/http_handle.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,12 @@ func HandleResponse(c *gin.Context, err error, data interface{}) {
2323
// 针对不同的错误类型进行处理
2424
switch errors.Cause(err).(type) {
2525
case *myerr.ParameterError:
26+
// 如果只是参数错误 返回400 并将错误信息直接返回展示
2627
SendFailResp(c, http.StatusBadRequest, err.Error())
2728
default:
29+
// 服务端出现未定义的异常 返回500 并打印日志
2830
logStackInfo(err)
29-
SendFailResp(c, http.StatusInternalServerError, err.Error())
31+
SendFailResp(c, http.StatusInternalServerError, "服务端异常")
3032
}
3133

3234
return

0 commit comments

Comments
 (0)