通过Beego将之前实现的短url项目实现
正好通过这个小例子对之前了解的beego框架的基本内容进行一个简单的应用
实现的完整代码地址:https://github.com/pythonsite/go_simple_code/tree/master/beego_short_url
数据库没有什么变化,还是和之前一样,主要是把处理逻辑放到beego中就可以了
代码的主要目录为:
localhost:beego_short_url zhaofan$ tree
.
├── beego_short_url
├── conf
│ └── app.conf
├── controllers
│ ├── default.go
│ └── short_url.go
├── main.go
├── models
│ └── data.go
├── routers
│ └── router.go
├── static
│ ├── css
│ ├── img
│ └── js
│ └── reload.min.js
├── tests
│ └── default_test.go
└── views
└── index.tpl 10 directories, 10 files
关于长短url相互转换的的请求和返回定义的struct在models下的data中,代码为:
package models
type Long2ShortRequest struct {
OriginUrl string `json:"origin_url"`
}
type ResponseHeader struct {
Code int `json:"code"`
Message string `json:"message"`
}
type Long2ShortResponse struct {
ResponseHeader
ShortUrl string `json:"short_url"`
}
type Short2LongRequest struct {
ShortUrl string `json:"short_url"`
}
type Short2LongResponse struct {
ResponseHeader
OriginUrl string `json:"origin_url"`
}
type ShortUrl struct {
ShortUrl string `json:"short_url" db:"short_url"`
}
而将原来在logic中的处理逻辑都放到了controllers中的short_url文件中
package controllers import (
"github.com/astaxie/beego"
"beego_short_url/models"
"encoding/json"
"database/sql"
"crypto/md5"
"github.com/jmoiron/sqlx"
"fmt"
_ "github.com/go-sql-driver/mysql"
) var (
Db *sqlx.DB
) func InitDb()(err error){
Db, err = sqlx.Open("mysql",beego.AppConfig.String("Db::dsn"))
if err != nil{
beego.Error("connect to mysql failed:",err)
return
}
return
} type ShortUrl struct {
Id int64 `db:"id"`
ShortUrl string `db:"short_url"`
OriginUrl string `db:"origin_url"`
HashCode string `db:"hash_code"`
} type ShortUrlController struct {
beego.Controller
} func (c *ShortUrlController) Jump() {
shortUrl := c.GetString("shorturl")
if len(shortUrl) == 0{
return
}
var req models.Short2LongRequest
var resp *models.Short2LongResponse = &models.Short2LongResponse{} defer func(){
if err := recover();err != nil{
beego.Error("panic err:",err)
//resp.Code = 500
//resp.Message = "server busy"
//c.Data["json"] = resp
//c.ServeJSON()
return
}
}()
req.ShortUrl = shortUrl
resp,err := Short2Long(&req)
if err != nil{
beego.Error("short2Long failed error:",err)
return
} beego.Info("origin url:%s short url:%s",resp.OriginUrl,shortUrl)
c.Redirect(resp.OriginUrl,301)
} func (c *ShortUrlController) ShortUrlList() {
limit,err := c.GetInt("limit")
if err != nil{
beego.Warn("not have limit params use default 10")
limit = 10
}
data,err := GetLastShortUrl(limit)
if err != nil{
beego.Error("from db get url list error:",err) } for i,v:= range data{
v.ShortUrl = fmt.Sprintf("/jump/?shorturl=%s",v.ShortUrl)
data[i] = v
} c.Data["url_list"] = data
c.TplName = "index.tpl"
} func(c *ShortUrlController) Long2Short(){
var req models.Long2ShortRequest
var resp *models.Long2ShortResponse = &models.Long2ShortResponse{} defer func(){
if err := recover();err != nil{
beego.Error("panic err:",err)
resp.Code = 500
resp.Message = "server busy"
c.Data["json"] = resp
c.ServeJSON()
return
}
}() err := json.Unmarshal(c.Ctx.Input.RequestBody,&req)
if err != nil{
beego.Error("unmarshal failed,err:",err)
resp.Code = 1001
resp.Message = "json unmarshal failed"
c.Data["json"] = resp
c.ServeJSON()
return
}
resp,err = Long2Short(&req)
if err != nil{
beego.Error("long2short failed,err:",err)
resp.Code = 1002
resp.Message = "long2short failed"
c.Data["json"] = resp
c.ServeJSON()
return
}
c.Data["json"] = resp
c.ServeJSON() } func(c *ShortUrlController) Short2Long(){
var req models.Short2LongRequest
var resp *models.Short2LongResponse = &models.Short2LongResponse{} defer func(){
if err := recover();err != nil{
beego.Error("panic err:",err)
resp.Code = 500
resp.Message = "server busy"
c.Data["json"] = resp
c.ServeJSON()
return
}
}() err := json.Unmarshal(c.Ctx.Input.RequestBody,&req)
if err != nil{
beego.Error("unmarshal failed,err:",err)
resp.Code = 1001
resp.Message = "json unmarshal failed"
c.Data["json"] = resp
c.ServeJSON()
return
}
resp,err = Short2Long(&req)
if err != nil{
beego.Error("Short2Long failed,err:",err)
resp.Code = 1002
resp.Message = "long2short failed"
c.Data["json"] = resp
c.ServeJSON()
return
}
c.Data["json"] = resp
c.ServeJSON()
} func Long2Short(req *models.Long2ShortRequest) (response *models.Long2ShortResponse, err error) {
response = &models.Long2ShortResponse{}
urlMd5 := fmt.Sprintf("%x",md5.Sum([]byte(req.OriginUrl)))
var short ShortUrl
err = Db.Get(&short,"select id,short_url,origin_url,hash_code from short_url where hash_code=?",urlMd5)
if err == sql.ErrNoRows{
err = nil
// 数据库中没有记录,重新生成一个新的短url
shortUrl,errRet := generateShortUrl(req,urlMd5)
if errRet != nil{
err = errRet
return
}
response.ShortUrl = shortUrl
return
}
if err != nil{
return
}
response.ShortUrl = short.ShortUrl
return
} func generateShortUrl(req *models.Long2ShortRequest,hashcode string)(shortUrl string,err error){
result,err := Db.Exec("insert INTO short_url(origin_url,hash_code)VALUES (?,?)",req.OriginUrl,hashcode)
if err != nil{
return
}
// 0-9a-zA-Z 六十二进制
insertId,_:= result.LastInsertId()
shortUrl = transTo62(insertId)
_,err = Db.Exec("update short_url set short_url=? where id=?",shortUrl,insertId)
if err != nil{
fmt.Println(err)
return
}
return
} // 将十进制转换为62进制 0-9a-zA-Z 六十二进制
func transTo62(id int64)string{
// 1 -- > 1
// 10-- > a
// 61-- > Z
charset := "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
var shortUrl []byte
for{
var result byte
number := id % 62
result = charset[number]
var tmp []byte
tmp = append(tmp,result)
shortUrl = append(tmp,shortUrl...)
id = id / 62
if id == 0{
break
}
}
fmt.Println(string(shortUrl))
return string(shortUrl)
} func Short2Long(req *models.Short2LongRequest) (response *models.Short2LongResponse, err error) {
response = &models.Short2LongResponse{}
var short ShortUrl
err = Db.Get(&short,"select id,short_url,origin_url,hash_code from short_url where short_url=?",req.ShortUrl)
if err == sql.ErrNoRows{
response.Code = 404
return
}
if err != nil{
response.Code = 500
return
}
response.OriginUrl = short.OriginUrl
return
} func GetLastShortUrl(limit int)(result []*models.ShortUrl,err error){
err = Db.Select(&result,"select short_url from short_url ORDER BY id DESC limit ? ",limit)
return
}
在这里添加了一些之前没有的功能:
获取数据库所有的short url 并且显示在页面上了,不过这里非常丑,如图:

我们可以通过点击相应的连接就会跳转到长url的页面
也可以通过模拟发送post请求来查看转换的情况:


通过Beego将之前实现的短url项目实现的更多相关文章
- Go实现短url项目
首先说一下这种业务的应用场景: 把一个长url转换为一个短url网址 主要用于微博,二维码,等有字数限制的场景 主要实现的功能分析: 把长url的地址转换为短url地址 通过短url获取对应的原始长u ...
- Go 实现短 url 项目
首先说一下这种业务的应用场景: 把一个长 url 转换为一个短 url 网址 主要用于微博,二维码,等有字数限制的场景 主要实现的功能分析: 把长 url 地址转换为短 url 地址 通过短 url ...
- SharePoint 2010 Url Shortener --SharePoint 2010 短URL生成器
SharePoint 2010 Url Shortener --SharePoint 2010 短URL生成器 项目描写叙述 本项目加入了这种功能.在SP站点中能够生成短URLs. 这些URLs指向列 ...
- 短URL
短网址应用已经在全国各大微博上开始流行了起来.例如QQ微博的url.cn,新郎的sinaurl.cn等. 我们在QQ微博上发布网址的时候,微博会自动判别网址,并将其转换,例如:http://url.c ...
- 二维码及二维码接合短URL的应用
二维码 1.什么是二维码? 二维条形码,最早发明于日本,它是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,在代码编制上巧妙地利用构成计算机内部逻辑基础的“0 ...
- 短URL生成
算法原理 算法一 1)将长网址md5生成32位签名串,分为4段, 每段8个字节; 2)对这四段循环处理, 取8个字节, 将他看成16进制串与0x3fffffff(30位1)与操作, 即超过30位的忽略 ...
- django简单实现短url
一.短url的原理 什么是短url: 简单讲就是把普通正常访问的网址,转换成比较短的网址,例如:https://www.cnblogs.com/angelyan/articles/10667354.h ...
- 短URL系统、301/302重定向
短 URL 系统是怎么设计的?https://yq.aliyun.com/articles/87600 短网址(short URL)系统的原理及其实现 https://hufangyun.com/20 ...
- mongodb:短网址项目
短网址项目概述 1.短网址项目,是将给定的长网址,转换成短网址. 如 新浪 http://t.cn/zQd5NPw ,其中zQd5NPw就是短网址 前段页面如下
随机推荐
- 洛谷P3381 - 【模板】最小费用最大流
原题链接 题意简述 模板题啦~ 题解 每次都以费用作为边权求一下最短路,然后沿着最短路增广. Code //[模板]最小费用最大流 #include <cstdio> #include & ...
- linux链接
( 1 )软连接可以跨文件系统,硬连接不可以 ( 2 )硬连接不管有多少个,都指向的是同一个 I 节点,会把结点连接数增加,只要结点的连接数不是 0 ,文件就一直存在不管你删除的是源文件还是连接的文件 ...
- 基础--Redis在Linux环境下的安装
1. 安装redis服务 1.1 检查安装依赖程序 yum install gcc-c++yum install -y tclyum install wget 1.1.1 下载redis安装包 (或者 ...
- java-数据库连接,分层实现增删改查测试
成员属性类: public class Dog { private int number; private String name; private String strain; private St ...
- "No Python interpreter configured for the project " in Pycharm for python selenium
自动化测试问题: pyCharm提示python Interpreter没有设置,点击configure Python Interpreter,进入Settings 在 Project Interpr ...
- R语言︱文本挖掘——词云wordcloud2包
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者看到微信公众号探数寻理中提到郎大为Chif ...
- 用Dw CS6运行静态页面出问题
1.报错截图一 2.报错截图二
- 【php】error_reporting的用法
定义和用法: error_reporting() 设置 PHP 的报错级别并返回当前级别. 函数语法: error_reporting(report_level) 如果参数 level 未指定,当前报 ...
- gstreamer在Ubuntu下构建开发环境
1,Ubuntu已经安装了gstreamer库,因此只需要再安装几个开发库即可,是 libstreamer0.-libstreamer0.-devlibstreamer0.--dbg 在新立得里选中应 ...
- OpenGL shader渲染贴图
simple.vert #version core layout (location = ) in vec3 position; layout (location = ) in vec3 color; ...