# short_link **Repository Path**: alxps/short_link ## Basic Information - **Project Name**: short_link - **Description**: 使用Gin实现的短链接服务。 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2024-03-26 - **Last Updated**: 2024-04-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: Go语言, Gin, 短链接 ## README # short_link #### 介绍      Go Gin实现的短链接服务。
     本项目用于短链接服务的学习和原理阐述,请勿直接将该项目运用到生产环境中。 #### 博客      [使用Go语言开发一个短链接服务](https://www.cnblogs.com/ALXPS/p/18066568) #### 软件架构 - 服务依赖组件包括缓存和数据库 - 项目中缓存不依赖特定组件,实现app/component/cache.go的CacheItf接口即可。默认已实现Redis作为缓存 - 项目中数据库不依赖特定组件,实现app/component/database.go的DatabaseItf接口即可。默认已实现MongoDB作为数据库 #### 实现接口      见接口文档,【[docs/api_doc.json](./docs/api_doc.json)】 - 跳转:GET /:code - 添加短链接: POST /api/v1/links - 获取链接详情:GET /api/v1/links #### 接口用户认证      项目未实现用户的登录注册等逻辑,因为认为短链接服务应该为一个子系统,用户服务多数情况下设计为一个单独的服务。其它子服务,仅实现用户认证。
     项目实现了一个基于请求头JsonWebToken的认证中间件,添加和获取短链接两个接口需要认证。
     请求需要认证的接口需要在求头加上key "Authorization", value "Bearer {jwt}"
     下面为一段生成用来测试jwt代码:
```go package main import ( "fmt" "time" "github.com/golang-jwt/jwt/v5" "github.com/1911860538/short_link/config" ) func main() { token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ "id": "1f70a466-1449-4676-b2d7-2037341c718e", "name": "Tom", "username": "Tom01", "exp": time.Date(2035, 10, 10, 12, 0, 0, 0, time.UTC).Unix(), }) tokenStr, err := token.SignedString([]byte(config.Conf.Jwt.SecretKey)) if err != nil { panic(err) return } fmt.Println(tokenStr) } ```      下面为一个可用来测试的Authorization: ```text Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjIwNzU2MzA0MDAsImlkIjoiMWY3MGE0NjYtMTQ0OS00Njc2LWIyZDctMjAzNzM0MWM3MThlIiwibmFtZSI6IlRvbSIsInVzZXJuYW1lIjoiVG9tMDEifQ.wGEVC-9okRKjCWoxJMWF90LM0gKHSdJHVvvuqQMTwbk ``` #### 启动目录      [cmd/server/main.go](cmd/server/main.go)