云服务器

概念

想让应用正式地提供服务,需要在一台服务器上去运行。现在一般会选择使用云服务器,它会提供一些计算能力来运行应用,还提供了带宽,允许用户通过网络来使用我们的应用。云服务器并不是一台真实的设备,服务商会在云端通过一群的机器共同来提供一些计算能力,我们在他们里购买的只是一小块计算能力。一点 cpu、一点内存、再加上一点带宽。云服务器从几十到几万的都有,cpu、内存、带宽就是影响价格的主要因素,用户越多需要花在云服务器上的钱也就越多。购买的云服务器一般会提供两个 ip 地址,一个是公网一个是内网,服务器通过公网 ip 可以对外提供网络服务,你也可以通过这个 ip 远程登录管理这台服务器。同处于一个私有网络的服务器他们之间可以通过内网 ip 来交换数据,因为走的内网所以速度会很快。比如你有两台服务器,一台提供应用服务,一台提供数据服务,应用服务和数据服务交换数据的时候可以通过内网 ip 在内网完成。

阅读全文

用户点赞

创建点赞模块

like 目录下 like.controller.ts、like.middleware.ts、like.router.ts、like.service.ts
like.controller.ts:

阅读全文

用户头像

创建头像模块

avatar 目录下创建 avatar.controller.ts、avater.middleware.ts、avatar.router.ts、avatar.service.ts

阅读全文

内容列表

sql 查询片段

新建文件 post.provider.ts:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/**
* 查询片段
*/
export const sqlFragment = {
user: `
JSON_OBJECT(
'id', user.id,
'name', user.name
) as user
`,
leftJoinUser: `
LEFT JOIN user
ON user.id = post.userId
`,
totalComments: `
(
SELECT
COUNT(comment.id)
FROM
comment
WHERE
comment.postId = post.id
) as totalComents
`,
leftJoinOneFile: `
LEFT JOIN LATERAL (
SELECT *
FROM file
WHERE file.postId = post.id
ORDER BY file.id DESC
LIMIT 1
) AS file ON post.id = file.postId
`,
file: `
CAST(
IF(
COUNT(file.id),
GROUP_CONCAT(
DISTINCT JSON_OBJECT(
'id',file.id,
'width',file.width,
'height',file.height
)
),
null
) AS JSON
) AS file
`,
leftJoinTag: `
LEFT JOIN
post_tag ON post_tag.postId = post.id
LEFT JOIN
tag ON post_tag.tagId = tag.id
`,
tags: `
CAST(
IF(
COUNT(tag.id),
CONCAT(
'[',
GROUP_CONCAT(
DISTINCT JSON_OBJECT(
'id',tag.id,
'name',tag.name
)
),
']'
),
NULL
) AS JSON
) AS tags
`,
};

阅读全文

发表评论

创建评论模块

comment 目录下创建 comment.controller.ts、comment.router.ts、comment.service.ts、comment.middleware.ts 。

阅读全文

内容标签

创建标签模块

tag 目录下 tag.controller.ts、tag.middleware.ts、tag.router.ts、tag.service.ts。然后在 index.ts 中导入并使用路由。

阅读全文

上传文件

定义 vscode 代码片段

编辑器中 command+shift+p 打开命令面板,搜索 snip,然后新建全局或项目的代码片段,给文件起个名字,然后配置代码片段。

阅读全文

处理文件

处理文件

在文件里除了文件数据本身还有些额外的数据,比如音频,视频文件里可能会包含内容的作者、专辑、版权等信息,在照片文件里可能会包含设备、型号、大小、镜头、日期等等,设计一个接口方便客户端可以调取这些数据。

阅读全文

权限控制

访问控制

在服务端我们要知道当前接待的用户是谁,决定是否要给这个用户提供服务的时候还需要检查一下用户的权限,这个就是权限控制,也叫访问控制。有很多方法可以实现,比如基于角色的访问控制,就是你可以在应用里面添加一些角色,然后把这些角色分配给用户,不同的用户可以拥有一些权限,一个用户如果属于一个角色,就拥有这个角色里所有的权限。下面会记录一个检查资源拥有权的访问控制,用户在访问一个资源的时候去检查用户是否拥有这个资源,就是检查被访问的内容资源是不是这个用户发布的,如果是,就允许访问,不是的话就不允许访问,比如在更新内容和删除内容的接口上面就可以去检查用户对内容资源的拥有权。限制用户只能修改或删除自己发布的内容资源。

阅读全文

注册用户

tips: node+mysql

创建用户

model.ts: 定义用户的类

1
2
3
4
5
export class UserModel{
id?:number;
name?:string;
password?:string
}

阅读全文