diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index 6f36d0a..0000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,22 +0,0 @@ -version: 2 -updates: - - package-ecosystem: "npm" - directory: "/" - schedule: - interval: "daily" - groups: - patch-updates: - patterns: - - "*" - update-types: - - "patch" - minor-updates: - patterns: - - "*" - update-types: - - "minor" - pull-request-branch-name: - separator: "-" - ignore: - - dependency-name: "*" - update-types: ["version-update:semver-major"] diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index 918f40b..0000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,60 +0,0 @@ -name: Build Astro dist file - -on: - push: - branches: [main] # 推送到 main 分支时触发 - pull_request: - branches: [main] # 拉取请求时也触发(可选) - schedule: - - cron: "0 5 * * *" - -jobs: - build: - runs-on: ubuntu-latest - # 仅新增:声明工作流权限,解决GITHUB_TOKEN无写入权限的核心问题 - permissions: - contents: write - steps: - - name: Install pnpm - uses: pnpm/action-setup@v2 - with: - version: latest # 安装最新版本的 pnpm - - - name: Cache pnpm dependencies - uses: actions/cache@v3 - with: - path: ~/.pnpm-store - key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-pnpm- - - # 1. 拉取代码 - - name: Checkout code - uses: actions/checkout@v4 - # 仅新增:拉取完整仓库历史,避免推送分支时的历史缺失问题 - with: - fetch-depth: 0 - - # 2. 安装 Node.js(Astro 要求 Node.js 18+) - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 # 推荐 20.x - - # 3. 安装依赖(解决权限问题的关键步骤) - - name: Install dependencies - run: pnpm install --no-frozen-lockfile - # 若使用 pnpm/yarn,替换为 pnpm install 或 yarn install - - # 4. 构建项目,生成 dist 目录 - - name: Build Astro site - run: pnpm run build # 等价于 astro build,输出到 dist - - # 5. 推送到 page 分支 - - name: Deploy to page branch - uses: peaceiris/actions-gh-pages@v4 # 第三方 Action,简化推送流程 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} # 自动生成的临时令牌,有仓库操作权限 - publish_dir: ./dist # 要推送的目录(Astro 构建产物) - publish_branch: page # 目标分支(page 分支) - force_orphan: true # 强制创建孤儿分支(只保留 dist 内容,可选) \ No newline at end of file diff --git a/.gitignore b/.gitignore deleted file mode 100644 index dcac261..0000000 --- a/.gitignore +++ /dev/null @@ -1,27 +0,0 @@ -# build output -dist/ - -# generated types -.astro/ - -# dependencies -node_modules/ - -# logs -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* - -# environment variables -.env -.env.production - -# macOS-specific files -.DS_Store - -.vercel - -package-lock.json -bun.lockb -yarn.lock diff --git a/src/components/misc/Categories.astro b/.nojekyll similarity index 100% rename from src/components/misc/Categories.astro rename to .nojekyll diff --git a/.npmrc b/.npmrc deleted file mode 100644 index 6baea02..0000000 --- a/.npmrc +++ /dev/null @@ -1 +0,0 @@ -manage-package-manager-versions = true \ No newline at end of file diff --git a/.vercelignore b/.vercelignore deleted file mode 100644 index 4146d10..0000000 --- a/.vercelignore +++ /dev/null @@ -1,6 +0,0 @@ -node_modules -build -dist -.git -.trae -.log \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json deleted file mode 100644 index 57c8cad..0000000 --- a/.vscode/extensions.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "recommendations": ["biomejs.biome", "astro-build.astro-vscode"] -} diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 8ed0aaf..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "editor.formatOnSave": true, - "editor.defaultFormatter": "biomejs.biome", - "[javascript]": { - "editor.defaultFormatter": "biomejs.biome" - }, - "[javascriptreact]": { - "editor.defaultFormatter": "biomejs.biome" - }, - "[typescript]": { - "editor.defaultFormatter": "biomejs.biome" - }, - "[typescriptreact]": { - "editor.defaultFormatter": "biomejs.biome" - }, - "editor.codeActionsOnSave": { - "source.fixAll": "explicit", - "quickfix.biome": "always", - "source.organizeImports.biome": "always" - }, - "frontMatter.dashboard.openOnStart": false, - "Lingma.localMachineModel": true -} diff --git a/2/index.html b/2/index.html new file mode 100644 index 0000000..ec7dd73 --- /dev/null +++ b/2/index.html @@ -0,0 +1,913 @@ +
+ Hello 👋 I'm Allen2030
+++ + + + + + + + + + + + + + + + ++ 赞助了一定要给Allen2030发邮件,表明渠道和单号,和你自己名称和内容,否则我认不清可能加不上。
| 名字 | 时间 | 备注 | 金额(单位:元) |
|---|---|---|---|
| Oliver | 2026-1-?? | 无 | 30 |
+本站由以下网络服务商提供云计算服务
+ +
2026年1月1日-2036年1月1日
+Allen2030 blog +
记录观看的番剧、电影等内容
如果你想让你的站点出现在朋友圈中,请确保:
Ech0 API智能获取
TIP自2026年1月1日起,本站不会再添加任何第三方备案号
网站名称:Allen2030's Blog网站地址:https://blog.allen2030.com网站图标:https://img.scdn.io/i/696e0f2b20919_1768820523.webp网站描述:摸摸猪头,快乐不愁RSS地址(若没有请留空):不再需要提供,已使用Friend-Circle-Lite RSS获取工具。网站类型(主页请修改后方博客文字为主页):博客数据加载中,请稍后刷新页面...
${i(30)}
+${i(40)}
+首先先部署cloudflare内网穿透,建议看技术爬爬虾视频
注意:不要穿透你要使用EO加速的域名,请穿透一个不用的子域名
完成上方步骤后打开腾讯EO注册账号使用兑换码激活免费套餐,中国大陆用户更推荐在腾讯云平台激活
国际版点击兑换免费套餐即可

国内腾讯云在下方图片位置激活即可

这里以国内腾讯云平台演示
随后添加域名,点击新增站点

然后输入你的域名,例如我的就是fis.ink,再点击开始接入

随后点击绑定至套餐,我这里绑定了,所以没有了,兑换完成是会有一个免费套餐的选择绑定即可
+
然后腾讯云会给你一个txt记录,在你当前的dns服务商添加即可。然后点击验证完成验证。
随后点击域名管理-添加域名
+
按照我下方的填
点击下一步

然后添加cname记录
例如我在cloudflare就按照下方添加,其他dns同理。
如果在cloudflare请注意代理状态一定要为仅DNS

+添加完成后等待一段时间腾讯EO就会免费为你申请SSL证书,开启免费https访问
然后就可以访问自己的网站了
好:
好:
不好:
https://blog.fis.ink/archives/yi-ban-re-bang-li-shi-ji-lu-2024-2025-shang-ban-xue-qi
++完结
+
https://blog.fishcpy.top/archives/yi-ban-re-bang-li-shi-ji-lu-2024-2025-xia-ban-xue-qi
+无图片
好 1.唐语彤帮助老师发口罩 2.今天语文课老师听课,同学们表现优异 不好 1.体育课后,两名同学自由搏击
好 1.语文模拟考优秀平均分比年级优秀平均分高出一半(太棒了) 2.英语小测一名同学满分💯 不好 1.王yu好 1.语文模拟考优秀平均分比年级优秀平均分高出一半(太棒了) 2.英语小测一名同学满分💯 不好 1.王昱涵值日太不认真了跟没扫一样,批评他
无图片
无,图片
好 1.今日数学小测多名同学100分 💯 不好 1.今日多名同学因上生物课时扰乱课堂纪律,导致生物老师直接火山爆发🔥
+温馨提示:距离期末考试还有18天
+
++ 考试!
好 1.明天模考 2.二班一名同学好心给我们班做值日(其实是被罚的) 不好 1.今日历史课两名男生一直说话,让历史老师发火🔥
好 1.今日卫生表现不错,没让二班扣分 不好 1.今日有一些同学在道法课上大闹天宫 2.今日多名同学给地理老师负荆请罪
好 1.英语听写六名同学100分 2.王昕妍,陆子俊,刘嘉乐被老师评为整理收纳小能手 不好 1.今日午休一些男生在拆家被老师发现实施爱的教育
好 1.今日有同学默写pronous全对 不好 1.道法课上同学们开天辟地
好 1.今日李承宣数学小测100分(进步很大) 不好 1.今日有很多男生的羽毛球丢了(看起来很伤心),建议下次别带了,好好学习
好 1.今日六名同学数学小测100分 不好 1。今日上课有同学太energetic了
好 1.今日班级获得六星班级 不好 1.今日体活课三名同学玩羽毛球被点名 2.今日班级出现了新大遍超人(翻译:抄最多)
好 1.今日多名同学英语听写全对 不好 1.今日地理课两名同学罚站 2.今日许多男生被罚跑400米
无图片
好 1.数学阶段测试张宇泽同学轻松拿下年纪和班级双第一👍 不好 1.今天又有一名男生弄坏了班级公共器材 2.今天音乐课四名男生被老师留下
好 1.班级几名同学主动领取运动器材 不好 1.某位男生私自借高年级运动器材并损坏
好 1.今日班级获得 三帆星旗 和 小熊 2.今日地理课几位同学不用写作业 不好 今日有几位同学上课老说话
好 1.数学考试同学们表现优异,值得表扬👍 2.索林熙数学课被表扬,继续努力 不好 1.某名同学被调到“金牌VIP”座位 2.音乐课某人“cossplay”蚂蚱
无图片 数学老师信息: 课前小测共有39位同学获得满分💯
好 1.今日数学小测多名同学100分 不好 1.英语课纪律不好 2.今日有一名同学再次没写完作业
好 1.闫博凯同学数学公开课讲题思路清晰被表扬 2.部分同学在课间积极讨论数学问题 不好 1.三名同学在食堂“传达情报”被抓捕
好 1.上周获得五星班级(继续加油) 2.雨给郑讲题 3.闫博凯给李子宇贴心披外套 wo! 不好 1.早读三名同学说话 2.地理课三名同学习题抄写 3.英语课三名同学总说话
好 1.今天语文默写22名同学满分 2.经过全班共同努力,争取到了下周二的数学公开课
好 1.今天数学小测32同学💯分 2.体育课老师表扬了三名女生 不好 无
好 1.今天数学小测多名同学💯分 不好 1.自习课一名同学“创意DIY” 2.某名同学生物课“神游天外” 班主任信息 大课间,唐语彤,张耘卓奋笔疾书。刘溢昕张紫涵在背古诗。王思萌,张雨泽,马敏萱,郑旭晴,闫博凯,郭佳怡,孟诗颖在安静学习。王欣妍问完各科老师问题,还在背初中语文古诗词拓展。
好 1.英语阅读单词梳理许多同学积极发言 2.同学们数学小条积极改错 不好 1.李同学喜提跑步大礼包 2。某位同学体育课玩闹被抓
无图片 数学老师信息 今天早上进行了第1、2章的基础知识过关,共有20名同学一次性通关。恭喜以下同学 王思萌,侯芊黛,刘溢昕,刘佳懿,张耘卓,张雨泽,孟诗颖,王昕妍,李子宇,闫博凯,于浩楠,陈骏洁,姜子跃,王腾煊,唐语彤,郑旭晴,杜明露,李嘉晟,陆子俊,李泽辰。
无图片
无图片
好 1、今日数学计算多人100分 2、今日课间多名同学认真学习 不好 1、有一位同学被地理老师罚写 2、有一位同学地理课上写作业 3、今日有一位同学午休搞破坏 4、有一位同学不做课前准备(多次)
好 1、李承宣遵守班级规定,知错就改 2、数学课上小测27人全对 3、数学错题同学积极改错 不好 1、今日某位老师抓拍午休混乱瞬间 2、王腾煊午休奇怪睡姿(今日奇怪事件)
好 1、毛立珑数学课被老师表扬 2、数学小测很多同学满分 不好 1、一名同学罚抄时写“天书”
好 1.今日英语听写很多人听写100分 2.今日有一些同学学习态度十分不错 不好 1.今日有一位同学因为某些原因扣了文明一分 2.今日英语课有很多人笑 3.今日有多名同学没完成作业
好 1.索林熙今日上课被数学老师表扬 2.今日毛立龙英语练习满分 不好 1.今日有一位同学给书改名(语文改甲骨文,英语改鸟语,历史改拉史。。。) 2.今日生物课纪律不好
好 1,.今天早读大多数同学按时背诵短文 2.李承宣英语课被老师表扬 3.李子宇同学引体向上做了三个 不好 1.一名同学音乐课活跃过度 2.英语课有一部分人没有按时交英语作业,喜提罚抄一遍
好 1.今日有些人贡献口罩给同学 2.数学课有些同学回答问题 不好 1.今日好多同学午休写作业吵闹 2.今日有三名同学在文明就餐区吃饭
好 1.今日唐雨彤在班级里修复地板 不好 1.今日有很多同学没有完成英语作业 2.今日卫生扣了一分
好 1.今日英语听写20人满分 2.在考试中有很多同学获得优秀奖进步奖 3.今日李嘉晟多次主动回答问题 4今日有很多同学在班级里学习 不好 1.今日舞蹈有两人逃课 2.今日上课有很多人没做课前准备 3今日上操有同学乱动乱说话
无,图片
无,图片
考试,无
没有图片 今日有考试
好 1 今日默写有 11 名同学 100 分 不好 1 无,大家都很棒 每日一笑 1 今日班级进行了 2b 铅笔争夺战,伤亡人众多(伤是发出叫声,亡是没抢到) 2 今日课间 有一位同学被老师罚叫了100“鹅” 3 今日生物课有一位同学PK输了,用抹布擦脸 最后祝大家,下周星期一、星期二都能取得理想成绩。 –fish 2024.10.25
好 1 有 22 名同学语文小测满分💯 2 今日李嘉晟多次回答问题 不好 1 有一位同学上课迟到 5 分钟 2 有几位同学没有做课前准备
好 1 今日龚晟鑫第一个背完英语 2 17 名同学语文听写全对 3 李承宣上课认真 不好 1 今日有个别同学没写英语作业 2 今日还有几位同学上体育课违反纪律 每日一笑 今日两位同学在课间写天书
没有图片,无热榜 年纪表扬👍 优秀班干部:侯芊黛,唐语彤,刘佳懿 优秀课代表:刘溢昕,王思萌,张云卓 学习标兵:于浩楠,张宇泽,李子宇 主动帮忙打扫卫生:刘嘉乐,申嘉怡,李承轩,王沛禹,郑旭晴,张云卓 班主任信息 今日小测后八首古诗默写。以下同学全对:刘佳懿,杜明露,李泽辰,王思萌,于浩楠,王腾煊,陈骏洁。错一个的同学有闫博凯,白晰,张雨泽,侯芊黛,陆子俊,郑旭晴,辛栋,李子宇,姜子跃。其中白晰同学进步明显,态度积极,特此表扬。明天默写继续听写这八首古诗。期待同学们更好的巩固。
好 1 今天班级获得六星班级 2龚晟鑫给马一然饭卡 不好 1 有几位同学没写作业 班主任信息 上一周表现优秀的班委(以下为班委年级组评选) 学习标兵:于浩楠,张雨泽,李子宇 优秀班干部:侯芊黛,唐语彤,刘佳懿 优秀课代表:刘溢昕,王思萌,张耘卓 运动会助人为乐,年级表彰卫生小组为张耘卓小组。组员刘嘉乐,申嘉怡,李承轩,王沛禹,郑旭晴。
今日无热榜 运动会图库 点这里
好 1 龚晟鑫和张雨泽提供自助餐 2 班委们很负责 3 今日运动员们十分卖力 4 王昕妍和刘佳懿无私奉献 不好 1 有几位同学违反纪律 运动会图库 点击这里
好 1 李嘉晟上课十分认真 2 今日有十个人听写全对 💯 不好 1 无
好 1 今日耿思凡主动借饭卡给索林熙 2 李承宣课上被老师表扬 👍 3 今日语文听写 15 个全对💯 不好 1 今日某人没写英语作业(小马哥)🐎 2 两位同学记律太差👎 班主任信息 今天继续听写论语十二章,以下同学全对。辛栋,孟诗颖,郭佳怡,李嘉晟,张紫涵,于浩楠,张耘卓,闫博凯,王思萌,陈骏洁,王腾煊,张紫萱,马一然,姜子跃。王昱涵,张雨泽。恭喜以上同学。今天班里小伙子表现很好。期待大家更好表现。
好 1 姜子跃,王昱涵和侯睿祺上课认真听讲 2 今日论语默写有 20 人全对 3.1 张紫萱,侯芊黛和孟诗颖为优秀课代表 3.2 王昕妍,张紫萱和段茗涵为优秀班委 3.3 杜明露,汪洋和闫博凯为学习标兵 不好 1 今日有一名同学所有作业都没带 2 今日升旗时,两位同学乱动,享受了免费健身服务 3两位同学历史作业在讲台,被历史老师请到班级后面(已补完) 4 今日小干部扣了3分😭
好 1 王昕妍,陈骏洁,段茗涵当选学生代表 2 毛立龙在班里认真学习 不好 1 两位同学在课上吵架 2 有一位同学逃值日 3 地理课上有几位同学没拿地球仪 4 四位同学课间跳舞
好 1 今日王沛禹主动为班级喊口号 2 今日班委会正式成立 3 今日有 10 名同学默写全对,23 名同学优秀 4 索林熙分享自己珍藏的昆虫标本 不好 1 三名同学上课玩笔+罗阵 2 两名同学在图书馆说话 班主任信息 今天语文课默写全对的的同学有王思萌,辛栋,张耘卓,杜明露,张紫萱,刘溢昕,孟诗颖,陈骏洁,郭佳怡,段茗涵。错两个以内的同学有,李泽辰,郑旭晴,王昱涵,王腾煊,张紫涵,李子宇,李嘉晟,侯芊黛,闫博凯,王欣妍,陆子俊,马敏萱于浩楠,张雨泽。恭喜以上同学。期待看到更多孩子优秀的表现。
好 1 今天有八个同学英语听写 100 分 2 张雨泽数学 100 分(周二热搜) 3 本周卫生角没有扣分,十分难得 4 刘佳懿,梦诗颖,刘溢昕,张耘卓,王思萌,于浩楠语文默写全对 不好 1 有两位男生在图书馆说小话 2 某位同学道法课带历史书,历史课带道法书 3 某人在历史课上写作业
好 1 张雨泽数学 100 分(至今未超越) 2 刘佳懿,梦诗颖,刘溢昕,张耘卓,王思萌,于浩楠语文听写 100 分 不好 1 昨天有 4 个男生没找老师背论语 2 早读有位同学说话被罚站
好 1 张雨泽数学 100 分 2 姜子跃和索林熙自觉在教室学习 3 马敏宣背完语文书 4 王腾煊回答了许多男生不会的问题 不好 1 数学课上 4 个男生回答不出问题 2 有两位男生在生物课上说话
没有啦,那时一班热榜都还没有啊!
名字
分组
孟**
班委
fishcpy
班委
郭**
班委
陈**
班委
梁*
班主任
{ "registry-mirrors": [ "https://dockerhub.icu", "https://docker.chenby.cn", "https://docker.1panel.live", "https://docker.awsl9527.cn", "https://docker.anyhub.us.kg", "https://dhub.kubesre.xyz", "https://dockerproxy.cn/", "https://hub.rat.dev/", "https://docker.actima.top/" ]}保存并重命名为 daemon.json。
+上传该文件到 docker 文件夹。
+使用 SSH 连接打开终端,输入以下命令:
+bash复制编辑sudo systemctl daemon-reloadsudo systemctl restart dockersudo reboot设备重启后,即可使用应用商店。hexo为静态博客,可以直接在github部署。 但是例如我这个域名 ping就有30个测速节点无法ping通,并且github每个仓库只有500MB存储空间 但是有了云服务器就不一样了,基本全国都可以ping通,例如我这个域名ping之后只有2个节点无法ping通
本次使用的云服务商为 雨云 打开雨云官网
点击登录/注册,经行注册,优惠码可以填fishcpy 或者点击这里一键填写 点击导航栏的总览>云服务器>购买云服务器 本人建议用香港的云服务器,有35ms和80ms的 如果对延迟有需求的可以选择35ms的,反之可以选择80ms的 演示使用80ms的,因为上行相对来说更高一些
点击立即购买,充钱后就可以购买成功 至此购买云服务器结束
我看了官方配置文件,里面好像没有关于导航栏图标的描述,修改完效果如下
1
+例: 首页: / || fas fa-home打开fontawesome
点击顶部导航栏的icons
比如我在搜索栏里搜索bilibili 点击你想要的图标
这里他给了一个html
1
+<i class="fa-brands fa-bilibili"></i>```把里面的fa-brands fa-bilibili复制下来
1234
+# 原来代码首页: / || fas fa-home#修改后首页: / || fa-brands fa-bilibili至此修改完毕
2024.9 宝塔面板无法安装,发现了1panel面板
+2024.9 在应用商店里发现halo建站,开始了我的建站之路
+2024.9 发布自己的第一篇文章
+2024.9 购买了云服务器
+2024.10 发现wordpass有一款主题特别好看,于是转到WordPress
+2024.11 wordpass优化不好,有转到hexo倾向
+2024.12 全站正式转到hexo,开始对butterfly美化
+2024.12 基本定型
+2024.12 更换安知鱼主题,启用cloudflare cdn
+2025.1.1 安知鱼主题加载太慢,并且页脚不能加 html,关闭 cloudflare CDN
+2025.2 又换回halo
+2025.3 发现halo-theme-dream2.0-plus,图片分流丘盾CDN 和 cloudflare CDN
+2025.7 实在受不了halo的臃肿,换到了新框架Astro并使用fuwari
+2025.7 分线路解析中国大陆境内使用腾讯EO香港节点,境外使用cloudflare cdn,实现秒开
++++ 此文章仅适用于akilar糖果屋中的 引入Aplayer播放音乐 文章 https://akilar.top/posts/3afa069a/ ,其他请自行测试]
meting_js的官方api很不稳定,播放歌曲断断续续,所以要自定义api地址
akilar糖果屋中有这样一些字 4.在主题配置文件[Blogroot]\_config.butterfly.yml的inject配置项中添加Aplayer的容器。
1 +2 +3 +4
inject: +head: +bottom: +-
里面并没有说如何自定义api地址 所根据我的尝试,成功自定义api地址
1 +2 +3 +4 +5
# akilar糖果屋中原本代码 +-
# 修改后 +- <div class=“aplayer no-destroy” data-id=“5183531430” data-server=“netease” data-type=“playlist” data-fixed=“true” data-mini=“true” data-listFolded=“false” data-order=“random” data-preload=“none” data-autoplay=“false” data-meting_api=“https://meting.qjqq.cn/?server=:server&type=:type&id=:id&auth=:auth&r=:r” muted>
根据上方的配置参数,这里添加了一个data-meting_api=”https://meting.qjqq.cn/?server=
++仅适用于hexo-theme-anzhiyu,其他请自行测试
+
打开博客根目录目录 依次打开 /themes/anzhiyu/source/js 里面有一个utils.js 打开它 按ctrl+f搜索 getCustomPlayList: function ()
文件参数是这样的 修改const userId = 你歌单的id 如果想修改歌单音乐服务商就改const userServer = netease或tencent或kugou,或xiami或 baidu 这样访问 /music/接可以了,不用在后面加?id=歌单id&server=音乐服务商
+ +
+++ 效果预览 关于 fishcpy的小破站
在里面新建一个.js文件,例如我新建了一个clock.js文件 编辑文件,加入下面代码
// 设置倒计时的目标日期var countDownDate = new Date("September 6, 2034 00:00:00").getTime();
+// 每秒更新倒计时var x = setInterval(function() { var now = new Date().getTime(); var distance = countDownDate - now;
+ // 计算天、小时、分钟和秒 var days = Math.floor(distance / (1000 * 60 * 60 * 24)); var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60)); var seconds = Math.floor((distance % (1000 * 60)) / 1000);
+ // 显示结果 document.getElementById("countdown").innerHTML = days + "天 " + hours + "小时 " + minutes + "分钟 " + seconds + "秒 ";
+ // 倒计时结束显示提示 if (distance < 0) { clearInterval(x); document.getElementById("countdown").innerHTML = "你发现了彩蛋"; }}, 1000);参数
注释
可改值
你发现了彩蛋
倒计时结束的文字
随意
September 6
日期
英文月份+日期
2034 00:00:00
日期
年份+具体时间
<style>.big-font { font-size: 50px; /* 字体大小保持原样 */ font-weight: bold;}</style>
+<body> <!-- 倒计时容器 --> <div id="countdown" class="big-font"></div>
+ <!-- 修正类名前多余的点号 --> <script data-pjax defer src='/js/clock.js'></script> <div class="pjax-reload"></div> <!-- 修正后的类名 --></body>参数
注释
可改值
50px
大小
/js/clock.js
文件位置
/js/文件名.js, 文件名为你刚创建的文件名
最新地址:
长期:
更新长期地址自动跳转
请求地址 https://nextgo.us.kg/api
+例;
+原先地址 https://www.greasyfork.us.kg/zh-CN/scripts/by-site/bilibili.com
+长期自动跳转地址 https://nextgo.us.kg/api/zh-CN/scripts/by-site/bilibili.com
使用这个可以长期自动跳转到最新域名
新域名 https://nextgo.us.kg/ (此域名为中转,确保以后更换域名不用费劲心思再找)
它将有以下限制:
+1.日本地区ip将会被阻止
+2.繁体中文将会重定向到 https://greasyfork.org/zh-TW
+3.由于服务器带宽不高,将会进行人机验证
+4.可能无法登录,ps:没试过
此域名为镜像 cn-greasyfork.org
下载地址为 update.greasyfork.us.kg
⚠️注意事项:
+由于.us.kg域名的特殊性,如果跳反诈基本是由于使用了运营商dns,可以更改dns为其他的,我在这里列几个
+阿里云:223.5.5.5
+腾讯云:119.29.29.29
+114dns:114.114.114.114
+360dns:101.198.198.198
+google:8.8.8.8
+cloudflare:1.1.1.1
New domain: https://nextgo.us.kg/ (This domain name for the transit, to ensure that the future replacement of the domain name do not have to struggle to find again)
It will have the following restrictions:
1.IP addresses from Japan will be blocked.
+2.Traditional Chinese will be redirected to https://greasyfork.org/zh-TW.
+3.Due to low server bandwidth, human verification will be implemented.
+4.Login may not be possible; PS: not tested.
This domain is a mirror of cn-greasyfork.org.
The download address is update.greasyfork.us.kg.
⚠️ Notices:
+Due to the unique nature of the .us.kg domain, if you experience issues with fraud prevention, it is likely due to using your ISP’s DNS. You can change the DNS to others; here are a few options:
+Alibaba Cloud: 223.5.5.5
+Tencent Cloud: 119.29.29.29
+114dns: 114.114.114.114
+360dns: 101.198.198.198
+Google: 8.8.8.8
+Cloudflare: 1.1.1.1
提示词:写一篇400字的描述中国的作文
+中国是一个拥有悠久历史和丰富文化传统的国家。中国的文化源远流长,包括诗歌、绘画、音乐、戏剧、建筑等多个领域,都展现出独特的魅力。其中,中国的书法被誉为“东方艺术之花”,每一笔每一画都蕴含着深厚的文化内涵。中国的传统绘画以山水、花鸟为主题,追求意境的抒发和笔墨的韵味,体现了中国人对自然的独特感悟。 中国的音乐也是独具特色,古代的乐曲如《广陵散》、《阳关三叠》等流传至今,展现了中国人对音乐艺术的热爱和追求。中国的传统戏曲更是独树一帜,有京剧、豫剧、越剧等不同类型,每一种戏曲都有其独特的表演风格和表现形式,深受中国人民的喜爱。 此外,中国的建筑也是举世闻名,如万里长城、故宫等建筑奇迹,展现了中国古代建筑工艺的精湛和气势恢宏。中国的传统建筑注重“天人合一”的理念,追求与自然的和谐共生,体现了中国人对宇宙和谐的追求。 总的来说,中国的文化传统是丰富多彩的,融合了诗歌、绘画、音乐、戏剧、建筑等多种艺术形式,展现了中国人民对美好生活的向往和追求。这些传统文化不仅丰富了中国人民的精神生活,也为世界文化的多样性做出了重要贡献。
+AI 也可能犯错,请仔细辨别
+
在百度或必应等搜索引擎上搜索游戏英文名 例如我搜索地平线5英文名 得到FORZA HORIZON 5
打开 byrutgame
在搜索栏里输入刚刚搜索到的游戏英文名,例如我的就是FORZA HORIZON 5
直接搜索 
+注意:图片有红色印章的是可以联网的游戏
+
点击想要的游戏来到这页
点击这个按钮下载.torrent文件 
这里推荐qbittorrent增强版 github 链接不上github的可以用 123盘下载(仅适用于Windows) 打开软件之后是这样的
点击左上角 文件-添加torrent文件,把刚下的文件导入进去 选择文件保存位置后点击确定就可以开始下载了
下载完点击对应启动程序启动游戏
+记得在游戏设置里改语言!
+


点击这里哦打不开说明正在部署
https://api.fis.ink/mchttps://api.fis.ink/aqtw由于很多人对我的名字有疑问(包括QQ),所以我来说一下
+由于我中文名我起的是 咬一口的鱼py ,所以我23年抽风的大脑因为注册github所以想了个英文名,fishcpy
+那么这个名字是怎么来的呢?
+鱼 = fish
+py = py
+至于c嘛,我哪知道为啥啊,早忘了。
+ok啊,水文+1
首先需要部署Uptime Kuma,可以在docker等平台部署,这里不多说,自己看看github仓库
我这里提供一个css,可以参考一下,我也是用别人css加了一点效果
具体效果可以看我的监控站
:root { --bs-white: #fff; --bs-dark: #212529; --bs-green: #008000; --bs-danger: #dc3545; --bs-body-bg: #f6f7f9; --bs-blue: #0d6efd; --bg-linear-gradient: linear-gradient(180deg, #f6f6f6, #f8f8f8); --border-solid-main: 2px solid var(--bs-white); --border-solid-small: 1px solid var(--bs-white); --shadow-inset-box: inset -4px -4px 12px #f1f1f1, inset 4px 4px 12px #e2e2e2;}
+.dark { --bs-white: #2d2d2d; --bs-dark: #e9ecef; --bs-green: #00c800; --bs-danger: #dc3545; --bs-body-bg: #222222; --bg-linear-gradient: linear-gradient(180deg, #242424, #222222); --border-solid-main: 2px solid rgba(45, 45, 45, 0.8); --border-solid-small: 1px solid rgba(45, 45, 45, 0.6); --shadow-inset-box: inset -4px -4px 12px #0d0d0d, inset 4px 4px 12px #1a1a1a;}
+body { background-color: var(--bs-body-bg) !important;}
+/* 全局样式 */body { font-family: 'CustomFont', sans-serif; color: #333; margin: 0; padding: 0; background-image: url('https://api.fis.ink/mc'); background-attachment: fixed; background-size: cover; background-position: center center; background-repeat: no-repeat;}
+/* LOGO标题样式 */.title-flex { font-weight: bold; justify-content: center;}
+/* 按钮 */.btn-info { color: var(--bs-dark); background-image: var(--bg-linear-gradient); border: var(--border-solid-main); background-color: rgba(255, 255, 255, 0.2) !important; backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); border: 1px solid rgba(255, 255, 255, 0.3); box-shadow: none !important;}
+.btn-info:hover { color: var(--bs-dark); background-color: transparent; border-color: unset; box-shadow: none !important;}
+/* 服务组标题 */.group-title { font-size: 2.5rem; font-weight: 700; opacity: .5; -webkit-mask: linear-gradient(var(--bs-white) 50%, transparent); mask: linear-gradient(var(--bs-white) 50%, transparent); text-stroke: 1px var(--bs-dark); -webkit-text-stroke: 1px var(--bs-dark); -webkit-text-fill-color: transparent;}
+/* 服务项目列表样式 */.monitor-list .monitor-list { min-height: 45px; display: grid; grid-template-columns: repeat(2, 1fr);}
+.monitor-list .item .info { display: flex; flex-wrap: wrap; align-items: center;}
+.info1::before,.info1::after { content: ""; display: inline-block; width: 10px; height: 10px; background-color: var(--bs-white); margin: 0.5rem 0; border-radius: 50%; animation: breath 1.5s ease-in-out infinite;}
+.info1::after { animation-delay: 0.75s;}
+.info .bg-danger+.item-name { color: var(--bs-red);}
+.shadow-box { margin-top: 0 !important; background-image: var(--bg-linear-gradient); box-shadow: none !important;}
+div[data-v-f71ca08e].mb-5:hover .group-title { -webkit-text-fill-color: var(--bs-dark);}
+.monitor-list .item { box-shadow: none !important;}
+.monitor-list .item:hover { background-color: rgba(0, 0, 0, 0.5) !important; box-shadow: none !important;}
+.dark .monitor-list .item:hover { background-color: var(--bs-body-bg); box-shadow: none !important;}
+/* 服务项目列表标题样式 */.item-name { font-weight: bold;}
+a { text-decoration: none !important;}
+a.item-name:hover { color: var(--bs-blue) !important;}
+.overall-status .ok { color: var(--bs-green) !important;}
+.hp-bar-big .beat[data-v-636dc6a9] { background-color: var(--bs-green);}
+.item .row { justify-content: space-between;}
+.info .badge.rounded-pill.bg-primary { --bg: var(--bs-green);}
+.info .badge.rounded-pill.bg-danger { --bg: var(--bs-danger);}
+.info .badge.rounded-pill { position: relative; display: flex; min-width: auto; width: 1rem; margin-left: 0.1rem; font-size: 0; justify-content: center; align-items: center; background-color: transparent !important;}
+.info .badge.rounded-pill::before { position: absolute; content: ""; width: 1rem; height: 1rem; border-radius: 50%; background-color: var(--bg); animation: breath 1.1s ease-in-out infinite;}
+.info .badge.rounded-pill::after { content: ""; width: 0.6rem; height: 0.6rem; border-radius: 50%; background-color: var(--bg);}
+@keyframes breath { 0%, 100% { transform: scale(1); opacity: 0.2; } 50% { transform: scale(1.2); opacity: 0; }}
+/* 隐藏更新时间 */.refresh-info.mb-2 { display: none;}
+/* 公共样式优化 */.col-md-4 { width: 50%;}
+.col-md-8 { max-width: 50%; display: flex; flex-wrap: wrap; flex-direction: column;}
+.mb-5 { margin-bottom: 2rem !important;}
+/* 底部样式 */footer[data-v-b8247e57] { margin: 1.5rem 0 !important;}
+footer p { margin: 0 !important;}
+/* 适配手机 */@media screen and (max-width: 768px) { .monitor-list .monitor-list { grid-template-columns: repeat(1, 1fr); } .group-title { font-size: 2rem; }}
+/* 全局半透明背景卡片 */.shadow-box,.monitor-list .item { background-color: rgba(0, 0, 0, 0.4) !important; backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px); border: 1px solid rgba(255, 255, 255, 0.1);}
+/* 暗色模式下卡片透明度调低 */.dark .shadow-box,.dark .monitor-list .item,.dark .btn-info { background-color: rgba(34, 34, 34, 0.3) !important; border: 1px solid rgba(255, 255, 255, 0.1);}
+/* 标题透明度柔和 */.group-title { opacity: 0.5;}如果你需要自定义背景可以把上方css中的第36行左右的 https://api.fis.ink/mc 换为自己的图片或图片api
如何部署
+部署请看哪哪吒监控文档
+登录到后台,点击头像再点击系统设置,在里面找到自定义代码(样式和脚本) 插入下方代码
请根据自己情况修改
/* 基础设置 */ <script> window.CustomLogo = "https://cdn.fis.ink/img/2025/05/29/683836588877f.webp"; /* 自定义logo */ window.ShowNetTransfer = "true"; /* 卡片显示上下行流量 */ window.DisableAnimatedMan = "true"; /* 关掉动画人物插图 */ window.CustomDesc ="非淡泊无以明志,非宁静无以致远"; /* 自定义描述 */ </script> /* 以上鼠标特效 */ <script> window.CustomBackgroundImage="https://cdn.fis.ink/img/2025/05/05/68182abdc7d6e.png"; /* 背景图 */ </script> <script src="https://testingcf.jsdelivr.net/gh/mocchen/cssmeihua/js/aixin.js"></script>/* 点击爱心特效 */ <script src="https://testingcf.jsdelivr.net/gh/mocchen/cssmeihua/js/yinghua.js"></script> /* 页面樱花效果 */ <span class="js-cursor-container"></span> <script src="https://testingcf.jsdelivr.net/gh/mocchen/cssmeihua/js/xiaoxingxing.js"></script>
+ /* 更换卡通小人 */ <script> var observer = new MutationObserver(function(mutationsList, observer) { var xpath = "/html/body/div/div/main/div[2]/section[1]/div[4]/div"; var container = document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
+ if (container) { observer.disconnect(); var existingImg = container.querySelector("img"); if (existingImg) { container.removeChild(existingImg); } var imgElement = document.createElement("img"); imgElement.src = "https://cdn.skyimg.de/up/2025/1/13/zera6q.webp"; imgElement.style.position = "absolute"; imgElement.style.right = "8px"; imgElement.style.top = "-80px"; imgElement.style.zIndex = "10"; imgElement.style.width = "90px"; container.appendChild(imgElement); } }); var config = { childList: true, subtree: true }; observer.observe(document.body, config); </script>+++ 25.8.26更新
更改了部分UI
TIP+由于我没有实力,本篇文章修改文件部分为AI所写
CAUTION+修改文件前请注意备份,防止修改失败无法回退
今天在看liushen大佬文章时看到了个大卡片效果,感觉挺好看的,于是让AI给我加上了
::link-card{url="https://www.fis.ink" title="fishcpy的主页" description="fishcpy的个人主页"}::link-card{url="https://www.fis.ink" title="fishcpy的主页" description="fishcpy的个人主页" icon="https://github.com/github.png"}
::link-card{url="https://www.fis.ink" title="fishcpy的主页" description="fishcpy的个人主页" icon="https://file.fis.ink/img/fishcpy/logo.png"}::link-card{url="https://www.fis.ink" title="fishcpy的主页" description="fishcpy的个人主页" icon="https://file.fis.ink/img/fishcpy/logo.png" image="https://file.fis.ink/img/fishcpy/logo.png"}
TIP由于我没有实力,下方内容为AI所写
CAUTION修改文件前请注意备份,防止修改失败无法回退
首先,在 src/plugins/ 目录下创建 rehype-component-link-card.mjs 文件:
/// <reference types="mdast" />import { h } from "hastscript";
+/** * Creates a Link Card component for third-party links. */export function LinkCardComponent(properties, children) { if (Array.isArray(children) && children.length !== 0) return h("div", { class: "hidden" }, [ 'Invalid directive. ("link-card" directive must be leaf type "::link-card{url="https://example.com"}"))', ]);
+ if (!properties.url || !properties.url.startsWith('http')) return h( "div", { class: "hidden" }, 'Invalid URL. ("url" attribute must be a valid HTTP/HTTPS URL)', );
+ const url = properties.url; const customTitle = properties.title; const customDescription = properties.description; const customImage = properties.image; const customIcon = properties.icon; const cardUuid = `LC${Math.random().toString(36).slice(-6)}`;
+ // Extract domain from URL for display const domain = new URL(url).hostname;
+ // Use custom icon if provided, otherwise use Google favicon service const iconUrl = customIcon || `https://www.google.com/s2/favicons?domain=${domain}&sz=32`; const nFavicon = h(`div#${cardUuid}-favicon`, { class: "lc-favicon", style: `background-image: url(${iconUrl})` });
+ // 隐藏域名显示的标题栏 const nTitle = h("div", { class: "lc-titlebar" }, [ h("div", { class: "lc-titlebar-left" }, [ // h("div", { class: "lc-site" }, domain), // 已注释掉域名显示 ]), h("div", { class: "lc-external-icon" }), ]);
+ const nCardTitle = h( `div#${cardUuid}-title`, { class: "lc-card-title" }, customTitle || "Link", );
+ const nDescription = h( `div#${cardUuid}-description`, { class: "lc-description" }, customDescription || "Click to visit", );
+ const nImage = h( `div#${cardUuid}-image`, { class: "lc-image" }, customImage ? h("img", { src: customImage, alt: "Link preview" }) : null );
+ // Only fetch metadata if custom data is not provided const needsFetch = !customTitle || !customDescription;
+ const nScript = needsFetch ? h( `script#${cardUuid}-script`, { type: "text/javascript", defer: true }, ` // Simple metadata extraction for link cards try { const cardElement = document.getElementById('${cardUuid}-card'); const titleElement = document.getElementById('${cardUuid}-title'); const descElement = document.getElementById('${cardUuid}-description');
+ // Set default values if custom ones weren't provided if (!titleElement.dataset.hasCustomTitle) { titleElement.innerText = 'Link'; } if (!descElement.dataset.hasCustomDesc) { descElement.innerText = 'Click to visit'; }
+ cardElement.classList.remove("fetch-waiting"); console.log("[LINK-CARD] Loaded card for ${url} | ${cardUuid}."); } catch (err) { const c = document.getElementById('${cardUuid}-card'); c?.classList.add("fetch-error"); console.warn("[LINK-CARD] (Error) Loading card for ${url} | ${cardUuid}."); } `, ) : null;
+ // Set data attributes for custom content if (customTitle) { nCardTitle.properties['data-has-custom-title'] = 'true'; } if (customDescription) { nDescription.properties['data-has-custom-desc'] = 'true'; }
+ const cardContent = [ nTitle, nCardTitle, nDescription, ];
+ if (customImage) { cardContent.push(nImage); }
+ if (nScript) { cardContent.push(nScript); }
+ return h( `a#${cardUuid}-card`, { class: needsFetch ? "card-link fetch-waiting no-styling" : "card-link no-styling", href: url, target: "_blank", rel: "noopener noreferrer", 'data-url': url, }, cardContent, );}在 src/styles/markdown-extend.styl 文件中添加以下样式:
// Link Card Stylesa.card-link display: block text-decoration: none border: 1px solid var(--line-divider) border-radius: 8px padding: 16px margin: 16px 0 background-color: var(--card-bg) transition: all 0.2s ease position: relative overflow: hidden color: inherit
+ &:hover background-color: var(--btn-regular-bg-hover)
+ .lc-titlebar .lc-external-icon opacity: 1
+ &:active transform: translateY(0) box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1)
+ // 隐藏标题栏以移除域名显示和空白区域 .lc-titlebar display: none
+ .lc-titlebar-left display: flex align-items: center
+ .lc-site display: flex align-items: center gap: 8px
+ .lc-favicon width: 16px height: 16px background-size: contain background-repeat: no-repeat background-position: center flex-shrink: 0
+ .lc-domain font-size: 14px color: var(--text-color-secondary) font-weight: 500
+ .lc-external-icon width: 16px height: 16px opacity: 0.6 transition: opacity 0.2s ease background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path><polyline points="15,3 21,3 21,9"></polyline><line x1="10" y1="14" x2="21" y2="3"></line></svg>') background-size: contain background-repeat: no-repeat background-position: center
+ .lc-card-title font-size: 18px font-weight: 600 color: var(--text-color-primary) margin-bottom: 8px line-height: 1.3
+ .lc-description font-size: 14px color: var(--text-color-secondary) line-height: 1.4 margin-bottom: 12px
+ // 移除图片上方的空白区域 .lc-image margin-top: 0
+ img width: 100% max-height: 200px object-fit: cover border-radius: 4px
+ &.fetch-waiting .lc-card-title, .lc-description animation: pulse 1.5s ease-in-out infinite
+ &.fetch-error border-color: var(--error-color) background-color: var(--error-bg)
+@keyframes pulse 0%, 100% opacity: 1 50% opacity: 0.5在 astro.config.mjs 文件中导入组件并注册:
// 添加导入import { LinkCardComponent } from "./src/plugins/rehype-component-link-card.mjs";
+// 在 rehypeComponents 配置中添加rehypeComponents,{ components: { github: GithubCardComponent, "link-card": LinkCardComponent, // 添加这一行 note: (x, y) => AdmonitionComponent(x, y, "note"), // ... 其他组件 },},配置完成后,你就可以在Markdown文件中使用链接卡片了:
// 基本用法::link-card{url="https://example.com"}
+// 自定义标题和描述::link-card{url="https://github.com" title="GitHub" description="代码托管平台"}
+// 带自定义图片::link-card{url="https://vercel.com" title="Vercel" description="部署平台" image="https://example.com/image.png"}
+// 自定义图标::link-card{url="https://github.com" title="GitHub" description="代码托管平台" icon="https://github.com/favicon.ico"}http:// 或 https:// 开头现在你的博客就拥有了美观的第三方链接大卡片功能!
那肯定是我朋友邀请我去的啦,同时我也爆肝了几天把非人哉都看完了。
+中文名非人哉:限时玩家
+
+外文名Fairizest:Rally for Pally
+类 型剧情、喜剧、动画
+出品公司中影(广州)电影制作有限公司、上海淘票票影视文化有限公司、北京彩条屋科技有限公司、北京分子互动文化传播有限公司、分子影业(广州)有限公司、中国电影产业集团股份有限公司、象山此刻文化传媒有限公司 [18]
+制片地区中国内地
+复制自百度百科
WARNING以下内容仅代表个人观点,可能有剧透
首先满分10分我打6分。非人哉系列的剧情确实很好,但是这部电影的剧情和画面并没有很惊艳。
画面感觉到后期经费不足似的,后面有部分片段直接放ppt配音乐了。
剧情主要讲述九月和朋友们去找大士过假期,误入游戏世界,集齐了4个地区的碎片,合成了最终钥匙,小黑阻挠通关,以及在停服前打败最终BOSS。
+整个电影中感觉没有什么笑点,并且将主角九月刻画的比较弱易弄杂事的样子,九月已经200多岁,但是表现却和20岁似的
+后期莫名其妙出来个三级头男,直到结尾赞助商有个 (和平精英) 我释怀了。
差不多就这些了,其他等我想到了再补充
我在2025.8.17日下午使用trae的SOLO模式并使用SOLO Builder智能体开发vue3的个人主页,模型使用的是Claude 4。
+起初在预览环境没有问题,但是我将整个项目上传到github并部署到vercel时右下角却出现SOLO模式的广告组件。
+
+经过翻代码发现AI在写vite.config.ts时引入了trae的广告组件。
import traeBadgePlugin from 'vite-plugin-trae-solo-badge' traeBadgePlugin({ variant: 'dark', position: 'bottom-right', prodOnly: true, clickable: true, clickUrl: 'https://www.trae.ai/solo?showJoin=1', autoTheme: true, autoThemeTarget: '#app', }),这显然是提示词注入。
可以直接翻代码移除。
先切换到IDE模式,浏览器在生产环境的网页按F12选择广告组件,复制HTML。
+随便选择一个模型,跟它说删除+复制的html,等待自动删除即可。
+
+ +

🌏 中文版 README 在
+中文
+(由社区提供,内容可能未及时更新)
| 命令 | 操作 |
|---|---|
pnpm install | 安装依赖项 |
pnpm dev | 在 localhost:4321 启动开发服务器 |
pnpm build | 将生产站点构建至 ./dist/ |
pnpm preview | 部署前预览构建站点 |
pnpm check | 运行代码质量与类型检查 |
pnpm format | 使用 Biome 格式化代码 |
pnpm new-post <文件名> | 创建新博客文章 |
pnpm astro ... | 运行 Astro CLI 命令(例如 astro add) |
pnpm astro --help | 显示 Astro CLI 帮助 |
本项目采用 MIT 许可协议授权。
基于 Fuwari 修改而来。
CAUTION修改文件前请注意备份,防止修改失败无法回退
新建src/components/misc/AISummary.astro文件
---export interface Props { content: string;}
+const { content } = Astro.props;
+// 如果没有内容,不渲染组件if (!content || content.trim() === '') { return null;}---
+{content && ( <div class="ai-summary"> <div class="ai-title"> <div class="ai-title-left"> <i>🤖</i> <span class="ai-title-text">AI 摘要</span> </div> <div class="ai-tag">fishcpy AI</div> </div> <div class="ai-explanation" data-content={content}></div> </div>)}
+<script> // 检查当前页面路径是否包含 "posts" function isPostsPage() { return window.location.pathname.includes('/posts/'); }
+ // 全局函数,用于初始化AI打字效果 function initAITyping() { // 只在包含 "posts" 的页面才执行AI总结功能 if (!isPostsPage()) { return; }
+ // 查找所有AI摘要容器 const aiSummaryContainers = document.querySelectorAll('.ai-summary');
+ aiSummaryContainers.forEach(container => { const textElement = container.querySelector('.ai-explanation');
+ if (!textElement) { return; }
+ // 检查是否已经初始化过 if (textElement.hasAttribute('data-initialized')) { return; }
+ const content = textElement.getAttribute('data-content'); if (!content) { return; }
+ // 标记为已初始化 textElement.setAttribute('data-initialized', 'true');
+ // 清空文本内容,准备打字效果 textElement.textContent = ''; textElement.classList.remove('typing-complete');
+ let index = 0; const typeSpeed = 30; // 打字速度(毫秒)
+ function typeWriter() { if (index < content.length) { textElement.textContent += content.charAt(index); index++; setTimeout(typeWriter, typeSpeed); } else { // 打字完成后隐藏光标(通过CSS控制) textElement.classList.add('typing-complete'); } }
+ // 延迟开始打字效果 setTimeout(typeWriter, 800); }); }
+ // 页面加载完成时初始化 function handlePageLoad() { setTimeout(initAITyping, 100); }
+ // 监听页面导航事件(适用于Astro的客户端路由) function setupNavigationListeners() { // DOMContentLoaded事件 if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', handlePageLoad); } else { handlePageLoad(); }
+ // 监听Astro的页面导航事件 document.addEventListener('astro:page-load', handlePageLoad);
+ // 监听浏览器的popstate事件(后退/前进按钮) window.addEventListener('popstate', handlePageLoad);
+ // 监听pushstate和replacestate事件 const originalPushState = history.pushState; const originalReplaceState = history.replaceState;
+ history.pushState = function() { originalPushState.apply(history, arguments); setTimeout(handlePageLoad, 100); };
+ history.replaceState = function() { originalReplaceState.apply(history, arguments); setTimeout(handlePageLoad, 100); }; }
+ // 立即设置监听器 setupNavigationListeners();</script>在src/content/config.ts插入下方代码,13行下左右,注意+号要删除
tags: z.array(z.string()).optional().default([]),category: z.string().optional().nullable().default(""),lang: z.string().optional().default(""),+ ai: z.string().optional().default(""),
+/* For internal use */prevTitle: z.string().default(""),在src/pages/posts/[…slug].astro插入下方代码,注意+号要删除
import { profileConfig, siteConfig } from "../../config";import { formatDateToYYYYMMDD } from "../../utils/date-utils";import Comment from "@components/comment/index.astro";+ import AISummary from "@components/misc/AISummary.astro";
+export async function getStaticPaths() { const blogEntries = await getSortedPosts();@@ -84,6 +85,9 @@ const jsonLd = {</div></div>
++ <!-- AI Summary -->+ {entry.data.description && <AISummary content={entry.data.description} class="onload-animation" />}
+<!-- metadata --><div class="onload-animation"><PostMetadata在src/styles/main.css底部添加下方代码
/* =================== *//* 📘 AI 摘要模块样式 *//* =================== */
+.ai-summary { background: var(--card-bg); border: 1px solid var(--line-divider); border-radius: 12px; padding: 8px 8px 12px 8px; line-height: 1.3; flex-direction: column; margin-bottom: 16px; display: flex; gap: 5px; position: relative; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); transition: all 0.3s;}
+.ai-summary:hover { box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); transform: translateY(-1px);}
+.ai-summary .ai-explanation { z-index: 10; padding: 8px 12px; font-size: 15px; line-height: 1.4; @apply text-90; text-align: justify;}
+/* ✅ 打字机光标动画 */.ai-summary .ai-explanation::after { content: ''; display: inline-block; width: 8px; height: 2px; margin-left: 2px; @apply bg-black/90 dark:bg-white/90; vertical-align: bottom; animation: blink-underline 1s ease-in-out infinite; transition: all 0.3s; position: relative; bottom: 3px;}
+/* 打字完成后隐藏光标 */.ai-summary .ai-explanation.typing-complete::after { display: none;}
+.ai-summary .ai-title { z-index: 10; font-size: 14px; display: flex; border-radius: 8px; align-items: center; position: relative; padding: 0 12px; cursor: default; user-select: none;}
+.ai-summary .ai-title .ai-title-left { display: flex; align-items: center; color: var(--primary);}
+.ai-summary .ai-title .ai-title-left i { margin-right: 3px; display: flex; color: var(--primary); border-radius: 20px; justify-content: center; align-items: center;}
+.ai-summary .ai-title .ai-title-left .ai-title-text { font-weight: 500;}
+.ai-summary .ai-title .ai-tag { color: var(--btn-content); font-weight: 300; margin-left: auto; display: flex; align-items: center; justify-content: center; transition: 0.3s;}
+/* ✅ 打字机光标闪烁动画 */@keyframes blink-underline { 0%, 100% { opacity: 1; } 50% { opacity: 0; }}最后在src/styles/variables.styl 大约19行后面添加下方代码
--page-bg: oklch(0.95 0.01 var(--hue)) oklch(0.16 0.014 var(--hue)) --card-bg: white oklch(0.23 0.015 var(--hue))
++ // AI Summary 相关变量+ --liushen-title-font-color: #0883b7 #0883b7+ --liushen-maskbg: rgba(255, 255, 255, 0.85) rgba(0, 0, 0, 0.85)+ --liushen-ai-bg: conic-gradient(from 1.5708rad at 50% 50%, #d6b300 0%, #42A2FF 54%, #d6b300 100%) conic-gradient(from 1.5708rad at 50% 50%, rgba(214, 178, 0, 0.46) 0%, rgba(66, 161, 255, 0.53) 54%, rgba(214, 178, 0, 0.49) 100%)+ --liushen-card-secondbg: #f1f3f8 #3e3f41+ --liushen-text: #4c4948 #ffffffb3+ --liushen-secondtext: #3c3c43cc #a1a2b8
+ --btn-content: oklch(0.55 0.12 var(--hue)) oklch(0.75 0.1 var(--hue)) --btn-regular-bg: oklch(0.95 0.025 var(--hue)) oklch(0.33 0.035 var(--hue))ipv4
154.23.241.3423.225.146.6183.194.216.135106.225.239.7117.148.172.71112.65.95.205101.226.41.74221.130.18.132119.96.16.87120.220.190.14442.81.156.7536.158.204.68223.26.78.6218.98.53.88219.151.141.70124.160.160.7058.19.20.71116.153.63.6859.36.216.50111.6.225.75111.13.153.72112.123.37.68113.201.9.12124.225.103.136125.73.215.4116.162.51.68221.204.62.68218.57.21.13560.28.203.70223.244.186.68117.187.182.132202.108.15.148211.139.55.7036.104.133.711.180.239.8059.49.86.70111.48.137.135112.29.205.7036.250.8.132101.207.252.75113.207.73.135180.130.113.72218.30.71.80116.176.33.201123.6.70.5116.177.229.558.211.13.9849.71.77.84183.201.192.68111.32.145.8182.242.83.133112.48.150.134180.97.244.13636.150.79.4116.136.19.13442.63.75.72125.211.192.3536.147.38.70120.233.53.26111.62.174.73121.31.236.73117.168.153.198220.181.53.87117.161.136.7436.163.196.86153.0.230.8125.76.115.251112.90.210.132117.177.67.5113.240.100.81115.231.43.69111.51.76.681.193.215.7045.251.101.543.163.239.20859.80.45.132115.223.6.243118.213.140.6842.185.158.68156.253.8.27101.28.250.72117.157.235.95111.26.149.6836.136.125.68111.29.45.133183.2.175.12111.42.192.68125.64.2.134183.240.228.133218.61.211.101222.79.71.253120.201.243.13443.130.151.11150.139.140.70111.12.212.7342.202.219.7027.185.235.70116.172.154.17220.162.119.71222.75.5.70116.178.236.69171.15.110.73112.90.40.216125.77.129.206221.8.93.9543.156.69.84194.147.100.44109.248.18.86113.62.118.132150.109.245.197117.180.235.132120.71.150.171221.181.52.17143.131.29.194146.185.214.4138.54.126.1838.54.59.59185.99.132.10438.54.45.15638.60.209.19438.54.63.220ipv4
154.38.106.211148.113.173.25140.207.232.18120.204.196.162101.71.160.163116.153.81.2223.111.24.198220.202.21.129111.47.215.14858.215.177.156117.169.16.203180.153.91.3112.48.221.77123.6.27.10120.223.242.157111.206.4.152119.97.171.1459.63.230.458.243.202.7259.83.222.20134.122.151.96115.236.144.23136.250.246.34125.39.11.1112.28.234.14036.158.254.130111.6.251.227183.201.231.162119.188.148.129150.138.178.3157.255.30.130111.62.70.129111.13.102.12211.91.243.88124.239.250.80111.32.157.133111.10.63.13659.38.99.166183.232.11.45175.6.41.1951.31.130.6861.240.153.196117.187.142.6636.102.218.7658.144.173.98218.25.106.113221.204.45.13436.131.159.78117.161.24.21117.24.3.143111.12.63.131116.253.27.152111.29.42.34121.31.231.89117.157.22.134218.203.117.72124.225.162.194116.176.35.20142.63.65.201183.224.38.14210.76.62.60182.242.140.26111.40.189.229111.19.212.248101.206.203.18117.174.129.181180.130.96.14336.104.140.200153.0.192.1671.32.216.91116.177.252.82139.215.167.7661.128.145.1459.80.37.156111.26.55.11219.144.80.136180.213.48.172125.74.24.2182.140.221.215.235.167.1521.71.11.171111.12.157.228162.19.154.15951.77.203.7636.99.143.1116.178.71.245219.147.74.651.38.70.219221.181.56.20045.202.210.3734.80.186.23141.164.56.18123.184.205.4643.242.167.44117.180.232.165222.75.58.10654.38.242.242110.157.249.53172.233.24.182139.99.134.84139.84.235.19261.190.114.193

点击链接打开雨云官网(使用这个链接会自动优惠)https://www.rainyun.com/fishcpy_
https://www.rainyun.com/fishcpy_
或者注册时输入优惠码:fishcpy
注册完成后来到总揽,点击云服务器
+
点击购买云服务器
这里我推荐中国香港极速三网,三大运营商直连,速度超快
+
配置选择 AMD® EPYC

如果你的网站访问量很大就选择 流量叠加型 , 访问量不大就选择 流量不限型。

套餐选择KVM标准版

其他的按照我的这个选
公网ip 1个
+debian版本选择12

打开finalshell官网
点击顶部的
FinalShell SSH工具,服务器管理,远程桌面加速软件,支持Windows,macOS,Linux,版本x.x.x,更新日期20xx.xx.xx

选择自己的系统版本下载,安装。
点击你的服务器卡片


点击文件夹图标,打开链接管理器
+
点击白色加号图标,选择SSH链接(Linux)


名称
填写值
1
名称
随便
2
主机
填写雨云控制台中的公网ip地址
3
用户名
填写雨云控制台中填写远程用户名
4
密码
填写雨云控制台中的远程密码
完成效果

填写完后,点击确定并在链接管理器中双击你刚添加的服务器链接
遇到这个点击 接受并保存
+
不出意外,你应该来到这个页面
+
在下方 命令输入框 中输入下方命令并回车
curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && bash quick_start.sh
填写输出的问题即可
来到最后输出的结尾打开外部地址的网址
[1Panel 2025-05-19 23:16:42 install Log]: 正在启动1Panel服务[1Panel 2025-05-19 23:16:43 install Log]:[1Panel 2025-05-19 23:16:43 install Log]: =================感谢您的耐心等待,安装已完成==================[1Panel 2025-05-19 23:16:43 install Log]:[1Panel 2025-05-19 23:16:43 install Log]: 请使用您的浏览器访问面板:[1Panel 2025-05-19 23:16:43 install Log]: 外部地址: http://154.64.254.179:12014/a46144d21a[1Panel 2025-05-19 23:16:43 install Log]: 内部地址: http://154.64.254.179:12014/a46144d21a[1Panel 2025-05-19 23:16:43 install Log]: 面板用户: d88f56f426[1Panel 2025-05-19 23:16:43 install Log]: 面板密码: 79157ec8b5[1Panel 2025-05-19 23:16:43 install Log]:[1Panel 2025-05-19 23:16:43 install Log]: 官方网站: https://1panel.cn[1Panel 2025-05-19 23:16:43 install Log]: 项目文档: https://1panel.cn/docs[1Panel 2025-05-19 23:16:43 install Log]: 代码仓库: https://github.com/1Panel-dev/1Panel[1Panel 2025-05-19 23:16:43 install Log]: 前往 1Panel 官方论坛获取帮助: https://bbs.fit2cloud.com/c/1p/7[1Panel 2025-05-19 23:16:43 install Log]:[1Panel 2025-05-19 23:16:43 install Log]: 如果您使用的是云服务器,请在安全组中打开端口 12014[1Panel 2025-05-19 23:16:43 install Log]:[1Panel 2025-05-19 23:16:43 install Log]: 为了您的服务器安全,离开此屏幕后您将无法再次看到您的密码,请记住您的密码。[1Panel 2025-05-19 23:16:43 install Log]:[1Panel 2025-05-19 23:16:43 install Log]: ================================================================例如我就打开http://154.64.254.179:12014/a46144d21a
输入上方的用户和密码
点击侧边栏应用商店安装OpenResty,配置保持默认即可
OpenResty安装完后,点击侧边栏的网站-运行环境,在PHP中点击创建运行环境,并按照我这样配置,名称随便。

点击确定,等待镜像制作完成
制作完成后点击网站并点击创建按钮,按照我这样配置
+
主域名如果用自己的域名就把 域名 解析 A 记录到你服务器的ip上,那么这里就写你自己的域名
点击确定 , 打开ip或域名如果为下图即为创建成功

打开
https://github.com/bbb-lsy07/dBd-Filing/releases
选择最新版本下载,例如我就下载 dBd-Filing-V2.5.0.zip
在1panel中点击按钮
+将 dBd-Filing-V2.5.0.zip_中的内容解压到含有_index.php 的目录,配置请按照下方仓库简介配置

在1panel应用商店里找到MySQL点击确定,安装

点击侧边栏数据库按钮

创建一个新数据库

点击这里查看链接信息
在ip或域名里填写数据库信息
验证id:489356
+中华人民共和国国旗.png

袁隆平-稻下乘凉梦.png

永远的人民英雄.png

天安门.雪.png

日本投降签字仪式.png

六代机击破长空,毛主席131年诞辰万岁!.png

开国大典4K.png
国徽.png
下载:
123盘,提取码6666
+Cover image source: Source
+
This blog template is built with Astro. For the things that are not mentioned in this guide, you may find the answers in the Astro Docs.
---title: My First Blog Postpublished: 2023-09-09description: This is the first post of my new Astro blog.image: ./cover.jpgtags: [Foo, Bar]category: Front-enddraft: false---| Attribute | Description |
|---|---|
title | The title of the post. |
published | The date the post was published. |
description | A short description of the post. Displayed on index page. |
image | The cover image path of the post. 1. Start with http:// or https://: Use web image2. Start with /: For image in public dir3. With none of the prefixes: Relative to the markdown file |
tags | The tags of the post. |
category | The category of the post. |
draft | If this post is still a draft, which won’t be displayed. |
Your post files should be placed in src/content/posts/ directory. You can also create sub-directories to better organize your posts and assets.
src/content/posts/├── post-1.md└── post-2/ ├── cover.png └── index.mdParagraphs are separated by a blank line.
2nd paragraph. Italic, bold, and monospace. Itemized lists
+look like:
Note that --- not considering the asterisk --- the actual text +content starts at 4-columns in.
+Block quotes are +written like so.
+They can span multiple paragraphs, +if you like.
+
Use 3 dashes for an em-dash. Use 2 dashes for ranges (ex., “it’s all +in chapters 12—14”). Three dots … will be converted to an ellipsis. +Unicode is supported. ☺
Here’s a numbered list:
Note again how the actual text starts at 4 columns in (4 characters +from the left side). Here’s a code sample:
# Let me re-iterate ...for i in 1 .. 10 { do-something(i) }As you probably guessed, indented 4 spaces. By the way, instead of +indenting the block, you can use delimited blocks, if you like:
define foobar() { print "Welcome to flavor country!";}(which makes copying & pasting easier). You can optionally mark the +delimited block for Pandoc to syntax highlight it:
import time# Quick, count to ten!for i in range(10): # (but not *too* quick) time.sleep(0.5) print iNow a nested list:
First, get these ingredients:
+Boil some water.
+Dump everything in the pot and follow +this algorithm:
+ find wooden spoon uncover pot stir cover pot balance wooden spoon precariously on pot handle wait 10 minutes goto first step (or shut off burner when done)Do not bump wooden spoon or it will fall.
+Notice again how text always lines up on 4-space indents (including +that last line which continues item 3 above).
Here’s a link to a website, to a local +doc, and to a section heading in the current +doc. Here’s a footnote 1.
Tables can look like this:
size material color
9 leather brown +10 hemp canvas natural +11 glass transparent
Table: Shoes, their sizes, and what they’re made of
(The above is the caption for the table.) Pandoc also supports +multi-line tables:
keyword text
red Sunsets, apples, and +other red or reddish +things.
green Leaves, grass, frogs +and other things it’s +not easy being.
A horizontal rule follows.
Here’s a definition list:
apples +: Good for making applesauce. +oranges +: Citrus! +tomatoes +: There’s no “e” in tomatoe.
Again, text is indented 4 spaces. (Put a blank line between each +term/definition pair to spread things out more.)
Here’s a “line block”:
| Line one +| Line too +| Line tree
and images can be specified like so:
Inline math equations go in like so: . Display +math should get its own line and be put in in double-dollarsigns:
And note that you can backslash-escape any punctuation characters +which you wish to be displayed literally, ex.: `foo`, *bar*, etc.
Just copy the embed code from YouTube or other platforms, and paste it in the markdown file.
---title: Include Video in the Postpublished: 2023-10-19// ...---
+<iframe width="100%" height="468" src="https://www.youtube.com/embed/5gIf0_xpFPI?si=N1WTorLKL0uwLsU_" title="YouTube video player" frameborder="0" allowfullscreen></iframe>You can add dynamic cards that link to GitHub repositories, on page load, the repository information is pulled from the GitHub API.
Create a GitHub repository card with the code ::github{repo="<owner>/<repo>"}.
::github{repo="saicaca/fuwari"}Following types of admonitions are supported: note tip important warning caution
NOTEHighlights information that users should take into account, even when skimming.
TIPOptional information to help a user be more successful.
IMPORTANTCrucial information necessary for users to succeed.
WARNINGCritical content demanding immediate user attention due to potential risks.
CAUTIONNegative potential consequences of an action.
:::noteHighlights information that users should take into account, even when skimming.:::
+:::tipOptional information to help a user be more successful.:::The title of the admonition can be customized.
MY CUSTOM TITLEThis is a note with a custom title.
:::note[MY CUSTOM TITLE]This is a note with a custom title.:::TIPThe GitHub syntax is also supported.
> [!NOTE]> The GitHub syntax is also supported.
+> [!TIP]> The GitHub syntax is also supported.ANSI colors:- Regular: Red Green Yellow Blue Magenta Cyan- Bold: Red Green Yellow Blue Magenta Cyan- Dimmed: Red Green Yellow Blue Magenta Cyan
+256 colors (showing colors 160-177):160 161 162 163 164 165166 167 168 169 170 171172 173 174 175 176 177
+Full RGB colors:ForestGreen - RGB(34, 139, 34)
+Text formatting: Bold Dimmed Italic Underlineconsole.log('Title attribute example')<div>File name comment example</div>echo "This terminal frame has no title"Write-Output "This one has a title!"echo "Look ma, no frame!"# Without overriding, this would be a terminal framefunction Watch-Tail { Get-Content -Tail 20 -Wait $args }New-Alias tail Watch-Tail// Line 1 - targeted by line number// Line 2// Line 3// Line 4 - targeted by line number// Line 5// Line 6// Line 7 - targeted by range "7-8"// Line 8 - targeted by range "7-8"function demo() { console.log('this line is marked as deleted') // This line and the next one are marked as inserted console.log('this is the second inserted line')
+ return 'this line uses the neutral default marker type'}<button role="button" {...props} value={value} className={buttonClassName} disabled={disabled} active={active}> {children && !active && (typeof children === 'string' ? <span>{children}</span> : children)}</button><button role="button" {...props}
+ value={value} className={buttonClassName}
+ disabled={disabled} active={active}>
+ {children && !active && (typeof children === 'string' ? <span>{children}</span> : children)}</button>this line will be marked as insertedthis line will be marked as deletedthis is a regular line--- a/README.md+++ b/README.md@@ -1,3 +1,4 @@+this is an actual diff file-all contents will remain unmodified no whitespace will be removed eitherfunction thisIsJavaScript() { // This entire block gets highlighted as JavaScript, // and we can still add diff markers to it! console.log('Old code to be removed') console.log('New and shiny code!')}function demo() { // Mark any given text inside lines return 'Multiple matches of the given text are supported';}console.log('The words yes and yep will be marked.')echo "Test" > /home/test.txtfunction demo() { console.log('These are inserted and deleted marker types'); // The return statement uses the default marker type return true;}// Example with wrapfunction getLongString() { return 'This is a very long string that will most probably not fit into the available space unless the container is extremely wide'}// Example with wrap=falsefunction getLongString() { return 'This is a very long string that will most probably not fit into the available space unless the container is extremely wide'}// Example with preserveIndent (enabled by default)function getLongString() { return 'This is a very long string that will most probably not fit into the available space unless the container is extremely wide'}// Example with preserveIndent=falsefunction getLongString() { return 'This is a very long string that will most probably not fit into the available space unless the container is extremely wide'}5 collapsed lines
// All this boilerplate setup code will be collapsedimport { someBoilerplateEngine } from '@example/some-boilerplate'import { evenMoreBoilerplate } from '@example/even-more-boilerplate'
+const engine = someBoilerplateEngine(evenMoreBoilerplate())
+// This part of the code will be visible by defaultengine.doSomething(1, 2, 3, calcFn)
+function calcFn() { // You can have multiple collapsed sections3 collapsed lines
const a = 1 const b = 2 const c = a + b
+ // This will remain visible console.log(`Calculation result: ${a} + ${b} = ${c}`) return c}
+4 collapsed lines
// All this code until the end of the block will be collapsed againengine.closeConnection()engine.freeMemory()engine.shutdown({ reason: 'End of example boilerplate code' })// This code block will show line numbersconsole.log('Greetings from line 2!')console.log('I am on line 3')// Line numbers are disabled for this blockconsole.log('Hello?')console.log('Sorry, do you know what line I am on?')console.log('Greetings from line 5!')console.log('I am on line 6')This article is currently in a draft state and is not published. Therefore, it will not be visible to the general audience. The content is still a work in progress and may require further editing and review.
When the article is ready for publication, you can update the “draft” field to “false” in the Frontmatter:
---title: Draft Examplepublished: 2024-01-11T04:40:26.381Ztags: [Markdown, Blogging, Demo]category: Examplesdraft: false---Footnote text goes here. ↩
+{item.images ? '[图片]' : item.content}
-- {bannerConfig.text.subtitle} -
- )} -{startDateChinese}-{targetDateChinese}
- -- {album.description} -
- - -{image.description}
- )} - {image.tags && image.tags.length > 0 && ( -
- Hello 👋 I'm Allen2030
-- Allen2030 blog -
-记录生活中的美好瞬间
- - {albums.length > 0 ? ( -暂无相册内容
-{album.description}
-记录观看的番剧、电影等内容
- - -- {item.description} -
- - -Ech0 API智能获取
- -to