From 3157f30b5530ffc7869b291d416b05fecf7ee08f Mon Sep 17 00:00:00 2001 From: dash <1549469775@qq.com> Date: Sat, 30 Aug 2025 02:16:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20API=20=E6=8E=A7=E5=88=B6?= =?UTF-8?q?=E5=99=A8=EF=BC=8C=E4=BC=98=E5=8C=96=E8=B7=AF=E7=94=B1=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=9A=90=E7=A7=81=E6=94=BF=E7=AD=96=E3=80=81?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E6=9D=A1=E6=AC=BE=E3=80=81=E5=B8=B8=E8=A7=81?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E5=92=8C=E5=8F=8D=E9=A6=88=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=EF=BC=8C=E8=B0=83=E6=95=B4=E6=A0=B7=E5=BC=8F=E5=92=8C=E5=B8=83?= =?UTF-8?q?=E5=B1=80=EF=BC=8C=E6=8F=90=E5=8D=87=E7=94=A8=E6=88=B7=E4=BD=93?= =?UTF-8?q?=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/development.sqlite3-shm | Bin 32768 -> 32768 bytes database/development.sqlite3-wal | Bin 329632 -> 341992 bytes docs/links.md | 7 +++ public/css/layouts/root.css | 1 + public/css/page/index.css | 14 ++++++ src/controllers/Api/ApiController.js | 58 ++++++++++++++++++++++++ src/controllers/Page/PageController.js | 9 ++-- src/views/layouts/empty.pug | 2 +- src/views/layouts/root.pug | 4 +- src/views/page/extra/faq.pug | 55 +++++++++++++++++++++++ src/views/page/extra/feedback.pug | 28 ++++++++++++ src/views/page/extra/privacy.pug | 75 +++++++++++++++++++++++++++++++ src/views/page/extra/terms.pug | 64 +++++++++++++++++++++++++++ src/views/page/index/faq.pug | 56 ----------------------- src/views/page/index/feedback.pug | 29 ------------ src/views/page/index/index.pug | 3 +- src/views/page/index/privacy.pug | 78 --------------------------------- src/views/page/index/terms.pug | 67 ---------------------------- src/views/page/profile/index.pug | 7 +++ 19 files changed, 319 insertions(+), 238 deletions(-) create mode 100644 docs/links.md create mode 100644 src/controllers/Api/ApiController.js create mode 100644 src/views/page/extra/faq.pug create mode 100644 src/views/page/extra/feedback.pug create mode 100644 src/views/page/extra/privacy.pug create mode 100644 src/views/page/extra/terms.pug delete mode 100644 src/views/page/index/faq.pug delete mode 100644 src/views/page/index/feedback.pug delete mode 100644 src/views/page/index/privacy.pug delete mode 100644 src/views/page/index/terms.pug create mode 100644 src/views/page/profile/index.pug diff --git a/database/development.sqlite3-shm b/database/development.sqlite3-shm index 148c6498613cbc28b0322a040b807ba74f35f223..e623578f1cd1180d3e5edbce7a95d2cf48b96560 100644 GIT binary patch delta 176 zcmZo@U}|V!s+V}A%K!q55G)W3q`83jcudA;S+z^vP8$2}_0Kf$d@oQry=2$&Vp7!u zjRFIZx&M&>RCr^(C*#BiJe#jDdbl$NZobHPn`!e8Zz*QRARzl8)8sFKGK|5S1%uw} F0sym8I=KJ< delta 181 zcmZo@U}|V!s+V}A%K!t63=9GRKn@oW7q`V-(J8<5z)54@z5ba7o>p5^-(}wHav)Vb z%xsXk|B(Pxd}F;Q-NM@*By1j>LJn?Hr{ GX#)Uz4nIo( diff --git a/database/development.sqlite3-wal b/database/development.sqlite3-wal index c53355aa7a4e3d71aa98d20d16b5be529ad610b6..8052288971388242a62a3ad973f2799aafd6dec3 100644 GIT binary patch delta 227 zcmZ3`FY@BONJ9%_3sVbo3(FSP1?&~33WkPOhL%>QMp%S^R} + */ + async fetchFirstSuccess(urls) { + for (const url of urls) { + try { + const res = await fetch(url, { method: "get", mode: "cors", redirect: "follow" }) + if (!res.ok) continue + const contentType = res.headers.get("content-type") || "" + let data, type + if (contentType.includes("application/json")) { + data = await res.json() + type = "json" + } else if (contentType.includes("text/")) { + data = await res.text() + type = "text" + } else { + data = await res.blob() + type = "blob" + } + return { type, data } + } catch (e) { + // ignore and try next url + } + } + throw new Error("All requests failed") + } + + async random(ctx) { + const { type, data } = await this.fetchFirstSuccess(["https://api.miaomc.cn/image/get"]) + if (type === "blob") { + ctx.set("Content-Type", "image/jpeg") + ctx.body = data + } else { + ctx.body = formatResponse(false, "Failed to fetch image") + } + } + + /** + * 路由注册 + */ + static createRoutes() { + const controller = new AuthController() + const router = new Router({ prefix: "/api/pics" }) + router.get("/random", controller.random.bind(controller), { auth: false }) + return router + } +} + +export default AuthController diff --git a/src/controllers/Page/PageController.js b/src/controllers/Page/PageController.js index c361c50..b667d1f 100644 --- a/src/controllers/Page/PageController.js +++ b/src/controllers/Page/PageController.js @@ -171,10 +171,11 @@ class PageController { router.get("/articles", controller.pageGet("page/articles/index"), { auth: false }) router.get("/about", controller.pageGet("page/about/index"), { auth: false }) - router.get("/terms", controller.pageGet("page/index/terms"), { auth: false }) - router.get("/privacy", controller.pageGet("page/index/privacy"), { auth: false }) - router.get("/faq", controller.pageGet("page/index/faq"), { auth: false }) - // router.get("/feedback", controller.pageGet("page/index/feedback"), { auth: false }) + router.get("/terms", controller.pageGet("page/extra/terms"), { auth: false }) + router.get("/privacy", controller.pageGet("page/extra/privacy"), { auth: false }) + router.get("/faq", controller.pageGet("page/extra/faq"), { auth: false }) + router.get("/feedback", controller.pageGet("page/extra/feedback"), { auth: false }) + router.get("/profile", controller.pageGet("page/profile/index"), { auth: true }) router.get("/login", controller.loginGet.bind(controller), { auth: "try" }) router.post("/login", controller.loginPost.bind(controller), { auth: false }) router.get("/captcha", controller.captchaGet.bind(controller), { auth: false }) diff --git a/src/views/layouts/empty.pug b/src/views/layouts/empty.pug index 43cf7ae..5bacb35 100644 --- a/src/views/layouts/empty.pug +++ b/src/views/layouts/empty.pug @@ -24,7 +24,7 @@ block $$content else .right.menu.desktop-only a.menu-item(hx-post="/logout") 退出 - a.menu-item() 欢迎您 , #{$user.username} + a.menu-item(href="/profile") 欢迎您 , #{$user.username} // 移动端:汉堡按钮 button.menu-toggle(type="button" aria-label="打开菜单") span.bar diff --git a/src/views/layouts/root.pug b/src/views/layouts/root.pug index 371d4e6..ba4c10e 100644 --- a/src/views/layouts/root.pug +++ b/src/views/layouts/root.pug @@ -38,9 +38,9 @@ html(lang="zh-CN") block $$scripts script. //- 处理滚动条位置 + const el = document.querySelector('.simplebar-content-wrapper') + const scrollTop = sessionStorage.getItem('scrollTop-'+location.pathname) window.onload = function() { - const el = document.querySelector('.simplebar-content-wrapper') - const scrollTop = sessionStorage.getItem('scrollTop-'+location.pathname) el.scrollTop = scrollTop el.addEventListener("scroll", function(e) { sessionStorage.setItem('scrollTop-'+location.pathname, e.target.scrollTop) diff --git a/src/views/page/extra/faq.pug b/src/views/page/extra/faq.pug new file mode 100644 index 0000000..5b0761b --- /dev/null +++ b/src/views/page/extra/faq.pug @@ -0,0 +1,55 @@ +extends /layouts/empty.pug + +block pageHead + +block pageContent + .faq.container(class="mt-[20px] bg-white rounded-[12px] shadow p-6 border border-gray-100") + h1(class="text-2xl font-bold mb-4") 常见问题(FAQ) + p(class="text-gray-600 mb-6") 为帮助您快速了解与使用本站,这里汇总了常见问答。 + + // 基础使用 + h2(class="text-xl font-semibold mt-6 mb-3") 一、基础使用 + dl.divide-y.divide-gray-100 + div.py-4 + dt.font-medium 我如何注册与登录? + dd.text-gray-700.mt-1 访问“注册/登录”页面,按提示完成信息填写即可。如遇验证码问题,请刷新或稍后重试。 + div.py-4 + dt.font-medium 忘记密码怎么办? + dd.text-gray-700.mt-1 目前暂未开放自助找回功能,请通过页脚联系方式与我们取得联系协助处理。 + + // 账号与安全 + h2(class="text-xl font-semibold mt-6 mb-3") 二、账号与安全 + dl.divide-y.divide-gray-100 + div.py-4 + dt.font-medium 如何提升账户安全? + dd.text-gray-700.mt-1 使用强密码、定期更换、不在公共设备保存登录信息,退出时及时登出。 + div.py-4 + dt.font-medium 我的数据会被如何使用? + dd.text-gray-700.mt-1 我们严格遵循最小必要与合规原则处理数据,详见 + a(href="/privacy" class="text-blue-600 hover:underline") 隐私政策 + | 。 + + // 功能与服务 + h2(class="text-xl font-semibold mt-6 mb-3") 三、功能与服务 + dl.divide-y.divide-gray-100 + div.py-4 + dt.font-medium 你们提供哪些公开 API? + dd.text-gray-700.mt-1 可在首页“API 列表”中查看示例与说明,或关注文档更新。 + div.py-4 + dt.font-medium 页面打不开/出现错误怎么办? + dd.text-gray-700.mt-1 刷新页面、清理缓存或更换网络环境;如仍有问题,请将报错信息与时间反馈给我们。 + + // 合规与条款 + h2(class="text-xl font-semibold mt-6 mb-3") 四、合规与条款 + dl.divide-y.divide-gray-100 + div.py-4 + dt.font-medium 需要遵守哪些条款? + dd.text-gray-700.mt-1 使用前请阅读并同意 + a(href="/terms" class="text-blue-600 hover:underline") 服务条款 + | 与 + a(href="/privacy" class="text-blue-600 hover:underline") 隐私政策 + | 。 + + p(class="text-gray-500 text-sm mt-8") 最近更新:#{new Date().getFullYear()} 年 #{new Date().getMonth()+1} 月 #{new Date().getDate()} 日 + + diff --git a/src/views/page/extra/feedback.pug b/src/views/page/extra/feedback.pug new file mode 100644 index 0000000..985b18b --- /dev/null +++ b/src/views/page/extra/feedback.pug @@ -0,0 +1,28 @@ +extends /layouts/empty.pug + +block pageHead + +block pageContent + .feedback.container(class="mt-[20px] bg-white rounded-[12px] shadow p-6 border border-gray-100") + h1(class="text-2xl font-bold mb-2") 意见反馈 + p(class="text-gray-600 mb-6") 欢迎提出您的建议或问题,我们会尽快处理。 + + form(class="space-y-4" method="post" action="#" onsubmit="alert('感谢反馈!'); return false;") + .grid.grid-cols-1(class="md:grid-cols-2 gap-4") + .form-item + label.block.text-sm.text-gray-600.mb-1(for="name") 您的称呼 + input#name(type="text" name="name" placeholder="例如:张三" class="w-full border border-gray-200 rounded px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-200") + .form-item + label.block.text-sm.text-gray-600.mb-1(for="email") 邮箱(可选) + input#email(type="email" name="email" placeholder="用于回复您" class="w-full border border-gray-200 rounded px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-200") + .form-item + label.block.text-sm.text-gray-600.mb-1(for="subject") 主题 + input#subject(type="text" name="subject" placeholder="简要概括问题/建议" class="w-full border border-gray-200 rounded px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-200") + .form-item + label.block.text-sm.text-gray-600.mb-1(for="content") 详细描述 + textarea#content(name="content" rows="6" placeholder="请尽量描述清楚场景、复现步骤、预期与实际结果等" class="w-full border border-gray-200 rounded px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-200") + .flex.items-center.justify-between + button(type="submit" class="px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 transition-colors") 提交反馈 + a(href="mailto:me@xieyaxin.top" class="text-sm text-gray-500 hover:text-blue-600") 或发送邮件联系 + + diff --git a/src/views/page/extra/privacy.pug b/src/views/page/extra/privacy.pug new file mode 100644 index 0000000..89927f7 --- /dev/null +++ b/src/views/page/extra/privacy.pug @@ -0,0 +1,75 @@ +extends /layouts/empty.pug + +block pageContent + .privacy.container(class="mt-[20px] bg-white rounded-[12px] shadow p-6 border border-gray-100") + h1(class="text-2xl font-bold mb-4") 隐私政策 + p(class="text-gray-600 mb-6") 我们重视您的个人信息与隐私保护。本隐私政策旨在向您说明我们如何收集、使用、共享与保护您的信息,以及您对个人信息享有的权利。请您在使用本站服务前仔细阅读并充分理解本政策的全部内容。 + + h2(class="text-xl font-semibold mt-6 mb-3") 一、适用范围 + ul.list-disc.pl-6.text-gray-700 + li 当您访问、浏览、注册、登录、使用本站提供的各项产品/服务时,本政策适用。 + li 如与《服务条款》存在不一致,以本政策就个人信息处理相关内容为准。 + + h2(class="text-xl font-semibold mt-6 mb-3") 二、我们收集的信息 + p 为向您提供服务与优化体验,我们可能收集以下信息: + ul.list-disc.pl-6.text-gray-700 + li 账户信息:昵称、头像、联系方式(如邮箱、手机)、密码或凭证等。 + li 使用信息:访问记录、点击行为、浏览历史、设备信息(设备型号、操作系统、浏览器类型、分辨率)、网络信息(IP、运营商)。 + li 日志信息:错误日志、性能日志、系统事件,以便排查问题和提升稳定性。 + li 交互信息:您与我们沟通时提交的反馈、工单、评论与表单信息。 + + h2(class="text-xl font-semibold mt-6 mb-3") 三、信息的来源与收集方式 + ul.list-disc.pl-6.text-gray-700 + li 您主动提供:注册、填写表单、提交反馈时提供的相关信息。 + li 自动收集:通过 Cookie/本地存储、日志与统计分析工具自动采集的使用数据与设备信息。 + li 第三方来源:在您授权的前提下,我们可能从依法合规的第三方获取必要信息以完善服务。 + + h2(class="text-xl font-semibold mt-6 mb-3") 四、我们如何使用信息 + ul.list-disc.pl-6.text-gray-700 + li 提供、维护与优化产品/服务的功能与性能。 + li 账号管理、身份验证、安全防护与风险控制。 + li 向您发送与服务相关的通知(如更新、变更、异常提示)。 + li 数据统计与分析,用于改善产品体验与用户支持。 + li 依法需配合的监管合规、争议处理与维权。 + + h2(class="text-xl font-semibold mt-6 mb-3") 五、Cookie 与本地存储 + p 为确保基础功能和提升体验,我们会使用 Cookie 或浏览器本地存储: + ul.list-disc.pl-6.text-gray-700 + li 目的:会话保持、偏好设置、性能与功能分析。 + li 管理:您可在浏览器设置中清除或禁止 Cookie;但部分功能可能因此受限或不可用。 + + h2(class="text-xl font-semibold mt-6 mb-3") 六、信息共享、转让与公开披露 + ul.list-disc.pl-6.text-gray-700 + li 我们不会向无关第三方出售您的个人信息。 + li 仅在以下情形共享或转让:获得您明确同意;基于法律法规、司法或行政机关要求;为实现功能所必需的可信合作伙伴(最小必要原则并签署保密与数据保护协议)。 + li 公开披露仅在法律要求或为保护重大公共利益、他人生命财产安全等必要情形下进行。 + + h2(class="text-xl font-semibold mt-6 mb-3") 七、第三方服务与 SDK + p 本站可能集成第三方服务(如统计分析、支付、登录、地图等)。第三方可能独立收集、处理您的信息,其行为受其自身隐私政策约束。我们将审慎评估接入必要性并尽可能要求其遵循最小必要、去标识化与安全合规。 + + h2(class="text-xl font-semibold mt-6 mb-3") 八、信息的存储与安全 + ul.list-disc.pl-6.text-gray-700 + li 存储地点与期限:信息通常存储在依法设立的服务器中,保存期限以实现目的所需的最短时间为准,法律法规另有要求的从其规定。 + li 安全措施:采用访问控制、加密传输/存储、最小权限、定期审计与备份等措施,降低信息泄露、损毁、丢失风险。 + li 事件响应:一旦发生安全事件,我们将按照法律法规履行告知与处置义务。 + + h2(class="text-xl font-semibold mt-6 mb-3") 九、您的权利 + ul.list-disc.pl-6.text-gray-700 + li 访问、更正与删除:在不影响其他自然人合法权益及法律留存要求的前提下,您可按照指引访问、更正或删除相关信息。 + li 撤回同意与注销账户:您可撤回非必要信息处理的授权,或申请注销账户(法律法规另有规定或为履行合同所必需的除外)。 + li 获取副本与可携权(如适用):在符合法律条件时,您可请求导出个人信息副本。 + + h2(class="text-xl font-semibold mt-6 mb-3") 十、未成年人保护 + p 未成年人应在监护人监护、指导下使用本站服务。若您是监护人并对未成年人信息有疑问,请与我们联系,我们将在核实后尽快处理。 + + h2(class="text-xl font-semibold mt-6 mb-3") 十一、跨境传输(如适用) + p 如涉及将您的个人信息传输至境外,我们会依据适用法律履行必要评估、备案与合同保障义务,并确保接收方具备足够的数据保护能力。 + + h2(class="text-xl font-semibold mt-6 mb-3") 十二、本政策的更新 + p 为适应业务、技术或法律法规变化,我们可能对本政策进行更新。重大变更将以显著方式提示。您继续使用服务即视为接受更新后的政策。 + + h2(class="text-xl font-semibold mt-6 mb-3") 十三、联系我们 + p 如您对本政策或个人信息保护有任何疑问、意见或请求,请通过页脚中的联系方式与我们取得联系,我们将尽快予以回复。 + + p(class="text-gray-500 text-sm mt-8") 最近更新:#{new Date().getFullYear()} 年 #{new Date().getMonth()+1} 月 #{new Date().getDate()} 日 + diff --git a/src/views/page/extra/terms.pug b/src/views/page/extra/terms.pug new file mode 100644 index 0000000..a64d456 --- /dev/null +++ b/src/views/page/extra/terms.pug @@ -0,0 +1,64 @@ +extends /layouts/empty.pug + +block pageContent + .terms.container(class="mt-[20px] bg-white rounded-[12px] shadow p-6 border border-gray-100") + h1(class="text-2xl font-bold mb-4") 服务条款 + p(class="text-gray-600 mb-6") 欢迎使用本网站与相关服务。为保障您的合法权益,请在使用前仔细阅读并充分理解本服务条款。 + + h2(class="text-xl font-semibold mt-6 mb-3") 一、协议的接受与变更 + p 本条款构成您与本站之间就使用本站服务所达成的协议。一旦您访问或使用本站,即视为您已阅读并同意受本条款约束。本站有权根据业务需要对条款进行修订,修订后的条款将通过页面公示或其他适当方式通知,若您继续使用服务,即视为接受修订内容。 + + h2(class="text-xl font-semibold mt-6 mb-3") 二、账户注册与使用 + ul.list-disc.pl-6.text-gray-700 + li 您应当具备完全民事行为能力;如不具备,请确保在监护人指导下使用。 + li 注册信息应真实、准确、完整,并在变更时及时更新。 + li 您应妥善保管账户与密码,因保管不善导致的损失由您自行承担。 + li 发现任何未经授权的使用行为,请立即与我们联系。 + + h2(class="text-xl font-semibold mt-6 mb-3") 三、用户行为规范 + ul.list-disc.pl-6.text-gray-700 + li 遵守法律法规,不得利用本站制作、复制、发布、传播违法违规内容。 + li 不得干扰、破坏本站正常运营,不得进行未经授权的访问、抓取或数据采集。 + li 不得对本站进行逆向工程、反编译或尝试获取源代码。 + li 尊重他人合法权益,不得侵犯他人知识产权、隐私权、名誉权等。 + + h2(class="text-xl font-semibold mt-6 mb-3") 四、内容与知识产权 + ul.list-disc.pl-6.text-gray-700 + li 除非另有说明,本站及其内容(包括但不限于文字、图片、界面、版式、程序、数据等)受相关法律保护。 + li 未经授权,任何人不得以任何方式使用、复制、修改、传播或用于商业目的。 + li 用户在本站发布或上传的内容,用户应保证拥有相应权利且不侵犯任何第三方权益。 + + h2(class="text-xl font-semibold mt-6 mb-3") 五、隐私与数据保护 + p 我们将依法收集、使用、存储与保护您的个人信息。更多细则请参见 + a(href="/privacy" class="text-blue-600 hover:underline") 隐私政策 + | 。 + + h2(class="text-xl font-semibold mt-6 mb-3") 六、第三方服务 + p 本站可能集成或链接第三方服务。您对第三方服务的使用应遵循其各自的条款与政策,由此产生的纠纷与责任由您与第三方自行解决。 + + h2(class="text-xl font-semibold mt-6 mb-3") 七、服务变更、中断与终止 + ul.list-disc.pl-6.text-gray-700 + li 因系统维护、升级或不可抗力等原因,本站有权对服务进行变更、中断或终止。 + li 对于免费服务,本站不对中断或终止承担任何赔偿责任;对付费服务,将依据法律法规与约定处理。 + + h2(class="text-xl font-semibold mt-6 mb-3") 八、免责声明 + ul.list-disc.pl-6.text-gray-700 + li 本站以“现状”与“可得”基础提供服务,不对服务的准确性、完整性、持续性做出明示或暗示保证。 + li 因网络故障、设备故障、黑客攻击、不可抗力等造成的服务中断或数据丢失,本站不承担由此产生的损失责任。 + + h2(class="text-xl font-semibold mt-6 mb-3") 九、违约处理 + p 如您违反本条款或相关法律法规,本站有权采取包括但不限于限制功能、冻结或注销账号、删除内容、追究法律责任等措施。 + + h2(class="text-xl font-semibold mt-6 mb-3") 十、适用法律与争议解决 + p 本条款的订立、执行与解释及争议的解决,适用中华人民共和国法律。因本条款产生的任何争议,双方应友好协商解决;协商不成的,提交本站所在地有管辖权的人民法院诉讼解决。 + + h2(class="text-xl font-semibold mt-6 mb-3") 十一、未成年人保护 + p 未成年人应在监护人监护、指导下使用本站服务。监护人应承担监护责任,合理监督未成年人上网行为。 + + h2(class="text-xl font-semibold mt-6 mb-3") 十二、条款的可分割性 + p 如本条款任何条款被认定为无效或不可执行,其余条款仍然有效并对双方具有约束力。 + + h2(class="text-xl font-semibold mt-6 mb-3") 十三、联系与通知 + p 如您对本条款有任何疑问或需要联系本站,请通过页脚中的联系方式与我们取得联系。 + + p(class="text-gray-500 text-sm mt-8") 最近更新:#{new Date().getFullYear()} 年 #{new Date().getMonth()+1} 月 #{new Date().getDate()} 日 diff --git a/src/views/page/index/faq.pug b/src/views/page/index/faq.pug deleted file mode 100644 index f9cf08a..0000000 --- a/src/views/page/index/faq.pug +++ /dev/null @@ -1,56 +0,0 @@ -extends /layouts/empty.pug - -block pageHead - +css('css/page/index.css') - -block pageContent - .faq.container(class="mt-[20px] bg-white rounded-[12px] shadow p-6 border border-gray-100") - h1(class="text-2xl font-bold mb-4") 常见问题(FAQ) - p(class="text-gray-600 mb-6") 为帮助您快速了解与使用本站,这里汇总了常见问答。 - - // 基础使用 - h2(class="text-xl font-semibold mt-6 mb-3") 一、基础使用 - dl.divide-y.divide-gray-100 - div.py-4 - dt.font-medium 我如何注册与登录? - dd.text-gray-700.mt-1 访问“注册/登录”页面,按提示完成信息填写即可。如遇验证码问题,请刷新或稍后重试。 - div.py-4 - dt.font-medium 忘记密码怎么办? - dd.text-gray-700.mt-1 目前暂未开放自助找回功能,请通过页脚联系方式与我们取得联系协助处理。 - - // 账号与安全 - h2(class="text-xl font-semibold mt-6 mb-3") 二、账号与安全 - dl.divide-y.divide-gray-100 - div.py-4 - dt.font-medium 如何提升账户安全? - dd.text-gray-700.mt-1 使用强密码、定期更换、不在公共设备保存登录信息,退出时及时登出。 - div.py-4 - dt.font-medium 我的数据会被如何使用? - dd.text-gray-700.mt-1 我们严格遵循最小必要与合规原则处理数据,详见 - a(href="/privacy" class="text-blue-600 hover:underline") 隐私政策 - | 。 - - // 功能与服务 - h2(class="text-xl font-semibold mt-6 mb-3") 三、功能与服务 - dl.divide-y.divide-gray-100 - div.py-4 - dt.font-medium 你们提供哪些公开 API? - dd.text-gray-700.mt-1 可在首页“API 列表”中查看示例与说明,或关注文档更新。 - div.py-4 - dt.font-medium 页面打不开/出现错误怎么办? - dd.text-gray-700.mt-1 刷新页面、清理缓存或更换网络环境;如仍有问题,请将报错信息与时间反馈给我们。 - - // 合规与条款 - h2(class="text-xl font-semibold mt-6 mb-3") 四、合规与条款 - dl.divide-y.divide-gray-100 - div.py-4 - dt.font-medium 需要遵守哪些条款? - dd.text-gray-700.mt-1 使用前请阅读并同意 - a(href="/terms" class="text-blue-600 hover:underline") 服务条款 - | 与 - a(href="/privacy" class="text-blue-600 hover:underline") 隐私政策 - | 。 - - p(class="text-gray-500 text-sm mt-8") 最近更新:#{new Date().getFullYear()} 年 #{new Date().getMonth()+1} 月 #{new Date().getDate()} 日 - - diff --git a/src/views/page/index/feedback.pug b/src/views/page/index/feedback.pug deleted file mode 100644 index 8a141ee..0000000 --- a/src/views/page/index/feedback.pug +++ /dev/null @@ -1,29 +0,0 @@ -extends /layouts/empty.pug - -block pageHead - +css('css/page/index.css') - -block pageContent - .feedback.container(class="mt-[20px] bg-white rounded-[12px] shadow p-6 border border-gray-100") - h1(class="text-2xl font-bold mb-2") 意见反馈 - p(class="text-gray-600 mb-6") 欢迎提出您的建议或问题,我们会尽快处理。 - - form(class="space-y-4" method="post" action="#" onsubmit="alert('感谢反馈!'); return false;") - .grid.grid-cols-1.md\:grid-cols-2.gap-4 - .form-item - label.block.text-sm.text-gray-600.mb-1(for="name") 您的称呼 - input#name(type="text" name="name" placeholder="例如:张三" class="w-full border border-gray-200 rounded px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-200") - .form-item - label.block.text-sm.text-gray-600.mb-1(for="email") 邮箱(可选) - input#email(type="email" name="email" placeholder="用于回复您" class="w-full border border-gray-200 rounded px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-200") - .form-item - label.block.text-sm.text-gray-600.mb-1(for="subject") 主题 - input#subject(type="text" name="subject" placeholder="简要概括问题/建议" class="w-full border border-gray-200 rounded px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-200") - .form-item - label.block.text-sm.text-gray-600.mb-1(for="content") 详细描述 - textarea#content(name="content" rows="6" placeholder="请尽量描述清楚场景、复现步骤、预期与实际结果等" class="w-full border border-gray-200 rounded px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-200") - .flex.items-center.justify-between - button(type="submit" class="px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 transition-colors") 提交反馈 - a(href="mailto:me@xieyaxin.top" class="text-sm text-gray-500 hover:text-blue-600") 或发送邮件联系 - - diff --git a/src/views/page/index/index.pug b/src/views/page/index/index.pug index 1438c2c..72463e7 100644 --- a/src/views/page/index/index.pug +++ b/src/views/page/index/index.pug @@ -7,8 +7,9 @@ block pageHead +js("https://unpkg.com/tippy.js@5") mixin item(url, desc) - a(href=url data-tippy-content=desc target="_blank" class="inline-block text-[16px] p-[10px] rounded-[10px] shadow") + a(href=url target="_blank" class="inline-flex items-center text-[16px] p-[10px] rounded-[10px] shadow") block + .material-symbols-light--info-rounded(data-tippy-content=desc) mixin card(blog) .article-card(class="bg-white rounded-[12px] shadow p-6 transition hover:shadow-lg border border-gray-100") diff --git a/src/views/page/index/privacy.pug b/src/views/page/index/privacy.pug deleted file mode 100644 index be9b0b1..0000000 --- a/src/views/page/index/privacy.pug +++ /dev/null @@ -1,78 +0,0 @@ -extends /layouts/empty.pug - -block pageHead - +css('css/page/index.css') - -block pageContent - .privacy.container(class="mt-[20px] bg-white rounded-[12px] shadow p-6 border border-gray-100") - h1(class="text-2xl font-bold mb-4") 隐私政策 - p(class="text-gray-600 mb-6") 我们重视您的个人信息与隐私保护。本隐私政策旨在向您说明我们如何收集、使用、共享与保护您的信息,以及您对个人信息享有的权利。请您在使用本站服务前仔细阅读并充分理解本政策的全部内容。 - - h2(class="text-xl font-semibold mt-6 mb-3") 一、适用范围 - ul.list-disc.pl-6.text-gray-700 - li 当您访问、浏览、注册、登录、使用本站提供的各项产品/服务时,本政策适用。 - li 如与《服务条款》存在不一致,以本政策就个人信息处理相关内容为准。 - - h2(class="text-xl font-semibold mt-6 mb-3") 二、我们收集的信息 - p 为向您提供服务与优化体验,我们可能收集以下信息: - ul.list-disc.pl-6.text-gray-700 - li 账户信息:昵称、头像、联系方式(如邮箱、手机)、密码或凭证等。 - li 使用信息:访问记录、点击行为、浏览历史、设备信息(设备型号、操作系统、浏览器类型、分辨率)、网络信息(IP、运营商)。 - li 日志信息:错误日志、性能日志、系统事件,以便排查问题和提升稳定性。 - li 交互信息:您与我们沟通时提交的反馈、工单、评论与表单信息。 - - h2(class="text-xl font-semibold mt-6 mb-3") 三、信息的来源与收集方式 - ul.list-disc.pl-6.text-gray-700 - li 您主动提供:注册、填写表单、提交反馈时提供的相关信息。 - li 自动收集:通过 Cookie/本地存储、日志与统计分析工具自动采集的使用数据与设备信息。 - li 第三方来源:在您授权的前提下,我们可能从依法合规的第三方获取必要信息以完善服务。 - - h2(class="text-xl font-semibold mt-6 mb-3") 四、我们如何使用信息 - ul.list-disc.pl-6.text-gray-700 - li 提供、维护与优化产品/服务的功能与性能。 - li 账号管理、身份验证、安全防护与风险控制。 - li 向您发送与服务相关的通知(如更新、变更、异常提示)。 - li 数据统计与分析,用于改善产品体验与用户支持。 - li 依法需配合的监管合规、争议处理与维权。 - - h2(class="text-xl font-semibold mt-6 mb-3") 五、Cookie 与本地存储 - p 为确保基础功能和提升体验,我们会使用 Cookie 或浏览器本地存储: - ul.list-disc.pl-6.text-gray-700 - li 目的:会话保持、偏好设置、性能与功能分析。 - li 管理:您可在浏览器设置中清除或禁止 Cookie;但部分功能可能因此受限或不可用。 - - h2(class="text-xl font-semibold mt-6 mb-3") 六、信息共享、转让与公开披露 - ul.list-disc.pl-6.text-gray-700 - li 我们不会向无关第三方出售您的个人信息。 - li 仅在以下情形共享或转让:获得您明确同意;基于法律法规、司法或行政机关要求;为实现功能所必需的可信合作伙伴(最小必要原则并签署保密与数据保护协议)。 - li 公开披露仅在法律要求或为保护重大公共利益、他人生命财产安全等必要情形下进行。 - - h2(class="text-xl font-semibold mt-6 mb-3") 七、第三方服务与 SDK - p 本站可能集成第三方服务(如统计分析、支付、登录、地图等)。第三方可能独立收集、处理您的信息,其行为受其自身隐私政策约束。我们将审慎评估接入必要性并尽可能要求其遵循最小必要、去标识化与安全合规。 - - h2(class="text-xl font-semibold mt-6 mb-3") 八、信息的存储与安全 - ul.list-disc.pl-6.text-gray-700 - li 存储地点与期限:信息通常存储在依法设立的服务器中,保存期限以实现目的所需的最短时间为准,法律法规另有要求的从其规定。 - li 安全措施:采用访问控制、加密传输/存储、最小权限、定期审计与备份等措施,降低信息泄露、损毁、丢失风险。 - li 事件响应:一旦发生安全事件,我们将按照法律法规履行告知与处置义务。 - - h2(class="text-xl font-semibold mt-6 mb-3") 九、您的权利 - ul.list-disc.pl-6.text-gray-700 - li 访问、更正与删除:在不影响其他自然人合法权益及法律留存要求的前提下,您可按照指引访问、更正或删除相关信息。 - li 撤回同意与注销账户:您可撤回非必要信息处理的授权,或申请注销账户(法律法规另有规定或为履行合同所必需的除外)。 - li 获取副本与可携权(如适用):在符合法律条件时,您可请求导出个人信息副本。 - - h2(class="text-xl font-semibold mt-6 mb-3") 十、未成年人保护 - p 未成年人应在监护人监护、指导下使用本站服务。若您是监护人并对未成年人信息有疑问,请与我们联系,我们将在核实后尽快处理。 - - h2(class="text-xl font-semibold mt-6 mb-3") 十一、跨境传输(如适用) - p 如涉及将您的个人信息传输至境外,我们会依据适用法律履行必要评估、备案与合同保障义务,并确保接收方具备足够的数据保护能力。 - - h2(class="text-xl font-semibold mt-6 mb-3") 十二、本政策的更新 - p 为适应业务、技术或法律法规变化,我们可能对本政策进行更新。重大变更将以显著方式提示。您继续使用服务即视为接受更新后的政策。 - - h2(class="text-xl font-semibold mt-6 mb-3") 十三、联系我们 - p 如您对本政策或个人信息保护有任何疑问、意见或请求,请通过页脚中的联系方式与我们取得联系,我们将尽快予以回复。 - - p(class="text-gray-500 text-sm mt-8") 最近更新:#{new Date().getFullYear()} 年 #{new Date().getMonth()+1} 月 #{new Date().getDate()} 日 - diff --git a/src/views/page/index/terms.pug b/src/views/page/index/terms.pug deleted file mode 100644 index c271f07..0000000 --- a/src/views/page/index/terms.pug +++ /dev/null @@ -1,67 +0,0 @@ -extends /layouts/empty.pug - -block pageHead - +css('css/page/index.css') - -block pageContent - .terms.container(class="mt-[20px] bg-white rounded-[12px] shadow p-6 border border-gray-100") - h1(class="text-2xl font-bold mb-4") 服务条款 - p(class="text-gray-600 mb-6") 欢迎使用本网站与相关服务。为保障您的合法权益,请在使用前仔细阅读并充分理解本服务条款。 - - h2(class="text-xl font-semibold mt-6 mb-3") 一、协议的接受与变更 - p 本条款构成您与本站之间就使用本站服务所达成的协议。一旦您访问或使用本站,即视为您已阅读并同意受本条款约束。本站有权根据业务需要对条款进行修订,修订后的条款将通过页面公示或其他适当方式通知,若您继续使用服务,即视为接受修订内容。 - - h2(class="text-xl font-semibold mt-6 mb-3") 二、账户注册与使用 - ul.list-disc.pl-6.text-gray-700 - li 您应当具备完全民事行为能力;如不具备,请确保在监护人指导下使用。 - li 注册信息应真实、准确、完整,并在变更时及时更新。 - li 您应妥善保管账户与密码,因保管不善导致的损失由您自行承担。 - li 发现任何未经授权的使用行为,请立即与我们联系。 - - h2(class="text-xl font-semibold mt-6 mb-3") 三、用户行为规范 - ul.list-disc.pl-6.text-gray-700 - li 遵守法律法规,不得利用本站制作、复制、发布、传播违法违规内容。 - li 不得干扰、破坏本站正常运营,不得进行未经授权的访问、抓取或数据采集。 - li 不得对本站进行逆向工程、反编译或尝试获取源代码。 - li 尊重他人合法权益,不得侵犯他人知识产权、隐私权、名誉权等。 - - h2(class="text-xl font-semibold mt-6 mb-3") 四、内容与知识产权 - ul.list-disc.pl-6.text-gray-700 - li 除非另有说明,本站及其内容(包括但不限于文字、图片、界面、版式、程序、数据等)受相关法律保护。 - li 未经授权,任何人不得以任何方式使用、复制、修改、传播或用于商业目的。 - li 用户在本站发布或上传的内容,用户应保证拥有相应权利且不侵犯任何第三方权益。 - - h2(class="text-xl font-semibold mt-6 mb-3") 五、隐私与数据保护 - p 我们将依法收集、使用、存储与保护您的个人信息。更多细则请参见 - a(href="/privacy" class="text-blue-600 hover:underline") 隐私政策 - | 。 - - h2(class="text-xl font-semibold mt-6 mb-3") 六、第三方服务 - p 本站可能集成或链接第三方服务。您对第三方服务的使用应遵循其各自的条款与政策,由此产生的纠纷与责任由您与第三方自行解决。 - - h2(class="text-xl font-semibold mt-6 mb-3") 七、服务变更、中断与终止 - ul.list-disc.pl-6.text-gray-700 - li 因系统维护、升级或不可抗力等原因,本站有权对服务进行变更、中断或终止。 - li 对于免费服务,本站不对中断或终止承担任何赔偿责任;对付费服务,将依据法律法规与约定处理。 - - h2(class="text-xl font-semibold mt-6 mb-3") 八、免责声明 - ul.list-disc.pl-6.text-gray-700 - li 本站以“现状”与“可得”基础提供服务,不对服务的准确性、完整性、持续性做出明示或暗示保证。 - li 因网络故障、设备故障、黑客攻击、不可抗力等造成的服务中断或数据丢失,本站不承担由此产生的损失责任。 - - h2(class="text-xl font-semibold mt-6 mb-3") 九、违约处理 - p 如您违反本条款或相关法律法规,本站有权采取包括但不限于限制功能、冻结或注销账号、删除内容、追究法律责任等措施。 - - h2(class="text-xl font-semibold mt-6 mb-3") 十、适用法律与争议解决 - p 本条款的订立、执行与解释及争议的解决,适用中华人民共和国法律。因本条款产生的任何争议,双方应友好协商解决;协商不成的,提交本站所在地有管辖权的人民法院诉讼解决。 - - h2(class="text-xl font-semibold mt-6 mb-3") 十一、未成年人保护 - p 未成年人应在监护人监护、指导下使用本站服务。监护人应承担监护责任,合理监督未成年人上网行为。 - - h2(class="text-xl font-semibold mt-6 mb-3") 十二、条款的可分割性 - p 如本条款任何条款被认定为无效或不可执行,其余条款仍然有效并对双方具有约束力。 - - h2(class="text-xl font-semibold mt-6 mb-3") 十三、联系与通知 - p 如您对本条款有任何疑问或需要联系本站,请通过页脚中的联系方式与我们取得联系。 - - p(class="text-gray-500 text-sm mt-8") 最近更新:#{new Date().getFullYear()} 年 #{new Date().getMonth()+1} 月 #{new Date().getDate()} 日 diff --git a/src/views/page/profile/index.pug b/src/views/page/profile/index.pug new file mode 100644 index 0000000..b46cbad --- /dev/null +++ b/src/views/page/profile/index.pug @@ -0,0 +1,7 @@ +extends /layouts/empty.pug + +block pageHead + + +block pageContent + div sad \ No newline at end of file