Skip to content

Commit

Permalink
docs(blog): add 《2023 · 谈谈职业规划》
Browse files Browse the repository at this point in the history
  • Loading branch information
kuizuo committed Dec 25, 2023
1 parent 95121f7 commit 820f0cc
Show file tree
Hide file tree
Showing 8 changed files with 235 additions and 90 deletions.
2 changes: 1 addition & 1 deletion blog/authors.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
kuizuo:
name: 愧怍
title: 全栈 typescripter / 学生
title: 全栈 typescripter / 即将毕业的学生
url: https://github.com/kuizuo
image_url: /img/logo.webp
36 changes: 18 additions & 18 deletions blog/develop/node与浏览器中的cookie.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,25 +40,25 @@ var instance = axios.create({
})
// 设置请求拦截器
instance.interceptors.request.use(
(config) => {
config => {
// 在config可以添加自定义协议头 例如token
config.headers['x-token'] = 'xxxxxxxx'

return config
},
(error) => {
error => {
Promise.error(error)
},
)

instance.interceptors.response.use(
(response) => {
response => {
const res = response.data
// 根据对应的业务代码 对返回数据进行处理

return res
},
(error) => {
error => {
const { response } = error
// 状态码为4或5开头则会报错
// 根据根据对应的错误,反馈给前端显示
Expand Down Expand Up @@ -119,13 +119,13 @@ export function logout() {
运行环境在浏览器中,axios 是无法设置与获取 cookie,获取不到 set-cookies 这个协议头的(即使服务器设置了也没用),先看代码与输出

```js
instance.interceptors.request.use((config) => {
instance.interceptors.request.use(config => {
config.headers['cookie'] = 'cookie=this_is_cookies;username=kuizuo;'
console.log('config.headers', config.headers)
return config
})

instance.interceptors.response.use((response) => {
instance.interceptors.response.use(response => {
console.log('response.headers', response.headers)
return res
})
Expand All @@ -145,9 +145,8 @@ instance.interceptors.response.use((response) => {

那我就是想要设置 Cookies,来跳过登录等等咋办,我的建议是别用浏览器来伪装 http 请求。跨域是浏览器内不可少的一部分,并且要允许跨域过于麻烦。有关跨域,我推一篇文章[10 种跨域解决方案(附终极大招)](https://juejin.cn/post/6844904126246027278)

#### 完整封装代码

::: details 查看代码
<details open>
<summary>完整封装代码</summary>

```js
import axios from 'axios'
Expand All @@ -162,21 +161,21 @@ const service = axios.create({
})

service.interceptors.request.use(
(config) => {
config => {
if (store.getters.token) {
config.headers['x-token'] = getToken()
}

return config
},
(error) => {
error => {
Message.error(error)
return Promise.reject(error)
},
)

service.interceptors.response.use(
(response) => {
response => {
const res = response.data
if (res.code !== 200) {
Message.error(res.msg || 'Error')
Expand All @@ -186,7 +185,7 @@ service.interceptors.response.use(
return res
}
},
(error) => {
error => {
if (error.response) {
let res = error.response
switch (res.status) {
Expand Down Expand Up @@ -225,11 +224,11 @@ service.interceptors.response.use(
export default service
```

:::
</details>

### Nodejs

作为 nodejs 的主流 http 框架怎么能只用在浏览器上,nodejs 自然而然可以,不过 nodejs 需要配置的可就多了,在 nodejs 环境中,自然没有浏览器的同源策略,像上面设置不了的 Cookie,现在随便设置,先看看我是怎么封装的:
作为 nodejs 的主流 http 框架怎么能只用在浏览器上,nodejs 自然可以,不过 nodejs 需要配置的可就多了,在 nodejs 环境中,自然没有浏览器的同源策略,像上面设置不了的 Cookie,现在随便设置,先看看我是怎么封装的:

```js
import axios from 'axios'
Expand All @@ -239,12 +238,13 @@ import * as https from 'https'
export async function request(opt) {
let { url, method = 'get', headers = {}, cookies, data = null } = opt

headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
headers['User-Agent'] =
'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
headers['Referer'] = url

if (typeof cookies === 'object') {
headers['Cookie'] = Object.keys(cookies)
.map((k) => encodeURIComponent(k) + '=' + encodeURIComponent(cookies[k]))
.map(k => encodeURIComponent(k) + '=' + encodeURIComponent(cookies[k]))
.join('; ')
} else if (typeof cookies === 'string') {
headers['Cookie'] = cookies
Expand Down Expand Up @@ -353,7 +353,7 @@ Error: unable to verify the first certificate
```js
let newCookie = res.header['set-cookie']
? res.header['set-cookie']
.map((a) => {
.map(a => {
return a.split(';')[0]
})
.join('; ')
Expand Down
11 changes: 5 additions & 6 deletions blog/lifestyle/关于 restful api 路径定义的思考.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,14 @@ keywords: [杂谈, restful]
- 更新文章 `PUT /articles/:id`
- 删除文章 `DELETE /articles/:id`

当然,我相信肯定也有`GET /article—list` `POST /add-article` 这样的答案,不过这些不在 restful api 风格的范畴,就不考虑了。
当然,我相信肯定也有`GET /article—list` `POST /add-article` 这样的答案,不过这些不在 restful api 风格的范畴,就不考虑了。

而这时 查看我的文章 或许就需要稍加思考,或许你会有以下几种方式

- `GET /my-articles` 从资源角度来看肯定不好,因为此时在 url 不能很直观地体现请求资源,同时在控制器文件(controller) 就与 article 分离了,并且还占用了 / 下路径。
- `GET /articles/mine` 则又不那么遵循 restful api 风格,挺违和的。

那么这时不妨遵循 **资源从属关系**,在这里 文章所属的对象就用户,因此查看他人的文章可以这么设计`GET /users/:userId/articles` 获取特定用户(userId)的文章列表。
那么这时不妨遵循 **资源从属关系**,在这里 文章所属的对象就用户,因此查看他人的文章可以这么设计`GET /users/:userId/articles` 获取特定用户(userId)的文章列表。

而 查看我的文章 同样也可用此 URL,只需将 userId 更改为自己的便可。从 api 的 URL 来看是很舒服了,但是从代码开发的角度上问题又有了问题了。。。

Expand Down Expand Up @@ -109,13 +109,13 @@ restful 更多是针对实际存储的资源,核心是名词,对于增删改

对于一些非增删改查的操作,还是使用 RPC 式的 API 更为实在,即 **`POST /命名空间/资源类型/动作`**,至少不用再为某个操作决定 PATCH/PUT 还是 POST/DELETE。

## 针对同一实体,区分不用用户
## 针对同一实体,区分不同用户

问题还没结束,不妨碍继续使用上述文章的例子,针对 文章 这一实体,又要怎么定义(区分)用户与作者或管理员路径呢?

管理员所看到的数据肯定远比用户来的多,如果使用同一个接口(如 `/articles`),那么业务代码必然会十分复杂。

使用不同的端点(end point) 是个解决方法,例如管理员在请求前添加 manage 或 admin,如 `/manage/articles``/articles/manage` 这样只需要多一步判断请求用户是否拥有管理的权限。
使用不同的端点(end point) 是个解决方法,例如管理员在请求前添加 manage 或 admin,如 `/manage/articles``/articles/manage` 这样只需要多一步判断请求用户是否拥有管理的权限。

但对我个人而言,我一般都会以在一个命名空间下(这里指 `/articles`)编写,像前面的 `/manage/articles` 我是直接 pass 的。

Expand All @@ -140,7 +140,6 @@ GET /articles/1/author

要么两条请求获取相应数据,要么为调用方“定制”一个接口,如`GET /getArticleInfo`,这样只需一条请求便可得到想要的数据。但这个就破坏了 restful API 接口风格,并且在复杂的业务中,比如说还要获取博文的评论等等,后端就要额外提供一个接口,可以说是非常繁琐了。相比之下 [GraphQL](https://graphql.org/) 就更为灵活了。


## 最佳实践

就在我写完这篇文章的几周后,无意间刷到了这篇文章[examples-of-great-urls/](https://blog.jim-nielsen.com/2023/examples-of-great-urls/)
Expand All @@ -159,4 +158,4 @@ GET /articles/1/author

[RESTful API设计经验总结](https://blog.51cto.com/LiatscBookshelf/5427906)

[为什么很多后端写接口都不按照 restful 规范?](https://www.zhihu.com/question/438825740)
[为什么很多后端写接口都不按照 restful 规范?](https://www.zhihu.com/question/438825740)
Original file line number Diff line number Diff line change
@@ -1,25 +1,22 @@
---
slug: 2019.7-2020.7-log
title: 2019.7-2020.7编程年记
date: 2020-10-08
slug: 2020-year-end-summary
title: 2020 · 编程之旅-起点
date: 2020-12-30
authors: kuizuo
tags: [年终总结, 人生感悟]
keywords: [年终总结, 人生感悟]
description: 2019.7-2020.7编程年记
tags: [年终总结]
keywords: [年终总结]
---

<!-- truncate -->

## 前言

写篇年记,记录一下自己这一年的所学。

能有幸在这个行业有两点关键因素
能有幸在这个行业有两个关键因素

1. QQ 永久冻结

2. 易语言

<!-- truncate -->

### QQ 永久冻结

有些认识我的人可能会知道我的 QQ804493238 给永久冻结了,可以说这个号码是不可能再搞回来的。一个幸幸苦苦养了十年的 QQ ,说没就没的那种,与之相对应的就是游戏账号没了,没了游戏能干嘛,当然不能干嘛,生活还是得过的,但又要有个东西来打发时间,没错就是编程。于是高中毕业后的暑假,就开始了学习编程。不过这里要先介绍一下易语言,作为我的第一门编程语言。
Expand Down Expand Up @@ -218,10 +215,7 @@ Web 学习确实比逆向轻松,并且学完 Web 能写的东西也算比较

```html
<!-- 引入样式 -->
<link
rel="stylesheet"
href="https://unpkg.com/element-ui/lib/theme-chalk/index.css"
/>
<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css" />
<!-- 引入组件库 -->
<script src="https://unpkg.com/element-ui/lib/index.js"></script>
```
Expand Down
Original file line number Diff line number Diff line change
@@ -1,31 +1,20 @@
---
slug: 2021-year-end-summary
title: 2021年终总结(休学一年
title: 2021 · 休学一年
date: 2021-12-31
authors: kuizuo
tags: [年终总结, 人生感悟]
keywords: [年终总结, 人生感悟]
tags: [年终总结]
keywords: [年终总结]
toc_max_heading_level: 3
description: 2021年终总结(休学一年)
---

<!-- truncate -->

:::info

这篇文章发布时间与实际编写时间有所不同,所以内容上有可能会包含未来相关的信息,主要是想对过去的经历做个记录总结,算是一个弥补吧。

:::
当写这篇年终时,都已过于数月了。今年 (2021 年)休学出去工作(创业);加上 2022 年 1 月闭关安卓逆向学习,所以便没有抽出时间来完善年终总结。

距离上篇记录过去了 1 年半时间,以后应该也会在每年的 12 月 31 号发布年终总结。

不过在总结的时候还是要唠嗑唠嗑,其实说实话,今年没去年那么想写年终总结,一是感觉去年过得没有前年那么充实,尤其是在学习方面;二是因为 21 年这年休学出去工作(创业);三是感觉很多时候过于迷茫,尤其是 2021 年后半年,浪费了太多本该提升自我的时间;最后加上 2022 年 1 月闭关安卓逆向学习,所以便没有抽出时间来完善年终总结。

所以说要写年终前一定要趁早,否则将会越来越拖,这次就整整拖了半年才最终完善。平常也要时刻保持记录的习惯,这样年终总结的时候思路才清醒,看到平时记录的点滴就能一时刻地回忆起所有细节。
所以说要写年终前一定要趁早,平常也要时刻保持记录的习惯,这样年终总结的时候思路才清醒,看到平时记录的点滴就能一时刻地回忆起所有细节。

每次写年终总结时不时也会潸然泪下,写的时候就需要不断的回忆过去,而往往过去的某些时刻的做法会让自己觉得是不是有个更优解?常常会回忆起过去这一年所经历的往往,难以忘怀,不知从何写起。

话虽说,但总归还是学到了点东西,所以还是得总结一下,不记录可能这段经历就消逝在时间的烟海之中。
<!-- truncate -->

## Web 开发

Expand Down Expand Up @@ -158,7 +147,7 @@ description: 2021年终总结(休学一年)

就如这次休学,我就巴不得早点工作,早点实现财富自由。但**过早的发育,往往会迷失方向**

其实我日常编写代码的时候也是如此,有时候就是为了快点实现功能需求,就会去寻找相关功能库,就容易忽视底层实现逻辑。久而久之就成为了 CV(复制粘贴)工程师,导致一些学习本该了解的知识点,就因此忽视,直到别人的库无法实现自己的功能的,到自己实现起来可谓是愁眉苦脸的。
我日常编写代码的时候也是如此,有时候就是为了快点实现功能需求,就会去寻找相关功能库,就容易忽视底层实现逻辑。久而久之就成为了 CV(复制粘贴)工程师,导致一些学习本该了解的知识点,就因此忽视,直到别人的库无法实现自己的功能的,到自己实现起来可谓是愁眉苦脸的。

所以我现在心态也相对以前平坦了许多,没有之前的那种激情劲,或者说更加稳重,走一步都要稳一步。

Expand All @@ -174,7 +163,7 @@ description: 2021年终总结(休学一年)

外面的世界即现实,亦或者是社会。确实,这里存在太多虚伪的内容,多数人对他人的表现与自身内心存在极大差异。举个例子,一个非常普通的人,面对领导时展现积极主动,面对朋友时展现情同手足,面对亲人时展现情同骨肉,对不同的人,都有不同的表现形式,而真实的他却只有自己最清楚。可以说人本就是很虚伪的,只是这种形式在交际中被放大。

除了虚伪外,很多的还是谎言。这里举一个不那么黑暗的谎言,多数人都喜欢装逼,吹嘘自己如何如何的。将自己包装得有多么厉害,地位多么显赫。其目的也只有自己最清楚,在被这种表面所影响下,就认为他事情都相对可靠,其实不然的
除了虚伪外,很多的还是谎言。这里举一个不那么黑暗的谎言,多数人都喜欢装逼,吹嘘自己如何如何的。将自己包装得有多么厉害,地位多么显赫。其目的也只有自己最清楚,在被这种表面所影响下,就认为他事情都相对可靠,不然的

所以言语上,并不能以百分之百的确信。再好比目前互联网的新闻内容或者是短视频,我都不会去对其真实性保持绝对,至少肯定不会是完整的。因为太清楚这些内容多数是以博人眼球为目的,也许会歪曲一定的事实,营造一个绝对火爆的效果。没置身于此地,又怎敢下一断言呢。

Expand All @@ -198,7 +187,7 @@ description: 2021年终总结(休学一年)

每日起床,打开屏幕,查看邮件信息,吃饭,能旷的课就旷,不能旷的课就尽量去,坐下敲代码,一天的日子就这样过去了。这半年里至少有百分之 80 的日子是处于这种状态。

要说枯燥,其实也有一些乐趣,要说充实,其实也会摸点鱼。不过,这不就是大部分人的生活方式吗?以混日子的方式做着重复的事,在重复中寻求一丝不同。
要说枯燥,也有一些乐趣,要说充实,也会摸点鱼。不过,这不就是大部分人的生活方式吗?以混日子的方式做着重复的事,在重复中寻求一丝不同。

在学校也没啥特殊的要求,别挂科,在读两年拿到毕业证与学位证即可。还有两年的时间发展,也许这两年是程序生涯中仅存可自由分配的时间。

Expand Down
Loading

0 comments on commit 820f0cc

Please sign in to comment.