协议最新更新时间为:2025 年 2 月 19 日

当您访问本站时,默认您已知晓并允许本站收集您的信息,并明确且同意以下条款。若您不同意本协议的任何条款,请停止访问并关闭本站。

隐私政策

个人信息收集

在访问时

本站会收集以下信息

  • 访问次数访问信息(包括但不限于您的 IP 地址、运营商信息、国家与地区、访问来源、用户代理等信息)
  • 设备信息(如操作系统、浏览器版本等)
  • 访问来源(例如,从搜索引擎、社交媒体等渠道访问本站)
  • 访问过程(包括但不限于浏览时长、操作方式、浏览页面、性能与网络加载情况等)
  • 以上信息可能涉及通过第三方服务(如 Github Pages、Vercel、Netlify、Cloudflare 等)收集,具体详情请参考相关服务的隐私协议。

获取与使用方式

  • 第三方服务商(如 Github Pages、Vercel、Netlify、Cloudflare、MongoDB 等)收集和记录您的访问信息。本站无法确保这些第三方服务如何使用您的信息,请仔细查阅其隐私政策。

使用目的

本站会基于以下目的使用您的个人信息:

  1. 优化文章内容和网站性能;
  2. 监控和优化网站加载情况
  3. 分析访问和点击数据,以改善用户体验;
  4. 反恶意行为监测(包括针对网站的恶意访问和言论);
  5. 展示浏览数据(例如访问量统计);
  6. 搜索结果优化

在评论时

收集信息

当您使用评论功能时,本站将收集以下额外信息:

  • 邮箱、QQ 号(如果提供)、昵称、头像
  • IP 地址、浏览器用户代理、IP 归属地等信息

获取与使用方式

  • 使用 Twikoo 服务时,站点会收集您的昵称、邮箱、IP 归属地(精确到省级)、用户代理等信息。
  • 如果您提供了 QQ 号,系统会根据您的 QQ 邮箱或 QQ 号关联头像。

使用目的

本站将用于以下目的:

  1. 网站和文章的优化
  2. 监控访问情况,提高网站性能;
  3. 反恶意行为(包括针对评论的恶意内容);
  4. 在评论中展示您头像(如有提供);
  5. 评论时记录您的邮箱用于通知回复;
  6. IP 地址和浏览器信息用于反垃圾评论、定位问题等。

Cookies 与本地存储

  • 本站使用 Cookies 和 LocalStorage 来记忆用户偏好(如评论时填入的信息、深浅色模式选择等)以及统计信息(如访问量、用户行为等)。
  • 您可以随时清除浏览器中的 Cookies 和 LocalStorage 信息,这不会影响您正常使用本站。

用户权利

在我力所能及的范围内,您有权:

  • 请求访问您的个人数据;
  • 请求删除您的个人数据;
  • 撤回同意,我们将停止处理您的个人信息。

数据安全

我们采取必要的技术措施(如加密、访问控制等)保护您的个人信息免遭未经授权的访问、披露、修改或毁坏。然而,由于网络环境的开放性,无法绝对保证数据传输的安全。

适用法律与争议解决

本隐私政策适用于全球范围内的用户,但针对不同地区的用户,适用的法律法规可能有所不同。若有争议,将根据相关法律进行处理。

更新与通知

  • 站点有权随时更新本协议内容,更新后的协议将发布在本站上。用户继续使用本站即表示同意更新后的条款。

版权协议

版权归属

  • 本站大部分文章由 LynxCatTheThird 原创,版权归 LynxCatTheThird 所有,除非明确注明其他来源。

使用与转载

禁止的行为

  • 禁止在转载时故意删除修改文章中的版权信息。
  • 禁止以任何形式售卖本站的内容,禁止任何形式的收费阅读(如 “捐赠后获取全文”),以及强制或变相强制收费行为。

修改与再发布

  • 若您对本站内容进行修改或翻译,必须采用同样的 《知识共享署名 - 非商业性使用 - 相同方式共享 4.0 国际》协议 进行再发布。禁止歪曲原文意图或事实。

侵权责任

  • 如果您未遵守本版权协议,站点有权采取措施,包括但不限于向第三方平台请求删除您的文章撤回对您的使用授权等。必要时,本站保留诉诸法律追究其责任的权利。

适用法律与争议解决

  • 若本版权协议与相关法律存在冲突,以法律为准。

更新与通知

  • 站点有权随时更新本协议内容,更新后的协议将发布在本站上。用户继续使用本站即表示同意更新后的条款。

联系我们

如果您对本隐私政策有任何疑问,或希望行使您的数据权利(如请求删除数据),请通过以下方式联系博主:


评论
`],{type:"text/html;charset=utf-8"}),s=URL.createObjectURL(a);window.open(s,"_blank","noopener"),setTimeout(()=>URL.revokeObjectURL(s),5e3)})({source:n,initViewBox:e.__mermaidInitViewBox})}),t.__mermaidViewerBound=!0)},i=(e,t,n,r)=>{const i=e[2]*t,o=e[3]*t;return[n-(n-e[0])*t,r-(r-e[1])*t,i,o]},o=r=>{r.__mermaidAbortController&&(r.__mermaidAbortController.abort(),r.__mermaidRafId&&cancelAnimationFrame(r.__mermaidRafId));const o=new AbortController;r.__mermaidAbortController=o;const a=r.querySelector("svg");if(!a)return;const s=e(a);r.__mermaidInitViewBox=s,r.__mermaidCurViewBox=s.slice(),t(a,s),a.style.touchAction="none";let l=a.getBoundingClientRect(),d=!1;const m=()=>{d=!0};window.addEventListener("resize",m,{signal:o.signal}),window.addEventListener("scroll",m,{signal:o.signal,capture:!0});const c=()=>(d&&(l=a.getBoundingClientRect(),d=!1),l),u=.1*s[2],g=10*s[2],p=.1*s[3],h=10*s[3];let f=null,b=null;const w=()=>{f&&(r.__mermaidCurViewBox=f,t(a,f),f=null),b=null,r.__mermaidRafId=null},y=e=>{f=(e=>{const t=e.slice();return t[2]=n(t[2],u,g),t[3]=n(t[3],p,h),t})(e),b||(b=requestAnimationFrame(w),r.__mermaidRafId=b)},x={pointers:new Map,startVb:null,startDist:0,lastPointerX:0,lastPointerY:0},_=e=>{if(a.hasPointerCapture&&a.hasPointerCapture(e.pointerId)&&a.releasePointerCapture(e.pointerId),x.pointers.delete(e.pointerId),0===x.pointers.size)x.startVb=null,x.startDist=0;else if(1===x.pointers.size){const e=x.pointers.values().next().value;x.lastPointerX=e.x,x.lastPointerY=e.y}};a.addEventListener("pointerdown",e=>{if("mouse"===e.pointerType&&0!==e.button)return;a.setPointerCapture(e.pointerId);const t=r.__mermaidCurViewBox;if(x.pointers.set(e.pointerId,{x:e.clientX,y:e.clientY}),1===x.pointers.size)x.startVb=t.slice(),x.lastPointerX=e.clientX,x.lastPointerY=e.clientY;else if(2===x.pointers.size){const e=[...x.pointers.values()],n=e[0].x-e[1].x,r=e[0].y-e[1].y;x.startDist=Math.hypot(n,r),x.startVb=t.slice()}},{signal:o.signal}),a.addEventListener("pointermove",e=>{if(!x.pointers.has(e.pointerId))return;x.pointers.set(e.pointerId,{x:e.clientX,y:e.clientY});const t=r.__mermaidCurViewBox,n=c();if(1===x.pointers.size&&x.startVb){const e=x.pointers.values().next().value,r=e.x-x.lastPointerX,i=e.y-x.lastPointerY;x.lastPointerX=e.x,x.lastPointerY=e.y;const o=r*(t[2]/n.width),a=i*(t[3]/n.height);return void y([t[0]-o,t[1]-a,t[2],t[3]])}if(2===x.pointers.size&&x.startVb&&x.startDist>0){const e=[...x.pointers.values()],r=e[0].x-e[1].x,o=e[0].y-e[1].y,a=Math.hypot(r,o);if(!a)return;const s=x.startDist/a,l=(e[0].x+e[1].x)/2,d=(e[0].y+e[1].y)/2,m=t[0]+(l-n.left)*(t[2]/n.width),c=t[1]+(d-n.top)*(t[3]/n.height);y(i(x.startVb,s,m,c))}},{signal:o.signal}),a.addEventListener("pointerup",_,{signal:o.signal}),a.addEventListener("pointercancel",_,{signal:o.signal}),a.addEventListener("wheel",e=>{e.preventDefault(),e.stopPropagation();let t=e.deltaY;1===e.deltaMode?t*=16:2===e.deltaMode&&(t*=400);const n=Math.pow(1.001,t),o=r.__mermaidCurViewBox,a=c(),s=o[0]+(e.clientX-a.left)*(o[2]/a.width),l=o[1]+(e.clientY-a.top)*(o[3]/a.height);y(i(o,n,s,l))},{passive:!1,signal:o.signal}),a.addEventListener("dblclick",()=>{const e=r.__mermaidInitViewBox;e&&y(e)},{signal:o.signal})},a=()=>{const e=document.getElementById("article-container");if(!e)return;const t=e.querySelectorAll(".mermaid-wrap");if(0===t.length)return;const n=()=>(e=>{window.loadMermaid=!0;const t="dark"===document.documentElement.getAttribute("data-theme")?"dark":"default";e.forEach((e,n)=>{const i=e.firstElementChild;e.__mermaidAbortController&&e.__mermaidAbortController.abort();const a=e.querySelector("svg");a&&a.remove();let s={};try{s=i.dataset.config?JSON.parse(i.dataset.config):{}}catch(e){console.warn("[mermaid] failed to parse dataset.config:",e)}s.theme||(s.theme=t);const l=`%%{init: ${JSON.stringify(s)}}%%\n`,d=`mermaid-${n}`,m=l+i.textContent,c=t=>{i.insertAdjacentHTML("afterend",t),o(e),e.__mermaidOriginalSvg=t,r(e)},u=e=>{console.error(`[mermaid] render failed for block #${n}:`,e);const t=document.createElement("div");t.className="mermaid-error",t.textContent=`Mermaid render error: ${e.message||e}`,i.insertAdjacentElement("afterend",t)};try{const e=mermaid.render(d,m);"string"==typeof e?c(e):e.then(({svg:e})=>c(e)).catch(u)}catch(e){u(e)}})})(t);btf.addGlobalFn("themeChange",n,"mermaid"),window.loadMermaid?n():btf.getScript("https://registry.npmmirror.com/mermaid/11.16.0/files/dist/mermaid.min.js").then(n)};btf.addGlobalFn("encrypt",a,"mermaid"),window.pjax?a():document.addEventListener("DOMContentLoaded",a)})()