This commit is contained in:
Zyronon
2025-11-11 02:09:54 +08:00
parent 882d80f6d4
commit f502e2d713
6 changed files with 717 additions and 515 deletions

1
components.d.ts vendored
View File

@@ -56,6 +56,7 @@ declare module 'vue' {
IconFluentChevronLeft28Filled: typeof import('~icons/fluent/chevron-left28-filled')['default']
IconFluentDatabasePerson20Regular: typeof import('~icons/fluent/database-person20-regular')['default']
IconFluentDelete20Regular: typeof import('~icons/fluent/delete20-regular')['default']
IconFluentDismiss12Regular: typeof import('~icons/fluent/dismiss12-regular')['default']
IconFluentDismiss20Regular: typeof import('~icons/fluent/dismiss20-regular')['default']
IconFluentDismissCircle16Regular: typeof import('~icons/fluent/dismiss-circle16-regular')['default']
IconFluentDismissCircle20Filled: typeof import('~icons/fluent/dismiss-circle20-filled')['default']

View File

@@ -198,6 +198,7 @@ const vFocus = {
height: 1.5rem;
color: var(--color-input-color);
background: transparent;
width: 100%;
}
}
</style>

View File

@@ -0,0 +1,144 @@
<script setup lang="ts">
import BasePage from "@/components/BasePage.vue";
import BackIcon from "@/components/BackIcon.vue";
</script>
<template>
<BasePage>
<div class="privacy-page">
<BackIcon />
<h1 class="page-title">隐私政策</h1>
<div class="content">
<section>
<h2>引言</h2>
<p>我们非常重视您的隐私保护本隐私政策说明了我们如何收集使用存储和保护您的个人信息在使用本应用之前请您仔细阅读本隐私政策</p>
</section>
<section>
<h2>信息收集</h2>
<p>我们可能收集以下信息</p>
<p><strong>1. 账户信息</strong>当您注册账户时我们会收集您的手机号邮箱地址密码等信息</p>
<p><strong>2. 学习数据</strong>我们会记录您的学习进度学习记录练习数据等信息以便为您提供个性化的学习服务</p>
<p><strong>3. 设备信息</strong>我们可能收集您的设备型号操作系统版本唯一设备标识符等信息用于改善服务质量和安全性</p>
<p><strong>4. 日志信息</strong>当您使用本应用时我们可能自动收集某些信息包括IP地址访问时间访问页面等</p>
</section>
<section>
<h2>信息使用</h2>
<p>我们使用收集的信息用于以下目的</p>
<p>1. 提供维护和改进我们的服务</p>
<p>2. 处理您的注册登录学习记录等请求</p>
<p>3. 向您发送服务通知更新和安全提醒</p>
<p>4. 进行数据分析以改善用户体验和服务质量</p>
<p>5. 检测预防和解决技术问题</p>
<p>6. 遵守法律法规要求</p>
</section>
<section>
<h2>信息存储</h2>
<p>1. 我们采用行业标准的安全措施来保护您的个人信息防止未经授权的访问使用或泄露</p>
<p>2. 您的个人信息将存储在安全的服务器上我们会对数据进行加密处理</p>
<p>3. 我们仅在为实现本隐私政策所述目的所必需的期间内保留您的个人信息</p>
</section>
<section>
<h2>信息共享</h2>
<p>我们不会向第三方出售交易或转让您的个人信息除非</p>
<p>1. 获得您的明确同意</p>
<p>2. 法律法规要求或司法机关行政机关依法要求提供</p>
<p>3. 为履行我们的服务协议或本隐私政策我们可能需要与我们的服务提供商共享某些信息</p>
</section>
<section>
<h2>Cookie和类似技术</h2>
<p>我们可能使用Cookie和类似技术来收集信息改善用户体验和分析服务使用情况您可以通过浏览器设置管理Cookie但这可能影响某些功能的正常使用</p>
</section>
<section>
<h2>您的权利</h2>
<p>根据相关法律法规您对自己的个人信息享有以下权利</p>
<p>1. <strong>访问权</strong>您有权访问我们持有的关于您的个人信息</p>
<p>2. <strong>更正权</strong>您有权要求更正不准确的个人信息</p>
<p>3. <strong>删除权</strong>在特定情况下您有权要求删除您的个人信息</p>
<p>4. <strong>撤回同意</strong>您有权随时撤回您之前给予的同意</p>
<p>5. <strong>投诉权</strong>如果您认为我们对您个人信息的处理违反了相关法律法规您有权向相关监管部门投诉</p>
</section>
<section>
<h2>未成年人保护</h2>
<p>我们非常重视未成年人的个人信息保护如果您是未成年人建议您请您的父母或监护人仔细阅读本隐私政策并在征得您的父母或监护人同意的前提下使用我们的服务</p>
</section>
<section>
<h2>隐私政策更新</h2>
<p>我们可能会不时更新本隐私政策我们会在本页面上发布新的隐私政策并通过适当方式通知您如果您不同意更新后的隐私政策您可以选择停止使用我们的服务</p>
</section>
<section>
<h2>联系我们</h2>
<p>如果您对本隐私政策有任何疑问意见或建议或需要行使您的相关权利请通过以下方式联系我们</p>
<p>邮箱privacy@example.com</p>
</section>
<div class="update-time">
<p>最后更新时间2024年1月1日</p>
</div>
</div>
</div>
</BasePage>
</template>
<style scoped lang="scss">
.privacy-page {
padding: 2rem;
max-width: 800px;
margin: 0 auto;
}
.page-title {
font-size: 2rem;
font-weight: 600;
margin: 2rem 0;
text-align: center;
color: var(--color-text);
}
.content {
line-height: 1.8;
color: var(--color-text);
section {
margin-bottom: 2rem;
h2 {
font-size: 1.3rem;
font-weight: 600;
margin-bottom: 1rem;
color: var(--color-text);
}
p {
margin-bottom: 0.8rem;
text-align: justify;
color: var(--color-text-secondary, #666);
strong {
color: var(--color-text);
}
}
}
}
.update-time {
margin-top: 3rem;
padding-top: 2rem;
border-top: 1px solid var(--color-border, #eee);
text-align: center;
p {
color: var(--color-text-secondary, #999);
font-size: 0.9rem;
}
}
</style>

View File

@@ -0,0 +1,131 @@
<script setup lang="ts">
import BasePage from "@/components/BasePage.vue";
import BackIcon from "@/components/BackIcon.vue";
</script>
<template>
<BasePage>
<div class="agreement-page">
<BackIcon />
<h1 class="page-title">用户协议</h1>
<div class="content">
<section>
<h2>总则</h2>
<p>欢迎使用本应用在使用本应用之前请您仔细阅读本用户协议以下简称"本协议"当您注册登录使用以下统称"使用"本应用时即表示您已阅读理解并同意接受本协议的全部内容</p>
</section>
<section>
<h2>服务内容</h2>
<p>本应用为用户提供单词学习文章阅读等在线教育服务我们保留随时修改或中断服务而不需通知用户的权利我们行使修改或中断服务的权利不需对用户或第三方负责</p>
</section>
<section>
<h2>用户账户</h2>
<p>1. 用户在使用本应用前需要注册一个账户用户应当使用真实准确完整的信息注册账户</p>
<p>2. 用户有责任维护账户信息的安全对账户下的所有活动负责</p>
<p>3. 用户不得将账户转让出售或以其他方式提供给第三方使用</p>
</section>
<section>
<h2>用户行为规范</h2>
<p>用户在使用本应用时应当遵守相关法律法规不得从事以下行为</p>
<p>1. 发布传播违法有害威胁辱骂骚扰侵权诽谤淫秽暴力或其他不当内容</p>
<p>2. 侵犯他人知识产权隐私权或其他合法权益</p>
<p>3. 干扰或破坏本应用的正常运行</p>
<p>4. 使用自动化工具或脚本进行数据采集批量操作等</p>
<p>5. 其他违反法律法规或本协议的行为</p>
</section>
<section>
<h2>知识产权</h2>
<p>1. 本应用的所有内容包括但不限于文字图片音频视频软件程序版面设计等均受知识产权法保护</p>
<p>2. 未经我们书面许可用户不得复制传播展示镜像上传下载本应用的任何内容</p>
</section>
<section>
<h2>隐私保护</h2>
<p>我们重视用户的隐私保护关于我们如何收集使用存储和保护您的个人信息请详见隐私政策</p>
</section>
<section>
<h2>免责声明</h2>
<p>1. 用户明确同意使用本应用的风险由用户个人承担</p>
<p>2. 我们不对因不可抗力或非我们原因造成的服务中断或终止承担责任</p>
<p>3. 我们不对用户在使用本应用过程中产生的任何直接间接偶然特殊及后续的损害承担责任</p>
</section>
<section>
<h2>协议修改</h2>
<p>我们有权随时修改本协议的任何条款一旦本协议的内容发生变动我们将会通过适当方式向用户提示修改内容如果用户不同意我们对本协议相关条款所做的修改用户有权停止使用本应用如果用户继续使用本应用则视为用户接受我们对本协议相关条款所做的修改</p>
</section>
<section>
<h2>法律适用与争议解决</h2>
<p>1. 本协议的订立执行和解释及争议的解决均应适用中华人民共和国法律</p>
<p>2. 如双方就本协议内容或其执行发生任何争议双方应尽量友好协商解决协商不成时任何一方均可向我们所在地的人民法院提起诉讼</p>
</section>
<section>
<h2>其他</h2>
<p>1. 本协议构成双方对本协议之约定事项及其他有关事宜的完整协议除本协议规定的之外未赋予本协议各方其他权利</p>
<p>2. 如本协议中的任何条款无论因何种原因完全或部分无效或不具有执行力本协议的其余条款仍应有效并且有约束力</p>
</section>
<div class="update-time">
<p>最后更新时间2024年1月1日</p>
</div>
</div>
</div>
</BasePage>
</template>
<style scoped lang="scss">
.agreement-page {
padding: 2rem;
max-width: 800px;
margin: 0 auto;
}
.page-title {
font-size: 2rem;
font-weight: 600;
margin: 2rem 0;
text-align: center;
color: var(--color-text);
}
.content {
line-height: 1.8;
color: var(--color-text);
section {
margin-bottom: 2rem;
h2 {
font-size: 1.3rem;
font-weight: 600;
margin-bottom: 1rem;
color: var(--color-text);
}
p {
margin-bottom: 0.8rem;
text-align: justify;
color: var(--color-text-secondary, #666);
}
}
}
.update-time {
margin-top: 3rem;
padding-top: 2rem;
border-top: 1px solid var(--color-border, #eee);
text-align: center;
p {
color: var(--color-text-secondary, #999);
font-size: 0.9rem;
}
}
</style>

File diff suppressed because it is too large Load Diff

View File

@@ -12,7 +12,8 @@ import BookList from "@/pages/article/BookList.vue";
import Setting from "@/pages/setting/Setting.vue";
import Login from "@/pages/user/login.vue";
import User from "@/pages/user/index.vue";
import WechatCallback from "@/pages/user/wechat-callback.vue";
import UserAgreement from "@/pages/user/UserAgreement.vue";
import PrivacyPolicy from "@/pages/user/PrivacyPolicy.vue";
import { useAuthStore } from "@/stores/auth.ts";
export const routes: RouteRecordRaw[] = [
@@ -37,6 +38,8 @@ export const routes: RouteRecordRaw[] = [
{path: 'setting', component: Setting},
{path: 'login', component: Login},
{path: 'user', component: User},
{path: 'user-agreement', component: UserAgreement},
{path: 'privacy-policy', component: PrivacyPolicy},
]
},
{path: '/batch-edit-article', component: () => import("@/pages/article/BatchEditArticlePage.vue")},
@@ -63,7 +66,7 @@ router.beforeEach(async (to: any, from: any) => {
const authStore = useAuthStore()
// 公共路由,不需要登录验证
const publicRoutes = ['/login', '/wechat/callback']
const publicRoutes = ['/login', '/wechat/callback', '/user-agreement', '/privacy-policy']
// 如果目标路由是公共路由,直接放行
if (publicRoutes.includes(to.path)) {