四时宝库

程序员的知识宝库

57挑战之54,实现一个url 跳转服务(三)

节前天的内容。继续:

  1. 根据业务画出流程图(dag,有向无环图)。
  2. 看缺乏哪些函数,直接设计函数,主要入参和出参,根据出入参进行写逻辑。

dag图有了,参考这里:

https://www.toutiao.com/article/7101114126621229601

这个时候可以根据dag图做一些数据结构设计,以及函数设计。

"""前端的作用,
---------------------------------------------------------------------------------------
1.功能1:收集长链接并生成短链接
  dag流程:收集长URL,并确认长URL有效,如果有效则生成短URL,并传递到后端服务器。
  1-1 收集长URL: 通过在index.html 中设计一个表单,客户输入表单后,用requests.form 方法获取表单内容
  1-2 检查长URL是否有效:通过checkurl(longurl)函数,当longurl 有效则返回1,否则返回0
  1-3 生成短URL:通过createshorturl(longurl)函数,从长url里面截取字段另外加上时间来生成一个短url
  1-4 传递到后端服务器:把长短URL的关系记录到后端
      具体实现可以通过requests.post 方法,向对应的restful api 进行请求(备注1),传递jason字段(备注2)
      备注1:这里指post 的url,指requsts.post 请求对应的Url,建议post的url要详细到具体的接口,比如127.0.0.1:8008/api/shorturlcreate 接口,这样后端服务器可以根据接口特性来进行相应的逻辑处理
      备注2:制作字典,按照 dic1= {短链:{"长链":长链,"访问日期":"null","创建日期":date}} 创建
      另外,requests.post 方式,选择data=json 方式传递,json字段是对备注2里字典信息做字符串序列化的结果 json.dumps(dic1)


2.功能2:收集短链接做相关跳转
  dag流程:收集短url,如果短url存在,则接收服务端的redirect请求,跳转到短URL对应的长URL链接上。
  2-1 收集短url:通过在index.html设计一个表单,客户输入表单后,用requests.form方法获取表单内容
  2-2 检查短url是否存在:通过checksurl(shorturl)函数,当shorturl有效则返回1,否则返回0 (服务端)
  2-3 跳转到长URL:通过jumpurl(shorturl)函数,请求到服务端。服务端先判断短URL是否存在,如果存在则做redirect。
      jumpurl函数设计:
      1.访问到后端服务器,requests.post(url/api/jump,""), 后端服务器根据URL具体的api来返回信息,返回值里包含了URL信息
      2.服务端要构造返回的Header值,根据Location 参数 ,让客户浏览器跳转到对应的长链URL中



3.功能3:请求某个短链的访问信息,并进行展示:
  dag流程:收集短url 对应的信息,如果短URL存在,则返回这个短URL被调度的次数等信息
  3-1 在第2-3步,每次服务端指定后端做跳转的时候,把短URL被访问的时间做一个记录。
      服务端操作:
      每次访问短链的时候,对访问情况做个统计:
       3-1-1: {短url:访问时间} 存入redis 另外一个表里。
       3-2-2:对之前的 数据结构做个更新,主要是对 shorturl 的value做个update,访问时间增加一行。

  3-2 发起请求,通过requests.post() 函数,传参数为 /api/statics ,到后端
      收集后端返回的json字符串,查询时间,短url,以及这个url的访问列表,{date:[list],"shorturl",url, visittime:[list]}。
      用json.loads() 把信息拿到,然后收集visittime的信息,
      按照天的维度对visittime做一个图像化。---作业。


redis 数据结构设计:
      key:value
      shorturl:{"对应的长链接":longurl,"访问时间":[visitdate1,visitdate2],"创建时间":createdate}
      把短链做为Key,把长链的信息、访问时间,创建时间作为value,

---------------------------------------------------------------------------------------


前端设计1 :

1.功能1:收集长链接并生成短链接

dag流程:收集长URL,并确认长URL有效,如果有效则生成短URL,并传递到后端服务器。

1.收集长URL:通过在index.html 中设计一个表单,客户输入表单后,用requests.form 方法获取表单内容。

2.检查长URL是否有效:通过checkurl(longurl)函数,当longurl 有效则返回1,否则返回0。

3.生成短URL:createshorturl(longurl)函数。

4.传参函数:linkshort_long(shorturl,longurl)

把长短链对照信息做成一个字典,并把字典转化为json字段。

restapi 方式向后端传递相关信息:requests.post("URL", json=post_data)

def checkurl(longurl):
    #判断longurl 是否可以访问
    #如果是有效的,返回头为200,则返回1
    #如果长连接无效,返回头为200 之外的,则返回0
    return result


def createshorturl(longurl):
    #头几个字符基于时间-年月日时
    #后几个字符取长链的前几个字段
    return shorturl

def linkshort_long(shorturl,longurl):
    #生成一个json字段,并作为post逻辑的输入。
    #后续这个字典被Json化后传入到服务器后端,后端程序基于short url 及 createtype 可以做插入redis的操作。
    dic = {"shorturl":shorturl,"date":date,"longurl":longurl,"createtype":"build"}
    return dic

前端设计2:

dag流程:收集短url,如果短url存在,则接收服务端的redirect请求,跳转到短URL对应的长URL链接上。

2-1 收集短url:通过在index.html设计一个表单,客户输入表单后,用requests.form方法获取表单内容

2-2 检查短url是否存在:通过checksurl(shorturl)函数,当shorturl有效则返回1,否则返回0 (服务端)

2-3 跳转到长URL:通过jumpurl(shorturl)函数,请求到服务端。服务端先判断短URL是否存在,如果存在则做redirect

jumpurl函数设计:

1.访问到后端服务器,requests.post(url/api/jump,""), 后端服务器根据URL具体的api来返回信息,返回值里包含了URL信息

2.服务端要构造返回的Header值,根据Location 参数 ,让客户浏览器跳转到对应的长链URL


def checksurl(shorturl):
    #检查shorturl 是否在后台服务中存在,
    #后台判断是否存在,如果存在则返回确认
    #如果存在则返回值为真,否则为假
    return result

def jumpurl(shorturl):
    #发数据到服务端,
    #服务端判断短链是否存在
    #如果存在则返回 redirect header,做301
    #同时服务端做一个记录。
    

前端设计3:

3.功能3:请求某个短链的访问信息,并进行展示:

dag流程:收集短url 对应的信息,如果短URL存在,则返回这个短URL被调度的次数等信息

3-1 在第2-3步,每次服务端指定后端做跳转的时候,把短URL被访问的时间做一个记录。

#根据请求,做相关展示逻辑。

@app.route('/shorturl/stats')
def route_statics():
    #从requests 里面获取shorturl的信息
    #post到服务端,收集访问信息
    #从服务端获取返回数值字典
    #用返回字典做展示,跳到一个单独的页面,用render_template模版。
    return dict


服务端操作:

每次访问短链的时候,对访问情况做个统计:

3-1-1: {url:访问时间} 存入redis 另外一个表里。

3-2-2:对之前的 数据结构做个更新,主要是对 shorturl value做个update,访问时间增加一行。

3-2 发起请求,通过requests.post() 函数,传参数为 /api/statics ,到后端

收集后端返回的json字符串,查询时间,短url,以及这个url的访问列表,{date:[list],"shorturl",url, visittime:[list]}

json.loads() 把信息拿到,然后收集visittime的信息,

按照天的维度对visittime做一个图像化。---作业。


def check_ifexist(longurl):
# 检查长链接是否存在,如果存在则跳过


def record_check(dic1):
    #收集长短链的链接请求,如果是访问/api/record 则进入逻辑
    #把字典信息直接写redis(),
    #redis插入,主要插入短链(key)及短链的对应信息表结构(value),另外针对长链接是否存在的表结构(key为长链接,value为1)

def record_route(shorturl):
    #收集route请求,如果访问的是/api/route ,则进入逻辑
    #查询短链对应的长链接
    #返回header指定location 为长链接
    #通过update redis表,记录这次访问,


redis 数据结构设计:

表1:

keyvalue

shorturl:{"对应的长链接"longurl,"访问时间":[visitdate1,visitdate2],"创建时间":createdate}把短链做为Key,把长链的信息、访问时间,创建时间作为value

这样设计表结构的作用是,每次可以查到visit的访问时间,可以容易查到shorturl被访问的情况。

表2

key:value

longurl:shorturl

主要用来查询对应的longurl 是否存在,把它作为Key更加容易。


先写到这里,感觉还是蛮复杂的,不过经过上面的分析,其实大体程序框架已经ready了。

下一步准备客户端、服务端的代码。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接