合并重复定义样式
增加过期说明 更新博客说明
This commit is contained in:
parent
04b0f4da85
commit
c2adcec23e
@ -19,3 +19,9 @@ export const VISITED_PLACES = ['中国-黑龙江', '中国-吉林', '中国-辽
|
|||||||
|
|
||||||
export const DOUBAN_ID = 'lsy22';
|
export const DOUBAN_ID = 'lsy22';
|
||||||
|
|
||||||
|
export const ARTICLE_EXPIRY_CONFIG = {
|
||||||
|
enabled: true, // 是否启用文章过期提醒
|
||||||
|
expiryDays: 365, // 文章过期天数
|
||||||
|
warningMessage: '这篇文章已经发布超过一年了,内容可能已经过时,请谨慎参考。' // 提醒消息
|
||||||
|
};
|
||||||
|
|
||||||
|
@ -14,8 +14,8 @@ tags: []
|
|||||||
|
|
||||||
进入域名管理添加域名
|
进入域名管理添加域名
|
||||||
|
|
||||||
- 加速域名:(加速域名)
|
- 加速域名:(加速域名)
|
||||||
- 回源域名填写:(源站)
|
- 回源域名填写:(源站)
|
||||||
- 回源host选择:与回源域名一致
|
- 回源host选择:与回源域名一致
|
||||||
|
|
||||||
改动回源host的目的是为了让vercel那边知道你需要回源到的域名。
|
改动回源host的目的是为了让vercel那边知道你需要回源到的域名。
|
||||||
|
@ -92,6 +92,18 @@ tags: ["标签1", "标签2"]
|
|||||||
文章内容...
|
文章内容...
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### 文章过期提醒
|
||||||
|
|
||||||
|
博客系统支持文章过期提醒功能,可以在 `src/consts.ts` 中配置:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
export const ARTICLE_EXPIRY_CONFIG = {
|
||||||
|
enabled: true, // 是否启用文章过期提醒
|
||||||
|
expiryDays: 365, // 文章过期天数
|
||||||
|
warningMessage: '这篇文章已经发布超过一年了,内容可能已经过时,请谨慎参考。' // 提醒消息
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
### 文章列表展示
|
### 文章列表展示
|
||||||
|
|
||||||
文章列表页面会自动获取所有文章并按日期排序展示,支持:
|
文章列表页面会自动获取所有文章并按日期排序展示,支持:
|
||||||
@ -245,45 +257,62 @@ import { VISITED_PLACES } from '@/consts';
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
npm run dev
|
npm run dev
|
||||||
# 或者使用 pnpm
|
|
||||||
pnpm dev
|
|
||||||
```
|
```
|
||||||
|
|
||||||
访问 `http://localhost:4321` 查看效果。
|
访问 `http://localhost:4321` 查看效果。
|
||||||
|
|
||||||
## 部署说明
|
## 部署说明
|
||||||
|
|
||||||
### 本地构建部署
|
### 部署方式选择
|
||||||
|
|
||||||
```bash
|
1. **Vercel 部署(推荐)**
|
||||||
npm run build
|
- 支持所有功能
|
||||||
```
|
- 自动部署和 HTTPS
|
||||||
|
- 支持 API 路由和动态数据
|
||||||
|
- 可配合多吉云CDN实现自动刷新缓存
|
||||||
|
|
||||||
构建产物位于 `dist` 目录,将其部署到你的服务器即可。
|
2. **静态托管(如腾讯云)**
|
||||||
|
- 仅支持静态文件
|
||||||
|
- 不支持的功能:
|
||||||
|
- API 路由(豆瓣数据、Git 项目等)
|
||||||
|
- 动态数据获取
|
||||||
|
- 需要手动配置和上传
|
||||||
|
|
||||||
### Vercel 部署
|
### CDN加速配置
|
||||||
|
|
||||||
本项目完全支持 Vercel 部署,你可以通过以下步骤快速部署:
|
博客支持通过多吉云CDN进行加速,并可通过GitHub Actions实现自动刷新缓存:
|
||||||
|
|
||||||
1. Fork 本项目到你的 GitHub 账号
|
1. 按照[CDN配置指南](./cdn配置)配置多吉云CDN
|
||||||
|
2. 按照[GitHub Actions自动刷新CDN缓存指南](./github-actions自动刷新多吉云_cdn缓存)配置自动刷新
|
||||||
|
3. 配置完成后,每次博客更新时,CDN缓存将自动刷新
|
||||||
|
|
||||||
2. 在 Vercel 控制台中点击 "New Project"
|
### 部署步骤
|
||||||
|
|
||||||
3. 导入你 fork 的 GitHub 仓库
|
#### Vercel 部署
|
||||||
|
|
||||||
4. 配置构建选项:
|
1. Fork 项目到 GitHub
|
||||||
- Framework Preset: Astro
|
2. 在 Vercel 导入项目
|
||||||
- Build Command: `astro build`
|
3. 配置环境变量(如果需要)
|
||||||
- Output Directory: `dist`
|
4. 点击部署
|
||||||
- Install Command: `npm install` 或 `pnpm install`
|
|
||||||
|
|
||||||
5. 点击 "Deploy" 开始部署
|
#### 静态托管部署
|
||||||
|
|
||||||
Vercel 会自动检测项目类型并应用正确的构建配置。每次你推送代码到 main 分支时,Vercel 都会自动重新部署。
|
1. 修改 `astro.config.mjs`:
|
||||||
|
|
||||||
#### 环境变量配置
|
```javascript
|
||||||
|
export default defineConfig({
|
||||||
|
site: SITE_URL,
|
||||||
|
output: "static",
|
||||||
|
adapter: undefined,
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
如果你使用了需要环境变量的功能(如 API tokens),需要在 Vercel 项目设置中的 "Environment Variables" 部分添加相应的环境变量。
|
2. 构建并上传:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run build
|
||||||
|
# 上传 dist/client 目录到静态托管服务
|
||||||
|
```
|
||||||
|
|
||||||
## 常见问题
|
## 常见问题
|
||||||
|
|
||||||
@ -298,3 +327,8 @@ Vercel 会自动检测项目类型并应用正确的构建配置。每次你推
|
|||||||
3. **Git 项目无法显示**
|
3. **Git 项目无法显示**
|
||||||
- 验证用户名配置
|
- 验证用户名配置
|
||||||
- 确认 API 访问限制
|
- 确认 API 访问限制
|
||||||
|
|
||||||
|
4. **静态托管部署后功能异常**
|
||||||
|
- 确认是否使用了需要服务器端支持的功能
|
||||||
|
- 检查是否已将动态数据改为静态数据
|
||||||
|
- 确认构建输出目录是否为 `dist/client`
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
---
|
---
|
||||||
import { getCollection, render } from 'astro:content';
|
import { getCollection, render } from 'astro:content';
|
||||||
import { contentStructure, getRelativePath, getBasename, getDirPath, getSpecialPath } from '@/content.config';
|
import { getSpecialPath } from '@/content.config';
|
||||||
import type { SectionStructure } from '@/content.config';
|
|
||||||
import Layout from '@/components/Layout.astro';
|
import Layout from '@/components/Layout.astro';
|
||||||
import Breadcrumb from '@/components/Breadcrumb.astro';
|
import Breadcrumb from '@/components/Breadcrumb.astro';
|
||||||
|
import { ARTICLE_EXPIRY_CONFIG } from '@/consts';
|
||||||
|
|
||||||
// 添加这一行,告诉Astro预渲染这个页面
|
// 添加这一行,告诉Astro预渲染这个页面
|
||||||
export const prerender = true;
|
export const prerender = true;
|
||||||
@ -168,27 +168,38 @@ function getArticleUrl(articleId: string) {
|
|||||||
|
|
||||||
<!-- 文章内容区域 -->
|
<!-- 文章内容区域 -->
|
||||||
<div class="relative">
|
<div class="relative">
|
||||||
|
<!-- 文章过期提醒 -->
|
||||||
|
{(() => {
|
||||||
|
const publishDate = article.data.date;
|
||||||
|
const currentDate = new Date();
|
||||||
|
const daysDiff = Math.floor((currentDate.getTime() - publishDate.getTime()) / (1000 * 60 * 60 * 24));
|
||||||
|
|
||||||
|
if (ARTICLE_EXPIRY_CONFIG.enabled && daysDiff > ARTICLE_EXPIRY_CONFIG.expiryDays) {
|
||||||
|
return (
|
||||||
|
<div class="bg-yellow-50 border-l-4 border-yellow-400 p-4 mb-6">
|
||||||
|
<div class="flex">
|
||||||
|
<div class="flex-shrink-0">
|
||||||
|
<svg class="h-5 w-5 text-yellow-400" viewBox="0 0 20 20" fill="currentColor">
|
||||||
|
<path fill-rule="evenodd" d="M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z" clip-rule="evenodd" />
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<div class="ml-3">
|
||||||
|
<p class="text-sm text-yellow-700">
|
||||||
|
{ARTICLE_EXPIRY_CONFIG.warningMessage}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
})()}
|
||||||
|
|
||||||
<!-- 文章内容 -->
|
<!-- 文章内容 -->
|
||||||
<article class="prose prose-lg dark:prose-invert prose-primary prose-table:rounded-lg prose-table:border-separate prose-table:border-2 prose-thead:bg-primary-50 dark:prose-thead:bg-dark-surface prose-ul:list-disc prose-ol:list-decimal prose-li:my-1 prose-blockquote:border-l-4 prose-blockquote:border-primary-500 prose-blockquote:bg-gray-100 prose-blockquote:dark:bg-dark-surface prose-a:text-primary-600 prose-a:dark:text-primary-400 prose-a:no-underline prose-a:border-b prose-a:border-primary-300 prose-a:hover:border-primary-600 max-w-none mb-12">
|
<article class="prose prose-lg dark:prose-invert prose-primary prose-table:rounded-lg prose-table:border-separate prose-table:border-2 prose-thead:bg-primary-50 dark:prose-thead:bg-dark-surface prose-ul:list-disc prose-ol:list-decimal prose-li:my-1 prose-blockquote:border-l-4 prose-blockquote:border-primary-500 prose-blockquote:bg-gray-100 prose-blockquote:dark:bg-dark-surface prose-a:text-primary-600 prose-a:dark:text-primary-400 prose-a:no-underline prose-a:border-b prose-a:border-primary-300 prose-a:hover:border-primary-600 max-w-none mb-12">
|
||||||
<Content />
|
<Content />
|
||||||
</article>
|
</article>
|
||||||
|
|
||||||
<!-- 添加全局样式 -->
|
|
||||||
<style is:global>
|
|
||||||
/* 代码块样式 */
|
|
||||||
.prose pre {
|
|
||||||
overflow-x: auto;
|
|
||||||
white-space: pre-wrap;
|
|
||||||
word-wrap: break-word;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 行内代码样式 */
|
|
||||||
.prose :not(pre) > code {
|
|
||||||
white-space: pre-wrap;
|
|
||||||
word-wrap: break-word;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<!-- 固定目录面板 - 脱离文档流 -->
|
<!-- 固定目录面板 - 脱离文档流 -->
|
||||||
<div class="hidden 2xl:block fixed right-[calc(50%-48rem)] top-20 w-64 z-30">
|
<div class="hidden 2xl:block fixed right-[calc(50%-48rem)] top-20 w-64 z-30">
|
||||||
<div class="bg-white dark:bg-dark-card rounded-lg shadow-lg p-4 max-h-[calc(100vh-8rem)] overflow-y-auto border border-gray-200 dark:border-gray-700">
|
<div class="bg-white dark:bg-dark-card rounded-lg shadow-lg p-4 max-h-[calc(100vh-8rem)] overflow-y-auto border border-gray-200 dark:border-gray-700">
|
||||||
|
@ -8,11 +8,12 @@
|
|||||||
background-color: #282c34 !important;
|
background-color: #282c34 !important;
|
||||||
border: 1px solid #374151;
|
border: 1px solid #374151;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
overflow-x: auto;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
word-wrap: break-word;
|
||||||
}
|
}
|
||||||
|
|
||||||
.prose pre:hover {
|
|
||||||
/* 移除之前的transform和shadow */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 代码块顶部栏 - 调整颜色使其更突出 */
|
/* 代码块顶部栏 - 调整颜色使其更突出 */
|
||||||
.code-header {
|
.code-header {
|
||||||
@ -145,6 +146,8 @@
|
|||||||
font-family: "JetBrains Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
font-family: "JetBrains Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
||||||
font-size: 0.85em;
|
font-size: 0.85em;
|
||||||
color: #e06c75;
|
color: #e06c75;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
word-wrap: break-word;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 暗色模式适配 */
|
/* 暗色模式适配 */
|
||||||
|
Loading…
Reference in New Issue
Block a user