feathersjs动态设置有效期

在 feathersjs 框架中,虽然可以在 config/default.json 设置 jwt 的有效期,但是如果想根据不同用户动态设置有效期的话,应该如何操作呢?可以通过自定义 params.jwt,加入 expiresIn 参数,这个有效期就会覆盖配置文件里面的有效期了。

1
2
3
4
5
6
7
8
9
10
11
12
13
app.service('authentication').hooks({
before: {
create: [
authentication.hooks.authenticate(config.strategies),
context => {
context.params.jwt = { expiresIn: 10 }; // 10 seconds
}
],
remove: [
authentication.hooks.authenticate('jwt')
]
}
});

5分钟快速上手nestjs

NestJS 是一个渐进式 Node.js 框架,使用 TypeScript 编写并且结合了 OOP(面向对象编程),FP(函数式编程)和 FRP(函数式响应编程)的相关理念。NestJS 在设计上与前端框架 Angular 非常类似,与后端框架 Spring 也非常类似,学起来非常容易,5 分钟即可上手。

创建项目

安装 NestJS 命令行工具:

1
2
3
npm install -g @nestjs/cli
# 或者
yarn global add @nestjs/cli @nestjs/schematics

创建新项目并启动:

1
2
nest new xxx
yarn run start:dev # 启动项目,打开 http://localhost:3000/ 会看到 hello world

Read More

flutter国内镜像地址

【转】 Flutter 官方镜像很慢,在此记录一些国内镜像地址,方便查阅:

  • Flutter 社区
    社区主镜像,采用多种方式同步 Flutter 开发者资源(推荐)。

    1
    2
    $ export PUB_HOSTED_URL=https://pub.flutter-io.cn
    $ export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
  • 清华大学 TUNA 协会
    定时与 Flutter 社区 Storage 镜像同步,Pub API 采取定时主动抓取策略,镜像配置了完善的失败回源策略(推荐)。

    1
    2
    $ export PUB_HOSTED_URL=https://mirrors.tuna.tsinghua.edu.cn/dart-pub
    $ export FLUTTER_STORAGE_BASE_URL=https://mirrors.tuna.tsinghua.edu.cn/flutter
  • 上海交大 Linux 用户组
    使用反向代理方式建立的 Flutter 镜像,数据与站源实时同步。 Pub API 返回值未做处理,可能造成无法访问的情况。

    1
    2
    $ export PUB_HOSTED_URL=https://dart-pub.mirrors.sjtug.sjtu.edu.cn
    $ export FLUTTER_STORAGE_BASE_URL=https://mirrors.sjtug.sjtu.edu.cn
  • CNNIC
    基于 TUNA 协会的镜像服务,数据策略与 TUNA 一致,通过非教育网的域名访问。

    1
    2
    $ export PUB_HOSTED_URL=http://mirrors.cnnic.cn/dart-pub
    $ export FLUTTER_STORAGE_BASE_URL=http://mirrors.cnnic.cn/flutter
  • 腾讯云开源镜像站
    定时(每天凌晨)与 TUNA 协会镜像同步,数据有延迟,访问速度有待反馈。

    1
    2
    $ export PUB_HOSTED_URL=https://mirrors.cloud.tencent.com/dart-pub
    $ export FLUTTER_STORAGE_BASE_URL=https://mirrors.cloud.tencent.com/flutter

风寒与风热感冒

感冒分风寒感冒和风热感冒,这两种感冒病因病机、症状、治疗原则及用药差别很大。风寒感冒是风寒之邪外袭、肺气失宣所致。风热感冒是风热之邪犯表、肺气失和所致。

  • 风寒感冒症状和疗法

    恶寒重、发热轻、无汗、头痛身痛、鼻塞流清涕、咳嗽吐稀白痰、口不渴或渴喜热饮、苔薄白。治疗药物:风寒感冒颗粒、感冒清热颗粒、正柴胡饮冲剂、头痛严重用川芎茶调散、咳嗽严重用通宣理肺丸。风寒感冒要多喝水、盖好被子、热水泡脚、喝姜茶,发汗有助于康复。

  • 风热感冒症状和疗法

    发热重、微恶风、头胀痛、有汗、咽喉红肿疼痛、咳嗽、痰粘或黄、鼻塞黄涕、口渴喜饮、舌尖边红、苔薄白微黄。治疗药物:感冒灵颗粒、连花清瘟胶囊、柴芩清宁胶囊、维C银翘片、双黄连等。

千万不要用ListTile组件

最初,在 Flutter 项目中用 ListTile 实现了列表项的布局,速度很快,而且代码比较简单,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ListTile(
leading: Icon(
Icons.account_box,
color: Colors.red,
),
title: Text(
'账户',
textAlign: TextAlign.left,
style: TextStyle(
color: Colors.grey,
),
),
trailing: Icon(Icons.keyboard_arrow_right),
onTap: () {
// 响应点击事件
},
)

Read More

浏览器中的消息队列和事件循环

事件循环是如何产生的

在浏览器中,JS 的主线程是单线程的,异步的代码被放到了任务队列中,JS 主线程不断地轮询任务队列,每次从队首取出一个任务并进行处理,从而构成了事件环。

任务队列的类型

任务队列有两种,分别是宏任务(macrotask)队列和微任务(microtask)队列,用于存放不同的任务:

  • 宏任务主要有:script(用户代码)、setTimeout、setInterval、I/O、UI 交互事件、postMessage、MessageChannel 等
  • 微任务主要有:Promise.then、 MutationObserver 等

事件环的工作流程

  • JS 引擎首先从上而下执行用户 script 代码(宏任务)
  • 如果遇到 setTimeout、promise、click事件等,按照分类放入宏任务队列或微任务队列中
  • 继续执行后面的代码,script 执行完毕后,会清空所有的微任务
  • 微任务清空后可能会进行一次 UI 渲染(不是每次都会)
  • 然后再去宏任务队列中取出一个执行,循环往复

图示

浏览器中的事件环

Flutter Webview手机模式

在 Flutter 项目中用 webview 里面开了一个网页,发现字体好小,解决方案就是通过 meta 指定 mobile 视图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var contentBase64 = base64Encode(
const Utf8Encoder().convert(
"""
<!DOCTYPE html>
<html>
<head><meta name="viewport" content="width=device-width, initial-scale=1.0"></head>
<body style='"margin: 0; padding: 0;'>
<div>
$htmlString
</div>
</body>
</html>
""",
),
);

Dart中合并Map的三种方式

Dart 中合并 Map 的三种方式:

  1. 通过 addAll

    1
    2
    3
    4
    5
    6
    7
    8
    9
    var firstMap = {"1":"2"};
    var secondMap = {"2":"3"};

    var thirdMap = {};

    thirdMap.addAll(firstMap);
    thirdMap.addAll(secondMap);

    print(thirdMap);
  2. 通过 ..

    1
    var thirdMap = {}..addAll(firstMap)..addAll(secondMap);
  3. 通过 ...

    1
    2
    3
    4
    5
    6
    7
    final firstMap = {"1":"2"};
    final secondMap = {"2":"3"};

    final thirdMap = {
    ...firstMap,
    ...secondMap,
    };
注意:`...` 操作符在 sdk 2.3 及以后版本中可用 

Flutter中带header的ListView

在 Flutter 项目中,经常会遇到在使用 ListView 的时候,需要添加一个header,例如上面是图文下面是评论。但是 Flutter ListView 组件中并没有属性可以设置 header,对于这种情况,可以先把 header 画出来,然后放到 ListView 的第一个元素即可。下面是示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
ListView.builder(
itemCount: data == null ? 1 : data.length + 1,
itemBuilder: (BuildContext context, int index) {
if (index == 0) {
// 第一个元素渲染header
return new Column(...);
}
index -= 1;
// 下面才是渲染列表
var row = data[index];
return new InkWell(... with row ...);
},
)