# website **Repository Path**: iNick/website ## Basic Information - **Project Name**: website - **Description**: 网站代码 https://nick.xin - **Primary Language**: HTML - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-01-17 - **Last Updated**: 2026-08-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Nick的小站 Nick 的三花猫主题个人静态网站,在线地址:[https://nick.xin](https://nick.xin)。网站用于集中展示技术博客、公开项目、在线工具和友情链接。 `static/` 中的站点使用原生 HTML、CSS 和 JavaScript 编写,页面不依赖后端、数据库或构建步骤。TOTP、二维码生成、二维码识别、MD5、BCrypt、RSA 兼容加密、AES 兼容模式和 ZIP 分别使用随站点本地发布的 OTPAuth、qrcode-generator、jsQR、SparkMD5、bcryptjs、node-forge、CryptoJS 与 fflate,不依赖外部 CDN。 ## 页面组成 ```text static/ ├── index.html # 首页 ├── projects.html # 项目列表 ├── tools.html # 在线工具目录 ├── tools/ │ ├── totp.html # TOTP 动态验证码生成器 │ ├── batch-totp.html # 批量 TOTP 动态验证码 │ ├── md5.html # MD5 文本摘要生成器 │ ├── uuid-random.html # UUID 与随机字符生成 │ ├── base64.html # Base64 文本编码与解码 │ ├── base64-file.html # Base64 与任意文件互转 │ ├── base64-image.html # Base64 与图片互转 │ ├── qr-code.html # 二维码图片/截图识别与文字生成 │ ├── png-compressor.html # PNG、JPEG、WebP 图片压缩 │ ├── bcrypt.html # BCrypt 哈希生成与密码校验 │ ├── rsa.html # RSA-OAEP、PKCS#1 v1.5 加解密与 PEM 密钥生成 │ ├── aes.html # AES 六种常用模式加解密与密钥生成 │ ├── credential-converter.html # 旧转换地址,跳转到统一页面 │ ├── session-converter.html # 统一凭证格式转换 │ ├── json-batch.html # JSON 拆分与组合 │ ├── email-token.html # 邮箱 Token 文本导出 │ ├── relogin-checker.html # 重登资料本地检查 │ ├── model-account-checker.html # 账号模型批量检测 │ ├── certificate-inspector.html # HTTPS 证书获取与解析 │ ├── certificate-monitor.html # HTTPS 证书到期监控 │ └── backend-settings.html # 后台 API 来源设置 ├── links.html # 友情链接 ├── css/ │ ├── index.css # 全站基础样式和首页样式 │ ├── links.css # 友链、项目列表样式 │ ├── tools.css # 工具目录样式 │ ├── tool-detail.css # 工具详情页共享样式 │ ├── totp.css # TOTP 工具专属样式 │ ├── md5.css # MD5 工具专属样式 │ ├── base64.css # Base64 工具共享样式 │ ├── qr-code.css # 二维码识别与生成工具样式 │ ├── uuid-random.css # UUID 与随机字符工具样式 │ ├── bcrypt.css # BCrypt 工具专属样式 │ ├── data-tools.css # 数据类工具共享样式 │ ├── png-compressor.css # 图片压缩工具专属样式 │ ├── certificate-tools.css # 证书工具共享样式 │ ├── model-checker.css # 账号模型检测样式 │ ├── backend-settings.css # 后台来源设置样式 │ └── crypto-tools.css # RSA、AES 工具共享样式 ├── js/ │ ├── projects_data.js # 项目数据 │ ├── projects.js # 项目列表渲染逻辑 │ ├── links_data.js # 友链数据 │ ├── links.js # 友链列表渲染逻辑 │ ├── site-meta.js # 全站版本号、页脚与返回顶部按钮 │ ├── backend-api.js # 后台 API 来源读取与路径拼接 │ ├── backend-settings-form.js # 后台来源设置表单 │ ├── tool-utils.js # 工具共享的文件、复制、下载和 JSON 能力 │ ├── totp.js # TOTP 页面交互与倒计时 │ ├── md5.js # MD5 文本摘要交互 │ ├── uuid-random-core.js # UUID 与随机字符生成核心 │ ├── uuid-random.js # UUID 与随机字符页面交互 │ ├── base64-core.js # Base64 UTF-8、二进制和 data URL 核心 │ ├── base64.js # Base64 文本页面交互 │ ├── base64-file.js # Base64 文件页面交互 │ ├── base64-image.js # Base64 图片页面交互 │ ├── qr-code-core.js # 二维码尺寸、生成与识别核心 │ ├── qr-code.js # 二维码页面与屏幕截图交互 │ ├── png-compressor-core.js # 图片格式、算法兼容与编码参数 │ ├── png-compressor.js # 多格式图片压缩页面交互 │ ├── certificate-core.js # 证书工具共享规则与请求 │ ├── certificate-inspector.js # 证书获取与解析页面交互 │ ├── certificate-monitor.js # 证书监控页面交互 │ ├── model-account-checker.js # 账号模型检测页面交互 │ ├── bcrypt-core.js # BCrypt 输入边界与算法调用 │ ├── bcrypt.js # BCrypt 页面交互 │ ├── crypto-core.js # RSA、AES 共用 Web Crypto 与密钥格式能力 │ ├── rsa.js # RSA 页面交互 │ ├── aes.js # AES 页面交互 │ ├── credential-converter-core.js # 凭证解析与转换核心 │ ├── credential-hub-core.js # 专用与通用转换规则调度 │ ├── session-converter.js # 统一凭证转换页面交互 │ └── vendor/ # 本地发布的第三方库及许可证 └── images/ # 三花猫主视觉、头像和站点图片 ``` 仓库根目录的 `deploy-console/` 是本机双平台发布工具,不属于 `static/` 网站产物,不会上传到 Pages。 仓库根目录的 `backend/` 是独立部署的 Go 后台 API,不属于静态网站发布产物。当前包含健康检查、HTTPS 证书查询和受控账号模型检测代理,部署方式、接口和安全边界见 [后台 API 说明](backend/README.md)。 ## 本地预览 页面全部使用相对路径,可以直接双击打开 `static/index.html`。更推荐使用本地 HTTP 服务预览,浏览器行为会更接近线上环境,也能避免部分 `file://` 限制。 在项目根目录执行: ```powershell python -m http.server 8000 --directory static ``` 浏览器访问 [http://localhost:8000](http://localhost:8000)。结束预览时,在终端按 `Ctrl+C`。 如果 `python` 命令不可用,可以改用 Windows 常见的启动器: ```powershell py -m http.server 8000 --directory static ``` 需要本机安装 Python 3。如果没有 Python,也可以使用任意静态文件服务器直接托管 `static` 目录。 ### 本地后台工具 证书检查、证书监控和模型账号检测需要 Go 后台 API。仓库提供两种 Windows 启动脚本: #### 单进程模式 由 Go 同时托管 `static` 页面和 `/api/v1/` 接口: ```powershell .\start-backend-static.cmd ``` 访问 [http://127.0.0.1:8080](http://127.0.0.1:8080)。页面和 API 同源,“后台接口设置”保持为空或选择“恢复同源”即可。结束时在终端按 `Ctrl+C`。 #### 分进程模式 由 `npx` 托管静态页面,Go 单独运行后台 API: ```powershell .\start-local.cmd ``` 脚本会打开一个新的 Go 后台窗口,并在当前窗口启动静态服务。访问 [http://127.0.0.1:8765](http://127.0.0.1:8765),进入“后台接口设置”,将后台来源地址填写为 `http://127.0.0.1:8080` 并保存。结束时关闭两个窗口,或分别按 `Ctrl+C`。 `start-local.cmd` 首次运行可能需要通过 `npx` 下载本地 `http-server`;没有网络时可改用上面的 Python 命令,并在另一个终端运行 `start-backend.cmd`。 ## 内容维护 ### 修改首页 编辑 `static/index.html`。首页中的博客地址、Gitee 地址、交流群和介绍文字都在该文件内。 ### 新增项目 在 `static/js/projects_data.js` 的 `project_list` 数组中追加: ```javascript { 'title': '项目名称', 'url': 'https://example.com' } ``` ### 新增友链 在 `static/js/links_data.js` 的 `links_list` 数组中追加: ```javascript { 'title': '站点名称', 'url': 'https://example.com', 'img': 'https://example.com/avatar.png' } ``` 友链头像保存在 `static/images/links/`,页面打开时不会请求外部图片服务。历史头像无法下载或本地图片加载失败时,会使用 `static/images/avatar.png` 作为备用图片;友链网址仅在用户点击后打开。 ### 在线工具 `static/tools.html` 只展示工具目录,每个工具使用单独页面,便于后续继续增加工具,而不会让目录页加载无关的表单、脚本和算法库。 - `static/tools/totp.html` 接受或随机生成 Base32 密钥,可以根据服务名称和账户名称生成标准 `otpauth://` 地址,并在弹框中展示供移动设备扫描的二维码。密钥只保存在当前页面内存中,不写入页面 URL、日志或浏览器存储;二维码弹框关闭后会清空地址与图片。TOTP 和二维码分别由 OTPAuth 9.5.1 与 qrcode-generator 1.4.4 提供,许可证位于 `static/js/vendor/OTPAUTH-LICENSE.md` 和 `static/js/vendor/QRCODE-GENERATOR-LICENSE.txt`。 - `static/tools/md5.html` 提供 UTF-8 文本 MD5 摘要,支持大小写切换。MD5 仅适合普通内容校验,不应用于密码存储或安全签名。该页面只加载 SparkMD5 3.0.2,许可证位于 `static/js/vendor/SPARK-MD5-LICENSE.txt`。 - `static/tools/uuid-random.html` 在浏览器本地生成 UUIDv1、UUIDv4、UUIDv7 和随机字符。UUIDv1 使用随机节点字段,UUIDv7 包含毫秒时间戳;随机字符支持预设或自定义字符集。结果只保留在当前页面内存中,可复制或下载为 TXT。 - `static/tools/base64.html` 提供 UTF-8 文本 Base64 编码与解码,输入和结果只保留在当前页面内存中。 - `static/tools/base64-file.html` 支持任意二进制文件与 Base64 互转,可输出 data URL、复制或下载 Base64 文本;文件不会上传。 - `static/tools/base64-image.html` 支持图片与 Base64 data URL 互转,解码后会先用浏览器实际加载预览,再允许下载;图片不会上传。 - `static/tools/qr-code.html` 在一个页面内提供二维码识别与生成。识别支持 PNG、JPEG、WebP、GIF、BMP 上传,也可在用户明确授权后截取所选屏幕或窗口的一帧;截帧后立即停止共享,图片和识别结果不会上传或写入浏览器存储。文字使用本地 qrcode-generator 1.4.4 生成可下载的 PNG,图片使用本地 jsQR 1.4.0 识别;许可证位于 `static/js/vendor/QRCODE-GENERATOR-LICENSE.txt` 和 `static/js/vendor/JSQR-LICENSE.txt`。屏幕截图需要 HTTPS 或本机 HTTP 环境,浏览器拒绝授权时仍可使用图片上传。 - `static/tools/png-compressor.html` 支持 PNG、JPEG 和 WebP,使用本地 Oxipng 2.3.0、MozJPEG 3.3.1 与 libwebp 1.1.0 WebAssembly 编码。页面可选择无损或有损算法,也可串行运行当前图片兼容的全部算法,并从原图和结果中任选下载;图片不会上传,动画图片会被拒绝,重新编码会移除 EXIF、ICC 和 XMP 等元数据。jSquash 胶水代码采用 Apache-2.0,许可证位于 `static/js/vendor/JSQUASH-JPEG-LICENSE.txt`、`static/js/vendor/JSQUASH-WEBP-LICENSE.txt`、`static/js/vendor/OXIPNG-LICENSE.txt`、`static/js/vendor/MOZJPEG-CODEC-LICENSE.md` 和 `static/js/vendor/WEBP-CODEC-LICENSE.md`。This software is based in part on the work of the Independent JPEG Group. - `static/tools/bcrypt.html` 使用本地 bcryptjs 3.0.3 生成 BCrypt 哈希并校验密码,支持 `$2a$`、`$2b$` 和 `$2y$` 哈希。页面拒绝超过 BCrypt 72 UTF-8 字节边界的密码,避免静默截断;输入不会写入 URL、日志或浏览器存储,离开页面时会清空敏感引用。许可证位于 `static/js/vendor/BCRYPTJS-LICENSE.txt`。 - `static/tools/rsa.html` 使用浏览器 Web Crypto 和本地 node-forge 1.3.1 提供 RSA-OAEP、RSAES-PKCS1-v1_5 文本加密和解密,可选择 SHA-1、SHA-256、SHA-384、SHA-512 以及 512、1024、2048、3072、4096 位密钥。页面生成标准 SPKI 公钥和 PKCS#8 私钥 PEM,内容不写入 URL、日志或浏览器存储,离开页面时清空。node-forge 许可证位于 `static/js/vendor/NODE-FORGE-LICENSE.txt`。 - `static/tools/aes.html` 使用浏览器 Web Crypto 和本地 CryptoJS 4.2.0 提供 AES-GCM、AES-CBC、AES-CTR、AES-CFB、AES-OFB、AES-ECB 文本加密和解密,支持 128、192、256 位密钥;密钥和密文/随机向量均可在 Base64(默认)与 HEX 之间独立切换。除 ECB 外,每次加密自动生成新的随机向量并单独输出;只有 GCM 包含完整性校验,其他模式只提供保密性。所有内容只保留在当前页面内存,离开页面时清空。CryptoJS 许可证位于 `static/js/vendor/CRYPTO-JS-LICENSE.txt`。 - `static/tools/session-converter.html` 是统一凭证转换入口,页面按“输入凭证 → 转换设置 → 输出凭证”排列。输入格式默认自动识别,也可以手动指定并校验;输出格式按通用、GPT 和 Claude 三组平铺展示。CPA/sub2api 转换优先使用专用规则,保留 XAI/Grok、Antigravity 和旧 Gemini 等平台字段;其他格式通过 GPT/Claude 统一账号模型转换。GPT 与 Claude 不能跨服务互转,缺失的 Token、权限和账号字段不会被虚构。旧地址 `static/tools/credential-converter.html` 会跳转到该页面。 - 凭证转换支持粘贴、多文件、NDJSON、连续 JSON、复制及 ZIP 下载。过程不会请求网络或写入浏览器存储,并主动丢弃代理地址、账号、密码和 `proxy_key`。ZIP 由本地 fflate 0.8.2 生成,许可证位于 `static/js/vendor/FFLATE-LICENSE.txt`。 - `static/tools/json-batch.html` 拆分数组或 `accounts` / `auths` 包装 JSON,也可以把多个 JSON 文件组合为数组或指定包装结构。 - `static/tools/email-token.html` 从本地凭证中导出邮箱与 access / refresh token 文本;页面预览默认遮罩,下载内容按用户选择保留完整 Token。 - `static/tools/batch-totp.html` 接受多行 Base32、`账号----密钥` 或 `otpauth://` 数据并同时生成动态验证码,表格不会回显原始密钥。 - `static/tools/relogin-checker.html` 只检查邮箱、密码、MFA 和收件箱地址是否齐全,不执行登录,不连接远端代理;下载的报告不包含密码、MFA 或 Token 原文。 - `static/tools/model-account-checker.html` 通过同源 `/api/v1/` Go 后台读取白名单内的账号分页,并以 SSE 批量检测指定模型。页面只在用户点击“保存配置”后,将 Base URL、Token 和模型写入当前浏览器的 LocalStorage;“清除配置”会同时删除存储并清空当前页面。部署前必须在 `backend/config.json` 配置允许的目标后台来源,并把网站 `/api/` 反向代理到 Go 服务。 - `static/tools/certificate-inspector.html` 通过同源 Go 后台获取公网 HTTPS 站点提供的叶子和中间证书,展示并复制标准 PEM、证书链校验结果及完整公开字段;也可以粘贴一个或多个 PEM 证书块解析。证书正文不写入浏览器存储,页面离开时清除。 - `static/tools/certificate-monitor.html` 把用户明确添加的域名清单保存在当前浏览器,可查询域名、按每页 10 条浏览,并单独或四并发批量检测全部域名、按剩余天数排序。检测结果只留在当前页面内存,不提供后台定时巡检或到期通知。 - `static/tools/backend-settings.html` 统一保存需要 Go 后台的工具所使用的 API 来源地址。空配置默认请求当前站点的 `/api/v1/`;独立后台必须使用 HTTPS,本机开发可使用 loopback HTTP。证书工具也提供同一设置的就地入口,账号模型检测会直接读取这份共享配置。 这些页面共用 `static/js/tool-utils.js` 提供的文件读取、拖放、剪贴板、JSON / NDJSON / 连续 JSON 解析、文件名清理以及 JSON / ZIP 下载能力。业务核心仍按工具拆分,避免公共模块承担格式转换等专属逻辑。除账号模型检测按用户主动操作保存连接配置外,其他凭证类页面都不会把输入写入 URL、日志、LocalStorage 或 SessionStorage,并会在页面离开时清空敏感内存。 ### 更新站点版本 修改 `static/js/site-meta.js` 中的 `siteVersion`。所有页面共用该脚本,版本号会自动添加到页脚,无需分别修改 HTML。 ## 主题素材 - `static/images/assistant/calico-mascot.webp`:首屏使用的完整三花猫与终端插画 - `static/images/assistant/dianshin-walk.png`:点心的 8 方向行走精灵图 - `static/images/assistant/dianshin-pose.png`:点心的待机与拖拽精灵图 - `static/images/avatar.png`:导航和友链备用头像 - `static/dianshin-favicon.ico`:点心站点图标 这些素材均随项目本地发布,页面运行时不依赖外部图片服务。 首页、项目页和友链页会加载 `static/js/assistant.js`。点心会在视口内短距离漫游,可以使用鼠标或触屏拖动;单击点心可以暂停或恢复。系统开启“减少动态效果”或页面进入后台时,动画循环会停止。工具页不加载浮动助手,避免遮挡验证码和操作按钮。 ## 部署 部署产物就是 `static` 目录,无需执行打包命令。将该目录中的文件完整发布到 Nginx、Apache、对象存储静态托管或 Pages 服务的网站根目录即可。 ### 本地后台 安装 Go 1.22 或更高版本后,Windows 下可双击仓库根目录的 `start-backend.cmd` 启动后台 API。程序默认读取 `backend/config.json` 并监听 `8080` 端口;配置字段、接口和构建方式见 [后台 API 说明](backend/README.md)。 ### 本地发布控制台 Windows 下可双击仓库根目录的 `start-deploy-console.cmd`,或在 PowerShell 中执行: ```powershell node deploy-console/server.cjs ``` 程序只监听 `127.0.0.1`,默认打开 [http://127.0.0.1:17880](http://127.0.0.1:17880);端口被占用时会依次尝试到 `17889`。页面可以修改 `static/js/site-meta.js` 的展示版本、填写发布说明、选择 ESA 或 Cloudflare、运行预检并在明确确认后发布生产环境。 Cloudflare Token 只在当前发布任务内存和 Wrangler 子进程环境中使用,页面和服务都不会持久化。控制台不提供域名增删、部署删除或自动回滚;完整安全边界和维护说明见 [本地发布控制台设计](docs/deployment-console.md),本地接口契约见 [本地 API 契约](docs/API_SPEC.md)。 ### 双平台同步发布 站点内容变更需要同时更新阿里云 ESA Pages 和 Cloudflare Pages 时,固定按以下顺序执行: 1. 在仓库根目录运行 `git status --short`、`git diff --check` 和 `node --test tests/*.test.cjs`。 2. 先发布阿里云 ESA 生产版本,记录版本 ID,并完成 `nick.xin` 的内容与 404 验证。 3. 再通过临时 `CLOUDFLARE_API_TOKEN` 发布 Cloudflare Pages,记录不可变部署地址,并完成 `inick-top.pages.dev` 的内容与 404 验证。 4. 两个平台都通过后,再把本次更新视为发布完成;任一平台失败时停止后续操作,并按对应手册独立回滚。 以上步骤可以通过本地发布控制台执行,也可以继续使用命令行。两个平台没有原子化的同步发布能力,不能假设一端成功会自动更新另一端。`static/404.html` 会随整个 `static/` 目录一同上传,不需要单独推送。完整命令、凭据边界、域名管理和回滚方式分别以 [阿里云 ESA Pages 发布手册](docs/esa-deployment.md) 和 [Cloudflare Pages 发布手册](docs/cloudflare-pages-deployment.md) 为准。 ### 阿里云 ESA Pages 仓库根目录的 `esa.jsonc` 将 ESA 项目名设为 `nick-xin`,跳过依赖安装和构建,只托管 `static` 目录,并使用 `404Page` 策略返回 `static/404.html` 和真实 HTTP 404。首次安装、登录、生产发布、线上验证、域名绑定和回滚的完整步骤见 [阿里云 ESA Pages 发布手册](docs/esa-deployment.md)。 日常更新时,在仓库根目录完成测试后显式发布到生产环境: ```powershell git diff --check node --test tests/*.test.cjs esa-cli deploy --environment production --description "更新站点内容:简要说明本次改动" esa-cli deployments list ``` 当前 ESA Pages 项目绑定 `nick.xin`、`www.nick.xin` 和 `blog.nick.xin`。AccessKey 和登录令牌只由本机 CLI 管理,不得写入仓库、配置文件或日志。 ### Cloudflare Pages Cloudflare Pages 项目名为 `inick-top`,生产分支为 `main`,同样直接上传 `static` 目录。Token 最小权限、安全输入、日常发布、404 验证和域名迁移边界见 [Cloudflare Pages 发布手册](docs/cloudflare-pages-deployment.md)。 完成测试并在当前 PowerShell 中临时设置 `CLOUDFLARE_API_TOKEN` 后执行: ```powershell git diff --check node --test tests/*.test.cjs npx wrangler pages deploy static --project-name inick-top --branch main --commit-dirty=true ``` Cloudflare Pages 会自动识别发布根目录的 `404.html`,不需要额外 SPA 或重写配置。默认项目域名为 `inick-top.pages.dev`;正式域名迁移完成前,不在文档中把 `inick.top`、`www.inick.top` 或 `blog.inick.top` 标记为已接管。 ### Linux 服务器 仓库中的 `update-website.sh` 用于当前 Linux 服务器: ```bash bash update-website.sh ``` 脚本会先拉取最新代码,再把 `static` 中的文件复制到 `/home/inick/web/nick_xin/`。在其他服务器使用前,请先把脚本中的目标路径修改为真实的网站根目录。脚本只覆盖同名文件,不会删除目标目录中已经废弃的旧文件。 ## 开发约定 - 项目协作规则见 `AGENTS.md`,开发约束见 `docs/development-conventions.md`,视觉与交互规范见 `docs/design-system.md` - 文件编码:UTF-8,无 BOM - 换行符:LF - 不提交构建产物;当前项目没有构建步骤 - 修改页面后至少检查首页、项目页、工具页、友链页及移动端布局 ## License 本项目使用 [MIT License](LICENSE)。