Dart 模型序列化 JSON

默认分类 2019-05-20 02:55 暂无评论

JSON 数据样本:

{
  "status": 200,
  "message": "请求成功",
  "data": {
    "page": 1,
    "count": 80,
    "list": [
      {
        "title": "文章标题 A"
      },
      {
        "title": "文章标题 B"
      }
    ]
  }
}

在 Dart 中序列化最简单的方法:

import 'dart:convert';

final String sample = '{"status": 200,"message": "请求成功","data": {"page": 1,"count": 80,"list": [{"title": "文章标题 A"},{"title": "文章标题 B"}]}}';

final Map<String, dynamic> article = json.decode(sample);
print(article['data']['count']); // 读取文章总数

阅读剩余部分

Vue.js 路由参数发生变化时使用 Object.assign 初始化 data

默认分类 2019-05-03 04:10 暂无评论

最近这一年都在用 Vue.js 做项目,有时候路由参数发生改变时页面不会重载,导致数据都是旧的。

场景如下:
当前 URL:http://localhost:8080/news?id=1&page=1
发生变化:http://localhost:8080/news?id=1&page=2

这个时候 page 参数改变了,但是页面内容没有发生改变,这时候一般需要用到 beforeRouterUpdate 可以参考文档来重新请求一遍数据就可以了。

但是,如果我们有一些变量,如打开关闭对话框。处于打开状态,但是我翻页时并没有关闭对话框。这个时候翻页对话框也存在,并且对话框调用的数据是上一页的,这个时候我们翻页前需要关闭对话框,在 beforeRouterUpdate 可以进行修改。

但是如果页面复杂的时候,有大量变量要初始化的话,那么 beforeRouterUpdate 一大堆变量赋值,又臭又长难看,这个时候只需要用 Object.assign(this.$data, this.$options.data()) 就可以解决初始化的问题了。然后,再去请求数据

JavaScript 指定时区时间

默认分类 2018-09-30 07:28 暂无评论

如果没有特殊要求,一般 JavaScript 时间戳格式化会根据系统时间或浏览器的语言地区来转换时间

let zhCNTime = (timestamp = new Date().getTime()) => {
  let timeZone = new Date().getTimezoneOffset() // 距离 UTC 0 时区相差多少分钟
  let UTCtimeZone = new Date(timestamp).getTime() = (timeZone * 60000)
  return UTCtimeZone + (3600000 * 8) // 转北京时间戳
}

Google Cloud CDN 部署 HTTP 跳转 HTTPS

默认分类 2018-06-15 22:42 暂无评论

Google Cloud 目前注册验证通过信用卡还是有 $300 赠送免费使用一年的。

Google Cloud 的基础网络真的没得说。CDN 也非常的快,全球 ping 值都非常低,就是流量略贵。

首先使用 Google Cloud CDN 与传统的 CDN 使用方式不一样。现在大部分的 CDN 都是通过 CNAME 解析的,Google Cloud CDN 是以 GCE 为基础建立一个 Anycast 网络,在使用 Google Cloud CDN 前,你必须保证最少创建了一个 GCE 实例,否则无法成功使用 Google Cloud CDN 服务!

GCE 上所实现的这个功能是基于第七层的网络代理,所以其拓扑图是这样的:

用户 -- 边缘服务器 -- 实例

  1. 用户到边缘服务器之间的连接:使用 HTTP 或 HTTPS;如果是 HTTPS 连接,那么 TLS 加密过程是在边缘服务器上实现。
  2. 边缘服务器到实例的连接:使用 HTTP 或 HTTPS 连接,之前的网络是走的 Google 的专线。

不论配置了几个位置的实例,边缘服务器都是使用 Google 全部的边缘服务器。

启用这个功能后,就会得到另一个 Anycast 的 IP 地址,这是个独享的 IP 地址。

阅读剩余部分

Tornado 参数校验

Python 2017-06-07 22:34 暂无评论

tornado 做数据校验的时候有点麻烦,特别是我接收和输出都是 JSON 这里用到的是 jsonschema 来做校验数据,如果参数不符则报错。

import functools
from tornado.web import RequestHandler, Application
from tornado.escape import json_decode, json_encode
from tornado.web import asynchronous
from tornado import gen

# 校验 json 数据
def Validates(Schema):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(self, *args, **kwargs):
            try:
                validate(json_decode(self.request.body), Schema)
                return func(self, *args, **kwargs)
            except:
                self.set_status(500)
                self.write({"success": False, "message": "params error", "status": 500})
        return wrapper
    return decorator

class PlanHandler(BaseHandler):
    @asynchronous
    @gen.coroutine
    def get(self, *args, **kwargs):
        self.write("hello")

    @Validates(PlanSchema)
    @asynchronous
    @gen.coroutine
    def post(self, *args, **kwargs):
        params = json_decode(self.request.body)
        self.write(params)

再贴一个无参数的装饰器。有参数的要多一个函数。

# 校验令牌
def ValiAuth(func):
    def decorator(self, *args, **kwargs):
        if json_decode(self.request.body)["auth"] != self.auth:
            self.set_status(401)
            self.write({"success": False, "message": "Auth error", "status": 401})
        else:
            return func(self, *args, **kwargs)
    return decorator