2021年7月

网易云音乐上的翻译完全失去了原词的性感, 这儿我对比重新翻译一下。

作词 : Adam Levine/Shellback/Savan Kotecha/Max Martin
作曲 : Adam Levine/Shellback/Savan Kotecha/Max Martin

我的重译 英文原词 网易云音乐翻译
你和我,关系恶化 You and I go hard, 我们的关系不断僵化
彼此看来,就快干架 at each other like we're going to war 在彼此看来都是紧张到一触即发
你和我,日益暴躁 You and I go rough, 生活变得艰难
东西互砸,把门摔爆 we keep throwing things and slamming the doors 我们唯一的交流变成了摔打东西和大力的关门隔绝彼此
你和我,两人有病 You and I get sore, 我们变得易怒、歇斯底里
功能失调,整天较劲 then dysfunctional we stuck keeping score 以互踩痛处而相互较量
你和我,已经烦透 You and I get sick, 我们的所作所为编的越来越超出常规
谁都知道,我们不能在这样! they all know that we can't do this no more 连旁人都看不下去了
但是宝贝,你又要走 But baby there you go again, 但是亲爱的你
你又要走,又让我爱上你啦 there you go again making me love you 又再一次让我爱上了你
我,不用大脑 Yeah I stopped using my head, 是的,我已经停止思考
不用大脑,一切放手 using my head let it all go 思考该怎么放手
你,贴我身上 Got you stuck on my body, 你紧紧贴着我的身体
贴我身上,像个刺青 on my body like a tattoo 就像一枚带着疼痛的印记
我,像个傻逼 And now i'm feeling stupid, 现在的我感觉自己很愚蠢
像个傻逼,爬到你背后 feeling stupid crawling back to you 悄悄溜回你身边的决定是如此的失策
所以,我胸前画个十字,不如死了算了 So I cross my heart, and I hope to die, 所以我以我的生命起誓
只要让我陪你再多一夜 that i'll only stay with you one more night 我只会跟你再待最后一晚
我知道我说过千百万次 And I know i've said it a million times 我知道我已经说了千万遍
但我真的只要陪你再多一夜 But i'll only stay with you one more night 但这真的是我们相处的最后一夜
想和你说不 Trying to tell you no, 我试图拒绝你
但我的身体却一直说好 but my body keeps on telling you yes 可我的身体却自行接受
想和你说停 Trying to tell you stop, 我试图停下
但你的口红让我喘不过气 but your lipstick got me so out of breath 但你口红的颜色都快让我无法呼吸
我明早醒来 I'd be waking up, 我必将在清晨醒来时
大概会厌恶自己 in the morning probably hating myself 无比厌恶这样的自己
我明早醒来 And i'd be waking up, 我必将在清晨醒来时
无比满足却又负罪如坠地狱 feeling satisfied but guilty as hell 心中满是满足和如临地狱般的罪恶感
但是宝贝,你又要走 But baby there you go again, 但是亲爱的
你又要走,又让我爱上你啦 there you go again making me love you 你又再一次让我爱上了你
我,不用大脑 Yeah I stopped using my head, 是的,我已经放弃了思考权衡,
不用大脑,一切放手 using my head let it all go 我不会再放手
你,贴我身上 Got you stuck on my body, 让你紧紧的缠绕着我的身体
贴我身上,像个刺青 on my body like a tattoo 就像枚带着疼痛的印记
我,像个傻逼 And now i'm feeling stupid, 我现在感觉自己如此愚蠢
像个傻逼,爬到你背后 feeling stupid crawling back to you 我真后悔悄悄溜回你的身旁
所以,我胸前画个十字,不如死了算了 So I cross my heart, and I hope to die, 所以我以死起誓
只要让我陪你再多一夜 that i'll only stay with you one more night 只再和你共度一晚
我知道我说过千百万次 And I know i've said it a million times 我知道我已经说了千万遍
但我真的只要陪你再多一夜 But i'll only stay with you one more night 但这真的是最后一晚
耶宝贝再给我一夜 Yeah baby give me one more night 亲爱的再让我和你多待一晚
耶宝贝再给我一夜 Yeah baby give me one more night 再给我一夜回忆
耶宝贝再给我一夜 Yeah baby give me one more night 最后一夜
但是宝贝,你又要走 But baby there you go again, 但亲爱的你
你又要走,又让我爱上你啦 there you go again making me love you 又让我再次的爱上了你
我,不用大脑 Yeah I stopped using my head, 我已经不能再维持理性
不用大脑,一切放手 using my head let it all go 不能再对你放手
你,贴我身上 Got you stuck on my body, 想让你始终呆在我的身旁
贴我身上,像个刺青 on my body like a tattoo 就像枚滴血的刺青
耶耶耶耶 Yeah, yeah, yeah, yeah 耶~
所以,我胸前画个十字 So I cross my heart, 我双手交叉
死了算了 and I hope to die, 以我的生命起誓
只要让我陪你再多一夜 that i'll only stay with you one more night 这将会是你我共处的最后一夜
我知道我说过千百万次 And I know i've said it a million times 我知道这句话我已经说了千万遍
但我真的只要陪你再多一夜 But i'll only stay with you one more night 但我只想与你多待这最后一夜
耶宝贝再给我一夜 (yeah baby give me one more night) 最后一夜
所以,我胸前画个十字,不如死了算了 So I cross my heart, and I hope to die, 所以我用我的生命起誓
只要让我陪你再多一夜 that i'll only stay with you one more night 这真的将是最后一夜
我知道我说过千百万次 And I know i've said it a million times 我知道这句话我已经说了千万遍
但我真的只要陪你再多一夜 But i'll only stay with you one more night 但我此刻只想与你共度今夜时光

官方的说明上不去了 http://docs.typecho.org/develop/acl, 这儿转载官方说明如下:

在Typecho中分别设置了5个等级的权限供多个用户共用一个博客。他们的权限从高到低分别是:管理员(administrator), 编辑(editor), 贡献者(contributor), 关注者(subscriber), 访问者(visitor).其权限设置与wordpress有一些相同之处,但是扩展方法不尽相同。

权限名称 管理员 编辑 贡献者 关注者 访问者
代号 administrator editor contributor subscriber visitor
等级1) 0 1 2 3 4
阅读
进入控制台 ×
修改自己的档案信息 ×
撰写文章 √2) × ×
管理文章 √3) × ×
撰写页面 × × ×
管理页面 × × ×
上传文件 √4) × ×
管理文件 √5) × ×
管理评论 × × ×
管理分类和标签 × × ×
管理链接 × × × ×
管理用户 × × × ×
管理插件 × × × ×
调整外观 × × × ×
基本设置 × × × ×
评论设置 × × × ×
阅读设置 × × × ×
撰写习惯设置 × ×

开发人员接口

对用户的权限操作以及用户信息获取,我们都封装在了Widget_User组件中。开发人员可以通过调用此组件获取相关信息。

方法名称 描述 参数
login 登录用户 * $uid(int) - 用户ID
  1. 数字越小权限越高
  2. 审核后发布
  3. , 5) 仅限于自己
  4. 受限

只知非黑即白的年轻人喜欢说话,他们觉得世界和自己一样单纯;只知流量为王的自媒体喜欢说话,他们觉得世界处处都能把流量变现;剩下的我们知道世界善恶相杂、并不易分开对错,所以不爱说话,所以,我们是沉默的大多数。😷

知乎:有哪些好用的管理家庭物品的应用(收纳管理)?

名称 平台 离线使用 收纳物品 生产日期、保质期 搭配硬件 备注
电子收纳专家 Android - - - - 可以盒子套盒子。Android10以后不能使用
收哪儿 - - - - - -
唯物主艺 - - - - - -
小鱼收纳 - - - - 二维码标签、收纳盒 -
桃桃收纳(收纳·家) - - - - 二维码标签、收纳盒 -
晒书房 iOS、Android - 书籍 - - 豆瓣导入
我的衣橱 iOS - - - - 可拍照,淘宝购买记录导入
美容护肤品管理器 iOS - - 批代码导入 - -
过期日 - - 食品 - -
云收纳 微信小程序 - - - - -
我的物品 iOS - - - - -
家里有什么 微信小程序 - - - -
存存 - - - - - -
西瓜冰箱 - - - - - -
收纳盒子 iOS - - - - -
Sortly iOS - - - - 物品数量多要收费

风险

  • 法律风险: @晒书房 在2021-7-23发布微博称将于2021-7-30停止服务,出于个人兴趣至今已经服务9年多,微博粉丝40167,看起来似乎是监管所致。物品、书籍拥有即有合法非法之分
  • 展示风险: 物品近乎于个人隐私。可以从物品的拥有判断出此人的兴趣爱好等。故不宜将所有物品直接展示。
  • 交易风险: 如果有人借助此平台进行非法交易,如贩卖毒品该怎么办?交易中涉及钱财交换,如何相互信任?所以不宜通过此平台直接交易,而宜导流至其他成熟平台如闲鱼。但这样做会大大增加用户交易付出的精力和时间成本,导致交易流动性减弱。

昨天东京奥运开幕式,下班后看到CCTV1直播,断断续续看了些。今天就在B站和微信上发现大量自媒体说东京奥运如何阴间,标题都是这样的:
网易首页 > 网易号 > 正文 日本鬼片?开幕式画面太惊悚,贞子既视感,网友:家长陪同观看 2021-07-23 20:14:38 来源: 梦与体育

B站 黛玮爸爸:东京奥运会开幕式为何像恐怖片一般,如此阴间—你是不是也看得一头雾水?
配了下面这些截图

大量自媒体用了这个图

另外的图来自于东京奥运宣传舞台剧《Wassai》

陈老师的教学鼠标中键工具列 提取码: ukkc

视图

平移 右键(3D视图为Shift+右键), 上下左右键
缩放 中键|Ctrl+右键
旋转 shift+ctrl+右键(3D视图为右键)
放大/还原视图 双击视图名,如Top
切换视图 放大后点击下方视图标签

控制点

平移 Alt+上下左右

按钮编辑

移动/删除按钮 Shift+左键拖动
复制按钮 Ctrl+左键拖动
编辑按钮 Shift+右键点击

工具列(按钮列)

工具列可以很灵活的编辑/保存为文件/从文件导入

操作轴

需要把状态栏的操作轴点击加黑打开
平移/旋转/缩放: 鼠标左键可以直接做按轴平移(箭头轴)/按面平移(田字)/旋转(旋转弧)/缩放(缩放杆), 按住shift+左键缩放,可以同时在3轴缩放
线挤出面: 拉伸箭头轴上的原点, 或Ctrl拉伸箭头;
复制: 按住Alt拉伸箭头,或拉伸旋转弧
调节缩放杆长度: 按住ctrl拉伸调节.
操作轴右键菜单(白点菜单)

  • 定位操作轴: 可以将操作轴中心重新定位到其他位置
  • 重置操作轴: 将操作轴重置到默认位置;
  • 自动重置操作轴: 每次操作后自动将操作轴回正.
  • 拖拽强度: 减小拖拽强度可以更精细的拖拽

显示模式

右键视图模式切换, 一般用着色模式. 着色模式可以修改所有物体的显示方式.

常用快捷键

切换显示网格 F7
框选放大 Ctrl+W
物体充满窗口 Ctrl+Shift+E
复制物体 鼠标左键拖动物体时, 点一下Alt就变成复制了
多选物体 Shift+左键增加, Ctrl+左键减少
空格=回车=右键
锁定当前画线的方向 Tab
打开或关闭控制点 F10/F11

选取方式

左向右框选: 需全部框中
右向左框选: 只需部分框中
Alt+左向右框选: 不会点中鼠标开始位置的物体(强制由点选变为框选)
使用选取Tab页选择, 实现很多特殊选择, 如选取所有点/曲线/曲面等
超级移动: 选择体中的一个点/线/面(穿透选择, 即穿透体选择面) Ctrl+Shift+左键,并能单独控制其位置形态

图层

图层移动 选中对象后, 在下方状态栏点选切换图层即可

贝塞尔曲线

控制点数=阶数+1
1阶贝塞尔: 直线
2阶贝塞尔: 抛物线

放样

loft

记录建构历史

建构体中使用的点线面,在建构完成后还能通过修改其位置来改变建构后的体的形态

在工作平面为xy时候画垂直线

按住ctrl点击一个点

Nurbs: 非均匀有理B样条, 曲面, 曲线, 参数化
Polygon: 多边形, 网格
Subdivision: 细分, SubD

参数化建模软件: Rhino3D \ UG \ ProE \ SolidWorks \ FreeCAD, 文件格式: IGES \ STEP, 建筑模型文件格式: IFC
多边形建模: Blender , 文件: OBJ \ STL \ ABC \ DAE

Rhino7以Nurbs起家,现在是完整支持Nurbs/Polygon/Subdivision. 这三者什么区别? 这儿有一篇2012年的文章讲述了区别.

我来理解,Nurbs完美的描述了曲面, 实现了类似于矢量图无限放大不会变形的效果, Polygon的所有面都是以平面多边形组成, 像位图一样放大后就失去了细节, 然而却可以描述非常复杂的外形. SubD则是将网格边缘在实时显示时圆角(平滑)化而不需要去画对应的曲线,以较少的网格实现曲面平滑的效果.

深圳大学

包括:
师范学院(教育学部): 教育学院,心理学院,体育学院

艺术学部: 美术与设计学院,音乐舞蹈学院,影视与戏剧学院. 一级学科硕士点5个:设计学、美术学、艺术学理论、艺术设计、音乐与舞蹈学、戏剧与影视学;依托建筑学自主设置目录外二级学科博士点:建成空间人居环境工程。专业包括:

美术与设计学院
基础部
美术系
服装与服饰设计系
环境设计系
工业设计系
视觉传达设计系
数字媒体艺术系
创意策划与设计管理系
继续教育部
音乐舞蹈学院
音乐
舞蹈
流行音乐系(金钟音乐学院)
戏剧影视学院
表演系
播音与主持系

医学部: 基础医学院,生物医学工程学院,护理学院,药学院,口腔医学院,公共卫生学院,医学人文中心
马克思主义学院
经济学院
法学院
人文学院
外国语学院
传播学院
数学与统计学院
物理与光电工程学院
化学与环境工程学院
生命与海洋科学学院
机电与控制工程学院
材料学院
电子与信息工程学院
计算机与软件学院
建筑与城市规划学院
土木与交通工程学院
管理学院
高等研究院
金融科技学院
国际交流学院
继续教育学院
体育部
[深圳大学-希伯来学院](), 定位: 生物医学转化研究院

南方科技大学

电子科技大学(深圳)高等研究院

硕士专业参考:
电子信息 (01)智能通信网络与信息处理
(04)电路与系统
(05)集成电路工程
(06)电磁场与微波技术
(07)电子信息材料与元器件
(15)计算机技术
(16)软件工程
(18)电子信息工程
(21)信息与通信工程
(29)智能通信网络与信息处理(非全)
(30)计算机技术(非全)
(31)软件工程(非全)
(32)光通信与光电工程
(33)仪器科学与技术
(34)控制科学与工程

深圳技术大学

应该是依托深圳大学应用技术学院办的大学. 地址:广东省深圳市坪山区兰田路3002号
2021本科招生计划如下:
2021本科招生计划
其中创意设计学院招收工业设计专业.
研究生招生:
学术学位
070200物理学;080200机械工程;080300光学工程;081200计算机科学与技术;083100生物医学工程;
专业学位
085400电子信息(计算机技术);085400电子信息(生物医学工程);085400电子信息(光学工程);085500机械;085600材料与化工;086100交通运输;

香港中文大学(深圳)

2021年本科招生:
(一)经管学院招生专业包括:1.市场营销、2.国际商务、3.经济学、4.金融学、5.会计学。

   (二)理工学院招生专业包括:1.数学与应用数学、2.电子信息工程、3.新能源科学与工程、4.化学。

   (三)人文社科学院招生专业包括:1.应用心理学、2.翻译、3.英语。

   (四)生命与健康科学学院招生专业包括:1.生物信息学、2.生物医学工程、3.药学、4.生物科学。

   (五)数据科学学院招生专业包括:1.统计学、2.计算机科学与技术、3.数据科学与大数据技术。

   (六)医学院招生专业包括:临床医学。本专业采用“1+5”的六年培养模式,开展多元学习,学生入学第一年为医学预科,重点加强通识教育,英语能力训练、数理训练、人文素质与职业道德培养及部分医学课程,第二至六年学习内容包括核心医学课程、实习实践,通过全面扎实的训练,努力培养具有领导力的卓越医学人才。

   (七)经管学院、理工学院与数据科学学院联合招生专业包括:金融工程。

研究生专业包括:
一、研究型研究生专业
全球研究哲学硕士-博士专业 >

生物科学哲学硕士-博士专业 >

经济学哲学硕士-博士专业 >

金融学哲学硕士-博士专业 >

计算机与信息工程硕士-博士专业 >

材料科学与工程硕士-博士专业 >

数学哲学硕士-博士专业 >

数据科学哲学硕士-博士专业 >
二、授课型研究生课程
同声传译文学硕士专业 >

翻译专业(笔译/口译)文学硕士专业 >

全球研究文学专业>

应用心理学理学硕士专业 >

会计学理学硕士专业 >

经济学理学硕士专业 >

金融学理学硕士专业 >

管理学理学硕士专业 >

数据科学理学硕士专业 >

供应链与物流管理高级管理人员理学硕士专业 >

通信工程理学硕士专业 >

金融工程理学硕士专业 >

市场学理学硕士专业 >

信息管理与商业分析理学硕士专业 >

金融EMBA >

生物信息学理学硕士专业>

深圳北理莫斯科大学

地址:广东省深圳市龙岗区国际大学园路1号

本科招生:
数学与应用数学
生物科学
材料科学与工程
经济学
俄语
国际经济与贸易
电子与计算机工程

硕士招生(学费每年4.2万元, 俄语教学)
应用数学与信息技术
基础材料学
纳米生物技术
地球生态变迁与人工干预系统
国际经济与商业
俄罗斯语言文化
对外俄语教学
城市生态学与区域规划

中山大学深圳校区

中山大学全部使用大类招生
深圳的院系包括:
医学院
公共卫生学院(深圳)
药学院(深圳)
材料学院
生物医学工程学院
电子与通信工程学院
智能工程学院
航空航天学院
农学院
生态学院
集成电路学院
先进制造学院
先进能源学院
网络空间安全学院
商学院
理学院

哈尔滨工业大学(深圳)

本科大类招生,包括:
计算机类
电子信息类
机械类
自动化类
电气类
能源动力类
土木类
环境科学与工程类
材料类
建筑类
经济学类
工商管理类
数学类
2021硕士招生计划[在这儿], 不过没有工业设计方面的.

深圳职业技术学院

学制都是3年.
招生包括:
包装策划与设计
产品艺术设计
城市轨道交通运营管理
传播与策划
大数据技术
大数据与会计
电气自动化技术
电子信息工程技术
动漫设计
法律事务
房地产经营与管理
风景园林设计
服装与服饰设计
港口与航运管理
给排水工程技术
工程造价
工商企业管理
工业机器人技术
工艺美术品设计
国际商务
护理
环境工程技术
环境艺术设计
机电一体化技术
机械设计与制造
集成电路技术
计算机网络技术
建设工程管理
建筑设计
建筑消防技术
建筑智能化工程技术
金融科技应用
精细化工技术
酒店管理与数字化运营
康复治疗技术
口腔医学
口腔医学技术
旅游管理
汽车电子技术
区块链技术应用
人工智能技术应用
软件技术
商务英语
社区管理与服务
食品检验检测技术
市场营销
视觉传达设计
首饰设计与工艺
数字出版
数字媒体艺术设计
数字图文信息处理技术
文化创意与策划
物联网应用技术
现代通信技术
新能源汽车技术
学前教育
眼视光技术
药学
音乐表演
游戏艺术设计
云计算技术应用
智慧健康养老服务与管理
智能交通技术
智能控制技术
智能网联汽车技术

深圳信息职业技术学院

报关与国际货运
城市轨道交通运营管理
大数据技术与应用
电子测量技术与仪器
电子商务
动漫制作技术
工商企业管理
工业机器人技术
工业网络技术
光电技术应用
光电制造与应用技术
广播影视节目制作
国际商务
环境工程技术
环境监测与控制技术
环境艺术设计
会计
会计信息管理
机械设计与制造
集成电路技术应用
计算机网络技术
计算机信息管理
计算机应用技术
建设工程管理
金融管理
旅游英语
汽车电子技术
嵌入式技术与应用
软件技术
商务英语
数字媒体艺术设计
数字媒体应用技术
通信技术
投资与理财
文化市场经营管理
文秘
物联网应用技术
物流管理
信息安全与管理
学前教育
移动互联应用技术
移动通信技术
园林工程技术
云计算技术与应用
智能产品开发
智能控制技术
智能终端技术与应用

清华大学深圳国际研究生院

研究生招生包括:
电子与通信工程
计算机技术
人工智能
大数据工程
互动媒体设计与技术
生物医学工程
仪器仪表工程
互联网+创新设计
集成电路与系统
智能制造
功能材料与器件
制药工程
环境工程
电气工程
海洋技术与工程
海洋能源工程
物流工程与管理
未来人居设计
医院管理
化学生物学(制药)
BIO3生命技术
高级财务管理与大数据硕士项目

[清华大学深圳国际校区]()

清华-伯克利深圳学院

主要方向是环境科学与新能源技术”、“数据科学和信息技术”、“精准医学与公共健康”招生博士和硕士研究生. 硕士专业包括:
0830J2环境科学与新能源技术
0812J3数据科学和信息技术
0830J2环境科学与新能源技术
0812J3数据科学和信息技术
0831J4 精准医学与公共健康

[北京大学(深圳)]()

北京大学深圳研究生院

硕士招生:
微电子学与固体电子学
计算机应用技术
化学(化学基因组学)
地理学(城市与区域规划)
环境科学
环境工程
材料物理与化学
西方经济学
企业管理  
金融硕士
新闻与传播硕士(财经传媒)
工商管理硕士
法律硕士(非法学)
法律硕士(法学)

暨南大学深圳校区(旅游学院)

本科专业包括:
旅游管理
旅游管理-高尔夫方向
风景园林
电子商务
商务英语
酒店管理
会展经济与管理
高级研修课程主要是旅游管理, 硕士专业主要是旅游管理(MTA)和金融.

广东新安职业技术学院

深圳广播电视大学-深圳开放大学

中国人民大学深圳研究院

看起来只收博士

[北京中医药大学深圳校区]()

中国科学院深圳理工大学

武汉大学广东研究院-国际教育中心

天津大学佐治亚理工深圳学院

深圳墨尔本生命健康工程学院, 筹备中

[深圳国际太空科技学院]()

[深圳吉大昆士兰大学]()

[俄罗斯列宾美术学院深圳学院]()

湖南大学罗切斯特设计学院

似乎是湖南大学设计艺术学院的分支. 艺术设计学院招生方向包括: 艺术硕士MFA, 工业设计本科(工学), 设计学硕士(学术型),设计学博士(学术型)

[华南理工罗格斯创新学院]()

湖南大学深圳研究院

附: 2018年教育部停止大学跨市本科办学

2018年,教育部办公厅印发的《关于做好2018年度高等学校设置工作的通知》(教发厅函〔2018〕215号)明确要求,申请设置本科学校的,须不存在跨地市办学的问题。

其中明确要求停止武汉大学深圳校区的办学。估计2018年开始其他没有实质签下来的学校都将停止做本科教育的深圳校区。

深圳教育局复函

为加快深圳高等教育发展,“十二五”以来,我市大力引进 国内外名校来深合作办学,其中包括洽谈引进武汉大学。2016 年 9 月 27 日,市政府与武汉大学签署了《武汉大学 深圳市人民 政府关于合作举办武汉大学·深圳备忘录》,借鉴世界一流大学 的成功经验,共同将武汉大学·深圳建设成为世界一流大学校区, 为深圳建设国际科技、产业创新中心提供有力支撑。时任深圳市 委书记马兴瑞、武汉大学党委书记韩进等共同见证签约仪式。但在 2016 年以后,教育部对高校异地办学政策收紧,2017 年教育部办公厅印发《关于进一步加强高等学校基本建设管理的 通知》(教发厅函〔2017〕12 号),要求审慎决策建设新校区, 原则上不支持、不鼓励跨城市、跨省建设新校区,特别是具有本 科教学功能的新校区。教育部还专门要求停止武汉大学深圳校区 建设。2018 年,教育部办公厅印发的《关于做好 2018 年度高等学校设置工作的通知》(教发厅函〔2018〕215 号)明确要求, 申请设置本科学校的,须不存在跨地市办学的问题。按上级部门 要求,我市洽谈引进武汉大学建设深圳校区项目不得不终止。

这篇文章介绍了四个软件和一个手动设置的方式,本质上都是添加到“任务计划程序”中。这儿有一篇中文文章也介绍了相似的方法。

  1. 搜索并打开任务计划程序
  2. 右侧点击创建任务...
  3. 弹出对话框常规填入名称, 如everything, 勾上使用最高权限运行
  4. 点击操作Tab页, 点击新建...
  5. 弹出对话框填入要运行的程序路径, 点击确定
  6. 再次点击确定
  7. 创建快捷方式, 目标为C:\Windows\System32\schtasks.exe /run /tn everything, 最后面everything为创建的任务名称.

express.js

express.js最重要的有一个中间件的问题,参考这篇文章的解释

中间件是收到不同的请求进行不同的针对性处理前,先做的预处理工作,大概因为处在收到请求和针对性处理请求中间,才叫做中间件。
中间件两个特点,第一是针对所有请求的处理,第二是可以挂载多个中间件按挂载顺序依次处理。挂载的方法就是use, use的顺序就是处理的顺序。

socket.io

socket.io首页展示了一个很酷的应用:实时监听tweet上有关socket.io和JavaScript的话题,代码不超过10句。

primus

实时框架的通用包装器,支持Engine.IO, WebSockets, Faye, BrowserChannel, SockJS and Socket.IO等。

官方教程

Quick Start

按官方的Quick Start理解如下:
安装

npm install @feathersjs/feathers --save

服务端

创建一个类来管理一种资源,并且其同步async方法与REST的各种操作相对应,如messages资源。这个类称之为Service服务。

操作CRUD REST HTTP feathers class async 函数 完成事件
增 create POST async create(data, params) // 其中data为通过POST发送来的JSON,并且已经JSON.parse成了对象。params可选,下同 created
删 delete DELETE remove(id, params) removed
替换改 update PUT update(id, data, params) updated
合并改 update PATCH patch(id, data, params) patched
查所有 read GET messages async find(params) //返回值为GET的返回值,为JS对象。JSON化(JSON.stringify)由feathers完成,不需要我们操作 -
查部分 read GET mesages?xx=x&xxx=xx async get(id, params) {} -

另外有个查header的REST HEAD 似乎没有对应,这个命令和GET类似,只是不返回内容只返回header

class MessageService {
  //初始化时候需要创建一个存储资源的地方,示例中先在内存中建立了一个数组,后面估计可以改为数据库的访问
  constructor() { 
    this.messages = [];
  }

  async find () {
    // Just return all our messages
    return this.messages;
  }

  async create (data) {
    // The new message is the data merged with a unique identifier
    // using the messages length since it changes whenever we add one
    const message = {
      id: this.messages.length,
      text: data.text
    }

    // Add new message to the list
    this.messages.push(message); 

    return message;
  }
app.use('/messages', new MessageService());  // 这儿注册资源的url地址和资源的class服务

完整代码:

const feathers = require('@feathersjs/feathers');
const express = require('@feathersjs/express');
const socketio = require('@feathersjs/socketio');

// A messages service that allows to create new
// and return all existing messages
class MessageService {
  constructor() {
    this.messages = [];
  }

  async find () {
    // Just return all our messages
    return this.messages;
  }

  async create (data) {
    // The new message is the data merged with a unique identifier
    // using the messages length since it changes whenever we add one
    const message = {
      id: this.messages.length,
      text: data.text
    }

    // Add new message to the list
    this.messages.push(message);

    return message;
  }
}

// Creates an ExpressJS compatible Feathers application 创建一个Express兼容的Feathers APP
const app = express(feathers());  

// Parse HTTP JSON bodies. 
// 从这儿开始注册中间件,先是自动对JSON数据解析的,也就是请求时header写着 ‘content-type: application/json’  的
app.use(express.json());
// Parse URL-encoded params 
// 解析 URL-encoded 格式的请求体数据,也就是请求时header写着‘content-type: application/x-www-form-urlencoded’ 的
app.use(express.urlencoded({ extended: true }));
// Host static files from the current folder
// 这个替代了nginx作用了,对.html .css等静态文件做http服务
app.use(express.static(__dirname));
// Add REST API support 
app.configure(express.rest());
// Configure Socket.io real-time APIs
app.configure(socketio());
// Register an in-memory messages service, 
// 这个是一句抵6句的REST注册了,否则要app.get/app.post/app.delete一个一个去搞定REST接口
app.use('/messages', new MessageService());
// Register a nicer error handler than the default Express one
app.use(express.errorHandler());

// Add any new real-time connection to the `everybody` channel 
// 一个连接connection类似一个会话session,一个频道channel类似MQTT的一个topic,
// 这儿在一个连接产生时将这个连接加入到everybody的频道中
app.on('connection', connection =>
  app.channel('everybody').join(connection)
);
// Publish all events to the `everybody` channel
// 一个事件events类似于MQTT的一个消息,当然这个events也是node的标准events,data是消息内容,
// publish的操作类似于MQTT的pub。sub操作是通过监听事件 .on 来做的,具体来说可以是监听created事件。
app.publish(data => app.channel('everybody'));

// Start the server
app.listen(3030).on('listening', () =>
  console.log('Feathers server listening on localhost:3030')
);

// For good measure let's create a message
// So our API doesn't look so empty 先自行加一条数据到messages资源中
app.service('messages').create({ 
  text: 'Hello world from the server'
});

客户端

直接访问http://localhost:3030/messages就相当于GET操作REST API
再创建一个index.html作为客户端来访问

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Feathers Example</title>
  <link rel="stylesheet" href="//unpkg.com/feathers-chat@4.0.0/public/base.css">
  <link rel="stylesheet" href="//unpkg.com/feathers-chat@4.0.0/public/chat.css">
</head>
<body>
  <main id="main" class="container">
    <h1>Welcome to Feathers</h1>
    <form class="form" onsubmit="sendMessage(event.preventDefault())">
      <input type="text" id="message-text" placeholder="Enter message here">
      <button type="submit" class="button button-primary">Send message</button>
    </form>

    <h2>Here are the current messages:</h2>
  </main>

  <script src="//unpkg.com/@feathersjs/client@^4.3.0/dist/feathers.js"></script>
  <script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.4/socket.io.js"></script>
  <script type="text/javascript">
    // Set up socket.io 实时连接监听地址
    const socket = io('http://localhost:3030');
    // Initialize a Feathers app
    const app = feathers();

    // Register socket.io to talk to our server
    app.configure(feathers.socketio(socket));

    // Form submission handler that sends a new message
    async function sendMessage () {
      const messageInput = document.getElementById('message-text');

      // Create a new message with the input field value, 通过REST POST发送消息,当然这一切都隐藏了
      await app.service('messages').create({
        text: messageInput.value
      });

      messageInput.value = '';
    }

    // Renders a single message on the page,增加一条新的message
    function addMessage (message) {
      document.getElementById('main').innerHTML += `<p>${message.text}</p>`;
    }

    const main = async () => {
      // Find all existing messages
      const messages = await app.service('messages').find();

      // Add existing messages to the list
      messages.forEach(addMessage);

      // Add any newly created message to the list in real-time
      app.service('messages').on('created', addMessage);
    };

    main();
  </script>
</body>
</html>

除了REST以外的概念

如果只是实现REST就不想要下面这些了

实时通讯

类似MQTT咯。REST只能根据客户端的请求相应,而实时通讯可以根据事件主动向客户端推送消息
Channels 实时通讯通道,类似于MQTT的topic吧
Events 事件系统

使用cli构建

安装cli: npm install @feathersjs/cli -g
使用cli

mkdir feathers-chat
cd feathers-chat/
feathers generate app

交互式命令行输出:

D:\r\feathers_proj\feather-chat>feathers generate app
? Do you want to use JavaScript or TypeScript? JavaScript
? Project name feather-chat
? Description
? What folder should the source files live in? src
? Which package manager are you using (has to be installed globally)? npm
? What type of API are you making? REST, Realtime via Socket.io
? Which testing framework do you prefer? Mocha + assert
? This app uses authentication Yes
? Which coding style do you want to use? ESLint
? What authentication strategies do you want to use? (See API docs for all 180+ supported oAuth providers) Username + Pa
ssword (Local)
? What is the name of the user (entity) service? users
? What kind of service is it? NeDB
? What is the database connection string? nedb://../data
   create package.json
   create config\default.json
   create public\favicon.ico
   create public\index.html
   create .editorconfig
   create src\app.hooks.js
   create src\channels.js
   create src\index.js
   create src\logger.js
   create src\middleware\index.js
   create src\services\index.js
   create .gitignore
   create README.md
   create src\app.js
   create test\app.test.js
   create .eslintrc.json
   create config\production.json
   create config\test.json
   create src\services\users\users.service.js
   create src\authentication.js
   create test\authentication.test.js
   create src\services\users\users.class.js
   create src\models\users.model.js
   create src\services\users\users.hooks.js
   create test\services\users.test.js
.....

目录简述

  • config/ 配置
  • public/ html静态文件,大概意思是nginx都不用装了
  • src/ 源码。包括hooks钩子和services服务。services里默认有一个users服务。
  • middleware/ 放express的中间件
  • models/ 放数据库模型,也就是和数据库的链接映射。里面默认有一个users.model.js提供与users表的映射
  • test/ 测试

根目录文件简述

  • app.js feathers应用的配置
  • app.hooks.js app的钩子
  • authentication.js 认证系统
  • channels.js 频道系统,用于实时通讯
  • index.js 入口

运行命令

# 启动
npm start
# 测试
npm test
# 开发模式,代码更新自动重运行
npm run dev

通过cli创建services

feathers generate service

通过cli交互创建需要的文件

λ feathers generate service                                                                                                                                         
? What kind of service is it? NeDB                                                                                                                                  
? What is the name of the service? messages                                                                                                                         
? Which path should the service be registered on? /messages                                                                                                         
? Does the service require authentication? Yes                                                                                                                      
   create src\services\messages\messages.service.js                                                                                                                 
    force src\services\index.js                                                                                                                                     
   create src\services\messages\messages.class.js                                                                                                                   
   create src\models\messages.model.js                                                                                                                              
   create src\services\messages\messages.hooks.js                                                                                                                   
   create test\services\messages.test.js                                                                                                                            
npm WARN ws@7.4.6 requires a peer of bufferutil@^4.0.1 but none is installed. You must install peer dependencies yourself.                                          
npm WARN ws@7.4.6 requires a peer of utf-8-validate@^5.0.2 but none is installed. You must install peer dependencies yourself.                                      
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@2.3.2 (node_modules\fsevents):                                                                             
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.3.2: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"})   

up to date in 8.347s                                                                                                                                                
npm WARN ws@7.4.6 requires a peer of bufferutil@^4.0.1 but none is installed. You must install peer dependencies yourself.                                          
npm WARN ws@7.4.6 requires a peer of utf-8-validate@^5.0.2 but none is installed. You must install peer dependencies yourself.                                      
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@2.3.2 (node_modules\fsevents):                                                                             
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.3.2: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"})   

up to date in 4.056s                                                                                                                                                

基本是创建了src/services目录下的三个文件,挂载到index.js上,并创建连接数据库的对应model.js和测试文件

Hooks钩子

钩子可以在服务的前、后、错误时运行。钩子与服务是多对多的关系,相当于对多个不同服务中类似的功能提取公因数。

const createdAt = async context => {
  context.data.createdAt = new Date();

  return context;
};

app.service('messages').hooks({
  before: {
    create: [ createdAt ]
  }
});

Cli方式创建钩子

命令是:

feathers generate hook                                                          

交互示意:

λ feathers generate hook                                                          
? What is the name of the hook? process-message                                   
? What kind of hook should it be? before                                          
? What service(s) should this hook be for (select none to add it yourself)?       
 messages                                                                         
? What methods should the hook be for (select none to add it yourself)? create    
   create src\hooks\process-message.js                                            
    force src\services\messages\messages.hooks.js