{"_id":"@5ime/likeme","_rev":"5-ccce5295e1dab3b3ecd83e036644096e","name":"@5ime/likeme","dist-tags":{"latest":"1.0.4"},"versions":{"1.0.0":{"name":"@5ime/likeme","version":"1.0.0","_id":"@5ime/likeme@1.0.0","maintainers":[{"name":"iami233","email":"me@5ime.cn"}],"dist":{"shasum":"68989033dd3069068676a8f54e2fd39f7f38ae8c","tarball":"https://registry.npmjs.org/@5ime/likeme/-/likeme-1.0.0.tgz","fileCount":6,"integrity":"sha512-u8CAI+xt6DSuClWiOVaO9pZOrgZZWrxWTPn1vlbDzw31tID7av2whIi8ZwZUsFelBwJU4Klr8nZBu+SliPu3zg==","signatures":[{"sig":"MEQCIGxt5o9KT1VGcJjMxNDaxwbOZXtXol91cq9Z+iCqJ0JMAiAdiPqJF86H5PESF8cL32lcqceHyVFCZuo3AsyjqiEh9g==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":7682,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJixk27ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo/sQ/+NYv8WmtJsKrhcUYn0Rr4aMm53qApfcKuxUuTPAOkfBFRr94I\r\nwSElxs+X/1EOB9bEEPy0dIOT7v1efN0fxDrImYgb4Bdk6Ps4psRdPiXJ/ZXs\r\nE50Fkx4oaXGF7FpwjJllEuJtkaRZVyfNW4NUDRh2Mg9ph5b3UiprUQpQJZY+\r\nAw9Yet1w5HmbZu3UPdRXcDZy/p6p+Goe2nXy9bXfwE6SzrDDjErRIJe2BJkY\r\n/L4FS13f0nAqAxuIzyhDf5CD5AzI/MuXfYBsfwbNZlFkhgpvG6xgh7AsBfCv\r\nSAet2sNODJYV0YUwkvnTaJxrIGEjFVPtCAJWYjpOoPVQBmzjI//hNcsPcFgx\r\n5v48dt7pFh832Z00g1rvfPid9/Lz2/sxb8K7k1ELeyodg+0NHRvHNZky8jXW\r\nmNv128a7lu53gttQSmTHfYBs5TgiOd8OKQGuhKaO5KAcc/eoQIARBpkvlqsZ\r\nrmpAWFkd+RVoWCiqNNaOKkoY2hXMATC9QJ4QuU323lyVL6I2Cc+3zEwQ7fOL\r\nbp4in8X1XKiaeYgBYFyK1sD2EsQ3GuKepCjNhI1UL8T1kCLPK66RzvqgHcz1\r\nL7P9FJbKkv4cl451NF/i/OAly/FHEevdqo8D0Fd4OzDrpZULmp0HhlzplJ5H\r\nzRuxFFrSnHyYpkhyN3r+r3KD2+oP/VQjMzY=\r\n=euUn\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","_npmUser":{"name":"iami233","email":"me@5ime.cn"},"_npmVersion":"8.13.2","description":"Do you like me?","directories":{},"_nodeVersion":"12.22.7","dependencies":{"express":"^4.18.1","leancloud-storage":"^4.12.3"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/likeme_1.0.0_1657163194724_0.39706168062892555","host":"s3://npm-registry-packages"}},"1.0.1":{"name":"@5ime/likeme","version":"1.0.1","_id":"@5ime/likeme@1.0.1","maintainers":[{"name":"iami233","email":"me@5ime.cn"}],"dist":{"shasum":"6a89ed78afee5aa7f9d46de0c00262403c388287","tarball":"https://registry.npmjs.org/@5ime/likeme/-/likeme-1.0.1.tgz","fileCount":6,"integrity":"sha512-tRZ219xHN415uNpvA9FE+3bK/uT/LHNv+qGHZnxFExBrpnCyN7z5cWiuhEUXzrod0jREQyRJy2/pDwZN4Qc9bg==","signatures":[{"sig":"MEUCIQDpLMuITr+Ol0xRbT68j5EGJ8o8dNGtoh28kukf2AgiBAIgRyFRrstg7vPjavO7ZpOlyOdOjmHP0oRqXZFpuHTIBNg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":7688,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJixk4kACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmruig/+MSiIAs3KWGomcSAX1M+62sYo1Y0aqDTO3Z4mHKcWT1x2wlxl\r\nReVz/CTmKSKSy0ceHQMB6k1SPNXA+vvf3CQhiQmBXGMnSuahjmZgIiNaGgmd\r\nsh4bIemSh6OBdckXt6xLejp1FqrAMKHrE8nZn4H44l8o9LPZBOz0LCmgouIt\r\nuB1AHnzgLW1oubIQCspDTlBX/LL6KLnrL8nBCNlZjUYlwElXkPamWdSdPQns\r\n5j7qUGJNN1ExqYjC/0/ID5q7XhdCOr1mhDdt313zC5F2+lBxR394BmKxNgrs\r\nfbZvOV2HFULgKIPjirktvRRsdNFF0KQHuWIsr0VkgR5OisjGLzTK5n1gKwlR\r\n+aghHAeCQapP5LPrUEuX8nQFkXS2LGxnglpW+t+JZM1jCIID0awhRAXg0fjz\r\n3fJsgWJ89irQHQtPD/fJek49BeZyLtZX3N+UzfODm60TjaOKecVPWD0XAgIb\r\nTkZqAGH8y9jzWeDZi8RKOZ2/Fy9Q5KL/iyIrGjmgQOPVoABY35Rtc+YPKlQy\r\ni2gFeZy0957oYCqTUrWabEJj1iJAM7uQbGSKEnhPK6HCTo6DzVfaTRTC/MZy\r\ngX+L8dfOXj6UoTLsnWH50obKrD9z3xs/+eiSFVTbGqWZmiHrcDm75vbK39tE\r\npAflF/nxHxtB7ZXl8qOH4um4DGZsXmPBP58=\r\n=GW0U\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","_npmUser":{"name":"iami233","email":"me@5ime.cn"},"_npmVersion":"8.13.2","description":"Do you like me?","directories":{},"_nodeVersion":"12.22.7","dependencies":{"express":"^4.18.1","leancloud-storage":"^4.12.3"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/likeme_1.0.1_1657163300608_0.9322012932607098","host":"s3://npm-registry-packages"}},"1.0.2":{"name":"@5ime/likeme","version":"1.0.2","_id":"@5ime/likeme@1.0.2","maintainers":[{"name":"iami233","email":"me@5ime.cn"}],"dist":{"shasum":"60c911e3556e9945d86d42d0ec00abfdedd39137","tarball":"https://registry.npmjs.org/@5ime/likeme/-/likeme-1.0.2.tgz","fileCount":8,"integrity":"sha512-Lk70lKu7GePhExq0ujCxGcm9xDoLpXsyWy/LFbxCsZLAncJSQnH5hNRmpmHV576ioQp51/pjwNjS/xm4QynRMA==","signatures":[{"sig":"MEQCIG2O9YA9ew+niQo9a7gdd7HLfXdl6HhDLiu5t3v9HJbxAiAd8YiYJr5lCbf/2FJFNnsO4Ekxh/YMJpA3NS45kGs3uA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":8595},"main":"index.js","gitHead":"2f7b31d39822602249e898d807dbe19873b1edb7","_npmUser":{"name":"iami233","email":"me@5ime.cn"},"_npmVersion":"8.19.4","description":"Do you like me?","directories":{},"_nodeVersion":"16.20.2","dependencies":{"express":"^4.18.1","leancloud-storage":"^4.12.3"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/likeme_1.0.2_1736924522945_0.052151212220734156","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@5ime/likeme","version":"1.0.3","author":{"name":"iami233"},"license":"MIT","_id":"@5ime/likeme@1.0.3","maintainers":[{"name":"iami233","email":"me@5ime.cn"}],"homepage":"https://github.com/5ime/likeMe","bugs":{"url":"https://github.com/5ime/likeMe/issues"},"dist":{"shasum":"fe1ae517a08c6eae6634dd7fa3a8174a4fffbe66","tarball":"https://registry.npmjs.org/@5ime/likeme/-/likeme-1.0.3.tgz","fileCount":8,"integrity":"sha512-MQg/h+0FY/71I/KPmQS9SEAcEUHnbRprk7CwXbZ7YsY3xU3tH62dhe6m4yRdSuyL/llop2REi2nQ3WuA1/T1OA==","signatures":[{"sig":"MEQCIFTzSEWra6gGc79PUv9dNxW1zOvzvHuHAADnt6jplESlAiAFKQy8s8VUGq/0uLIAf3/Lht+ltc2ooQJj13RYvofeWw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15039},"main":"index.js","engines":{"node":">=18.0.0"},"gitHead":"2f7b31d39822602249e898d807dbe19873b1edb7","scripts":{"start":"node index.js"},"_npmUser":{"name":"iami233","email":"me@5ime.cn"},"repository":{"url":"git+https://github.com/5ime/likeMe.git","type":"git"},"_npmVersion":"10.9.2","description":"Do you like me? - 一个可爱的互动小组件","directories":{},"_nodeVersion":"20.12.2","dependencies":{"express":"^5.1.0","leancloud-storage":"^4.15.2"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/likeme_1.0.3_1752649022075_0.466890778826053","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@5ime/likeme","version":"1.0.4","description":"Do you like me? - 一个可爱的互动小组件","main":"index.js","scripts":{"start":"node index.js","dev":"node index.js"},"author":{"name":"iami233"},"license":"MIT","dependencies":{"@vercel/postgres":"^0.10.0","express":"^5.1.0"},"engines":{"node":">=18.0.0"},"repository":{"type":"git","url":"git+https://github.com/5ime/likeMe.git"},"homepage":"https://github.com/5ime/likeMe","gitHead":"179d17f736942363d8f69589c57ae384e27fa964","_id":"@5ime/likeme@1.0.4","bugs":{"url":"https://github.com/5ime/likeMe/issues"},"_nodeVersion":"22.16.0","_npmVersion":"11.8.0","dist":{"integrity":"sha512-uC3LHUv7MlqnfZUjoYQSm3teQms6bwu1fPd/KxzaN9rkLzlM4QujE9zeHXU+OWvQNXcce9tpHjzwwglQ83XGXA==","shasum":"f32900c71139caa8bdffeebb01293cbe83ed6512","tarball":"https://registry.npmjs.org/@5ime/likeme/-/likeme-1.0.4.tgz","fileCount":16,"unpackedSize":19464,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFb/kd8tpfDk0SN+W1NvIvPOS7I5j/5wzgz+iIFS0iryAiEA0Wxv2ZPi/nOlIGb/blHcGNirnDeF/o4AOduW8+AexIE="}]},"_npmUser":{"name":"iami233","email":"me@5ime.cn"},"directories":{},"maintainers":[{"name":"iami233","email":"me@5ime.cn"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/likeme_1.0.4_1773829445381_0.8816464153262404"},"_hasShrinkwrap":false}},"time":{"created":"2022-07-07T03:06:34.673Z","modified":"2026-03-18T10:24:05.775Z","1.0.0":"2022-07-07T03:06:34.968Z","1.0.1":"2022-07-07T03:08:20.800Z","1.0.2":"2025-01-15T07:02:03.093Z","1.0.3":"2025-07-16T06:57:02.253Z","1.0.4":"2026-03-18T10:24:05.642Z"},"bugs":{"url":"https://github.com/5ime/likeMe/issues"},"author":{"name":"iami233"},"license":"MIT","homepage":"https://github.com/5ime/likeMe","repository":{"type":"git","url":"git+https://github.com/5ime/likeMe.git"},"description":"Do you like me? - 一个可爱的互动小组件","maintainers":[{"name":"iami233","email":"me@5ime.cn"}],"readme":"# likeMe - 一个可爱的互动点赞组件\n\n快速给你的网站加一个「你喜欢我吗 / Do you like me」小组件。服务端可部署在 Vercel，点赞数据存 Vercel Postgres（Neon）。\n\n## 功能特性\n\n- 🎨 简洁可爱的 UI 设计\n- 🚀 一键部署到 Vercel\n- 💾 数据存储在 Vercel Postgres（Neon）\n- 🔒 防刷机制：同一 IP 每天只能点赞一次\n- ⚡ 自动缓存优化，减少数据库查询\n- 📦 支持 CDN 和本地文件两种使用方式\n- 🎯 支持自定义主题颜色\n\n## 一键部署\n\n[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/5ime/likeMe)\n\n1. 点击上方按钮跳转至 **Vercel** 进行部署\n2. 输入一个你喜欢的 Vercel 项目名称并点击 **Create**\n3. 等待部署完成\n4. 点击 **Go to Dashboard** 跳转到控制台\n\n## 配置数据库\n\n本项目使用 Vercel Postgres（底层是 Neon）。你只需要在 Vercel 给当前项目绑定数据库，并确保环境变量里存在 `POSTGRES_URL`。\n\n### 1. 在 Vercel 创建并绑定数据库\n\n1. 打开你的 Vercel 项目\n2. 进入 **Storage**\n3. 点击 **Create Database**，选择 **Neon**\n4. 选择要绑定到的项目（通常就是当前项目）并创建\n\n### 2. 确认环境变量已注入\n\n创建完成后，Vercel 通常会自动把数据库连接信息注入到项目环境变量中。\n\n- 进入 **Settings > Environment Variables**\n- 搜索并确认存在：`POSTGRES_URL`\n\n如果没有自动注入，请手动添加：\n\n1. 进入 **Storage > Postgres 数据库详情页**\n2. 找到连接字符串（Connection String），复制 `POSTGRES_URL` 对应的值\n3. 回到 **Settings > Environment Variables**，新增变量：\n   - **Name**：`POSTGRES_URL`\n   - **Value**：你复制的连接字符串\n   - **Environments**：勾选 `Production / Preview / Development`\n4. 保存后到 **Deployments** 点击 **Redeploy**（或触发一次新的部署），让最新环境变量生效\n\n### 3. 如何验证数据库已可用\n\n最简单的方式：访问一次接口触发建表，然后再看是否能正常返回。\n\n- `GET /healthz`：服务是否存活（返回 `ok`）\n- `GET /info`：会读取数据库并返回当前点赞数\n\n如果数据库连不上，你通常会在 Vercel 的 **Logs** 里看到与连接/鉴权相关的报错（例如环境变量缺失、连接串无效等）。\n\n> 本项目会在首次请求时自动建表（`like_count` / `like_user`），无需手动建表。\n\n## 在你的网站中使用\n\n### 方法一：使用 CDN\n\n在你的网页中添加以下代码：\n\n```html\n<link rel=\"stylesheet\" href=\"https://unpkg.com/@5ime/likeme@latest/static/css/likeme.css\" />\n<script src=\"https://unpkg.com/@5ime/likeme@latest/static/js/likeme.js\"></script>\n\n<div id=\"likeme\"></div>\n\n<script>\n    likeMe({\n        el: '#likeme',\n        serverURL: 'https://your-domain.vercel.app', // 替换为你的服务端地址，结尾勿带 /\n        color: '#ff9797' // 可选：自定义主题颜色\n    });\n</script>\n```\n\n### 方法二：下载使用\n\n1. 下载 `static/css/likeme.css` 和 `static/js/likeme.js`\n2. 在你的项目中引入这些文件\n3. 按照上面的方式初始化组件\n\n### 配置选项\n\n```javascript\nlikeMe({\n    el: '#likeme',                                  // 必需：容器选择器\n    serverURL: 'https://your-domain.vercel.app',    // 必需：服务端地址，结尾勿带 /\n    color: '#ff9797'                                // 可选：主题颜色，默认为 #ff9797\n});\n```\n\n## 本地开发\n\n环境：Node.js >= 18\n\n```bash\nnpm install\n```\n\n创建 `.env`：\n\n```bash\nPOSTGRES_URL=postgres://...\nPORT=3000\nALLOW_ORIGIN=*\nTRUST_PROXY=1\nINFO_CACHE_SECONDS=5\nLIKE_RATE_LIMIT_WINDOW_MS=60000\nLIKE_RATE_LIMIT_MAX=20\n```\n\n启动项目：\n\n```bash\nnpm start\n```\n\n- `PORT` 可选，默认 `3000`\n- `ALLOW_ORIGIN` 可选，默认 `*`（如需限制跨域可填你的站点域名）\n- `TRUST_PROXY` 默认 `1`，用于正确识别客户端 IP。\n- `/info` 默认缓存 5 秒；`/like` 默认每 IP 每分钟 20 次。\n\n## API 接口\n\n### `GET /info`\n\n获取当前点赞数。\n\n**响应格式：**\n\n成功：\n```json\n{\n  \"code\": \"200\",\n  \"msg\": \"success\",\n  \"data\": {\n    \"count\": 123\n  }\n}\n```\n\n失败：\n```json\n{\n  \"code\": \"201\",\n  \"msg\": \"哎呀，数据偷懒跑掉了\"\n}\n```\n\n**缓存：** 响应头包含 `Cache-Control: public, max-age=5`（默认缓存 5 秒）\n\n### `GET /like`\n\n提交一次点赞。同一 IP 每天只能点赞一次。\n\n**响应格式：**\n\n成功（首次点赞）：\n```json\n{\n  \"code\": \"200\",\n  \"msg\": \"success\",\n  \"data\": {\n    \"count\": 124\n  }\n}\n```\n\n失败（今日已点赞）：\n```json\n{\n  \"code\": \"201\",\n  \"msg\": \"今天的爱意已经收到啦~\"\n}\n```\n\n失败（系统错误）：\n```json\n{\n  \"code\": \"201\",\n  \"msg\": \"你的爱意传递失败~\"\n}\n```\n\n**限流：** 默认每 IP 每分钟最多 20 次请求\n\n### `GET /healthz`\n\n健康检查接口，用于检测服务是否正常运行。\n\n**响应：** 纯文本 `ok`（HTTP 200）","readmeFilename":"README.md"}