Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8e08fc5094 | ||
|
|
90d24f8948 | ||
|
|
812140b2a5 |
+40
-18
@@ -2,6 +2,28 @@ import { defineCollection } from "astro:content"
|
||||
import { glob } from "astro/loaders"
|
||||
import { z } from "astro/zod"
|
||||
|
||||
/*
|
||||
* YAML 里只写 `tags:`(后面什么都不跟)会解析成 **null**,而不是 undefined。
|
||||
*
|
||||
* Zod 的 `.optional()` 只放行 undefined,`.default(x)` 也只对 undefined 生效,
|
||||
* 所以 `z.array(z.string()).optional().default([])` 遇到 `tags:` 会直接报
|
||||
* Expected type "array", received "object"
|
||||
* —— 那个 "object" 是 JS 里 `typeof null === "object"` 造成的,很误导,
|
||||
* 光看报错完全想不到是「字段留空」。
|
||||
*
|
||||
* 手写 frontmatter 时把不要的字段留空是很自然的写法,所以这里统一用下面两个
|
||||
* helper 把 null 一并兜住,当作「没填」处理。
|
||||
*/
|
||||
|
||||
/** 文本字段:留空 / 未填 → fallback(默认空字符串) */
|
||||
const text = (fallback = "") => z.string().nullish().transform((v) => v ?? fallback)
|
||||
|
||||
/** 可选文本:留空 / 未填 → undefined(保持原来 `.optional()` 的类型) */
|
||||
const optionalText = () => z.string().nullish().transform((v) => v ?? undefined)
|
||||
|
||||
/** 字符串数组:留空 / 未填 → 空数组 */
|
||||
const textList = () => z.array(z.string()).nullish().transform((v) => v ?? [])
|
||||
|
||||
const posts = defineCollection({
|
||||
loader: glob({ pattern: "**/*.{md,mdx}", base: "./src/content/posts" }),
|
||||
schema: z.object({
|
||||
@@ -9,36 +31,36 @@ const posts = defineCollection({
|
||||
published: z.date(),
|
||||
updated: z.date().optional(),
|
||||
draft: z.boolean().optional().default(false),
|
||||
description: z.string().optional().default(""),
|
||||
image: z.string().optional().default(""),
|
||||
tags: z.array(z.string()).optional().default([]),
|
||||
category: z.string().optional().nullable().default(""),
|
||||
lang: z.string().optional().default(""),
|
||||
description: text(),
|
||||
image: text(),
|
||||
tags: textList(),
|
||||
category: z.string().nullish().transform((v) => v ?? ""),
|
||||
lang: text(),
|
||||
pinned: z.boolean().optional().default(false),
|
||||
|
||||
encrypted: z.boolean().optional().default(false),
|
||||
password: z.string().optional().default(""),
|
||||
password: text(),
|
||||
disclaimer: z.union([z.string(), z.array(z.string())]).optional(),
|
||||
|
||||
prevTitle: z.string().default(""),
|
||||
prevSlug: z.string().default(""),
|
||||
nextTitle: z.string().default(""),
|
||||
nextSlug: z.string().default(""),
|
||||
prevTitle: text(),
|
||||
prevSlug: text(),
|
||||
nextTitle: text(),
|
||||
nextSlug: text(),
|
||||
}),
|
||||
})
|
||||
|
||||
const thoughts = defineCollection({
|
||||
loader: glob({ pattern: "**/*.{md,mdx}", base: "./src/content/thoughts" }),
|
||||
schema: z.object({
|
||||
title: z.string().optional(),
|
||||
title: optionalText(),
|
||||
published: z.date(),
|
||||
tags: z.array(z.string()).optional().default([]),
|
||||
tags: textList(),
|
||||
/** 地点,显示在日期旁 */
|
||||
location: z.string().optional(),
|
||||
location: optionalText(),
|
||||
/** 天气,与地点一起显示 */
|
||||
weather: z.string().optional(),
|
||||
weather: optionalText(),
|
||||
/** 配图,public 下的绝对路径 */
|
||||
images: z.array(z.string()).optional().default([]),
|
||||
images: textList(),
|
||||
/** 置顶 */
|
||||
pinned: z.boolean().optional().default(false),
|
||||
}),
|
||||
@@ -52,9 +74,9 @@ const studies = defineCollection({
|
||||
title: z.string(),
|
||||
status: z.enum(["在读", "沉淀中", "暂搁", "已结"]),
|
||||
started: z.string(), // "YYYY-MM" 或 "YYYY-MM-DD"
|
||||
subtitle: z.string().optional(),
|
||||
epigraph: z.string().optional(),
|
||||
field: z.string().optional(),
|
||||
subtitle: optionalText(),
|
||||
epigraph: optionalText(),
|
||||
field: optionalText(),
|
||||
}),
|
||||
})
|
||||
|
||||
|
||||
@@ -95,8 +95,7 @@ $$
|
||||
$$
|
||||
行内模式(`$`)会让上下标显示在右上/右下:
|
||||
|
||||
|
||||
$ \sum_{i=1}^{n} i \quad \int_{a}^{b} f(x) \, dx $
|
||||
$\sum_{i=1}^{n} i \quad \int_{a}^{b} f(x) , dx$
|
||||
|
||||
### 希腊字母
|
||||
|
||||
@@ -109,8 +108,8 @@ $ \sum_{i=1}^{n} i \quad \int_{a}^{b} f(x) \, dx $
|
||||
| `\mu` | $\mu$ | `\pi` | $\pi$ |
|
||||
| `\sigma` | $\sigma$ | `\omega` | $\omega$ |
|
||||
| `\Gamma` | $\Gamma$ | `\Delta` | $\Delta$ |
|
||||
| `\Theta` | $\Theta$ | `\Pi$ | $\Pi$ |
|
||||
| `\Sigma` | $\Sigma$ | `\Omega$ | $\Omega$ |
|
||||
| `\Theta` | $\Theta$ | `\Pi$`| $\Pi$ |
|
||||
| `\Sigma` | $\Sigma$ | `\Omega` | $\Omega$ |
|
||||
|
||||
### 常用运算符
|
||||
|
||||
@@ -121,10 +120,10 @@ $ \sum_{i=1}^{n} i \quad \int_{a}^{b} f(x) \, dx $
|
||||
| `\cdot` | $\cdot$ | `\circ` | $\circ$ |
|
||||
| `\leq` | $\leq$ | `\geq` | $\geq$ |
|
||||
| `\neq` | $\neq$ | `\approx` | $\approx$ |
|
||||
| `\subset` | $\subset$ | `\supset$ | $\supset$ |
|
||||
| `\subset` | $\subset$ | `\supset` | $\supset$ |
|
||||
| `\in` | $\in$ | `\notin` | $\notin$ |
|
||||
| `\cup` | $\cup$ | `\cap$ | $\cap$ |
|
||||
| `\rightarrow` | $\rightarrow$ | `\Rightarrow$ | $\Rightarrow$ |
|
||||
| `\cup` | $\cup$ | `\cap` | $\cap$ |
|
||||
| `\rightarrow` | $\rightarrow$ | `\Rightarrow` | $\Rightarrow$ |
|
||||
| `\infty` | $\infty$ | `\partial` | $\partial$ |
|
||||
|
||||
### 括号与定界符
|
||||
|
||||
@@ -13,7 +13,7 @@ draft: false
|
||||
### 1. 重装了树莓派的操作系统
|
||||
|
||||
通过官方烧录软件重新安装了新的 debian 操作系统,主要是根据的是[树莓派官方文档](https://pidoc.cn)指导,包括从系统 APT 换源、Docker 部署安装、基本的 linux,命令行语法,这个文档里都有比较详细的帮助。从简单的 ssh 登录入手,直接在命令行中操作文件复制、删除还是很高效的。特别是现在在 AI 的帮助下,很多代码指令可以让 AI 直接生成,不用自己再去查询,极大的降低了学习成本。
|
||||

|
||||
|
||||
### 2. Docker 部署
|
||||
|
||||
Docker 容器化技术将各种依赖、运行环境打包成镜像,很多前后端分离的软件、需要长期在线的服务都非常适合。但是我现在只是会用一些基本的命令,很多还是靠 AI,特别是**端口映射**、**宿主机数据文件映射**、**环境配置**这些操作还是不懂。
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
---
|
||||
published: 2026-06-21
|
||||
title: 夏至已至
|
||||
location: 张掖·甘州区
|
||||
weather: 晴
|
||||
images:
|
||||
tags:
|
||||
pinned: false
|
||||
---
|
||||
|
||||
> 随笔,只是想写一些自己的想法
|
||||
转眼之间已是夏至,太阳再次来到北回归线,时间就是这样,总是过得如此之快。突然之间就回想起十年前,也就是2016年那个夏天了,那时我刚参加完高考,面对自己的未来不知所措,踏上了前往军检的火车。人生关键的选择往往并不多,只不过当时是无法感受到其强劲的影响。
|
||||
|
||||
当时自己也是一个懵懂无知的少年,缺少自己的想法和主见。有的时候可能这就是命吧,谁也不知道自己的未来会怎样,但是依然要积极面对生活。
|
||||
@@ -15,7 +15,3 @@ weather: 晴
|
||||
|
||||
## 我必须改变,这需要自己去行动起来
|
||||
|
||||
> - [ ] 每天至少阅读1小时(晚饭后20分钟,睡觉前30分钟,午睡前10分钟),每天坚持!
|
||||
> - [ ] 不看视频(特别是抖音)
|
||||
> - [ ] 今日的事情,尽心尽力了,无论结果如何,都应该高高兴兴地上床恬睡。
|
||||
> - [ ] 利用空闲时间更新一下自己的文章,对积淀一些东西
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"updatedAt": "2026-09-17T12:15:45.676Z",
|
||||
"updatedAt": "2026-09-17T12:35:36.207Z",
|
||||
"source": "weread",
|
||||
"books": [
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user