Merge branch 'master' into feat/mobile
This commit is contained in:
Binary file not shown.
|
Before Width: | Height: | Size: 200 KiB |
@@ -1896,9 +1896,6 @@
|
||||
"tags": [
|
||||
"通用"
|
||||
],
|
||||
"words": [
|
||||
"private","fuck","add","remove"
|
||||
],
|
||||
"url": "GaoKaoZhenTiHeXinGaoPin.json",
|
||||
"length": 799,
|
||||
"language": "en",
|
||||
|
||||
16
public/manifest.json
Normal file
16
public/manifest.json
Normal file
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"name": "Type Words - 词文记 | 单词跟打 · 文章跟打",
|
||||
"short_name": "",
|
||||
"start_url": ".",
|
||||
"description": "在线英语打字练习平台,支持单词跟打与文章跟打,帮助提升打字速度与英语学习效率。",
|
||||
"display": "standalone",
|
||||
"background_color": "#ffffff",
|
||||
"theme_color": "#ffffff",
|
||||
"icons": [
|
||||
{
|
||||
"src": "/favicon.png",
|
||||
"sizes": "800x800",
|
||||
"type": "image/png"
|
||||
}
|
||||
]
|
||||
}
|
||||
86
public/migrate.html
Normal file
86
public/migrate.html
Normal file
@@ -0,0 +1,86 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>TypeWords 数据迁移(旧域名)</title>
|
||||
</head>
|
||||
<body>
|
||||
<h2>等待新域名发送迁移指令...</h2>
|
||||
<pre id="log"></pre>
|
||||
|
||||
<script>
|
||||
function log(msg) {
|
||||
console.log(msg);
|
||||
document.getElementById('log').textContent += msg + "\n";
|
||||
}
|
||||
|
||||
// 1️⃣ 先动态加载 idb-keyval
|
||||
function loadIDBKeyval() {
|
||||
return new Promise((resolve) => {
|
||||
let script = document.createElement("script");
|
||||
script.src = 'https://cdn.jsdelivr.net/npm/idb-keyval@6.2.2/dist/umd.js';
|
||||
script.onload = function () {
|
||||
log("idb-keyval 加载完成");
|
||||
resolve(window.idbKeyval);
|
||||
};
|
||||
document.head.appendChild(script);
|
||||
});
|
||||
}
|
||||
|
||||
loadIDBKeyval(); // 确保 idb-keyval 已经加载
|
||||
|
||||
// 2️⃣ 读取 IndexedDB
|
||||
async function readAllStorageForMigration(db) {
|
||||
// localStorage 数据
|
||||
const localStorageData = {
|
||||
PracticeSaveWord: localStorage.getItem('PracticeSaveWord'),
|
||||
PracticeSaveArticle: localStorage.getItem('PracticeSaveArticle')
|
||||
};
|
||||
|
||||
// IndexedDB 数据,key 对应你的老项目
|
||||
const keys = [
|
||||
'type-words-app-version',
|
||||
'typing-word-dict',
|
||||
'typing-word-setting',
|
||||
'typing-word-files'
|
||||
];
|
||||
|
||||
const indexedDBData = {};
|
||||
for (let key of keys) {
|
||||
let res = await db.get(key);
|
||||
if (res) indexedDBData[key] = res
|
||||
}
|
||||
|
||||
return {
|
||||
localStorage: localStorageData,
|
||||
indexedDB: indexedDBData
|
||||
};
|
||||
}
|
||||
|
||||
// 3️⃣ 接收新域名指令
|
||||
window.addEventListener('message', async (event) => {
|
||||
if (event.data?.type !== 'REQUEST_MIGRATION_DATA') return;
|
||||
|
||||
// 安全校验 origin,可选
|
||||
// if (event.origin !== 'https://typewords.cc') return;
|
||||
|
||||
log("收到迁移指令,开始读取数据...");
|
||||
|
||||
const db = await loadIDBKeyval(); // 确保 idb-keyval 已经加载
|
||||
const data = await readAllStorageForMigration(db);
|
||||
|
||||
log("读取完成,发送数据给新域名");
|
||||
event.source.postMessage({
|
||||
type: 'MIGRATION_RESULT',
|
||||
payload: data
|
||||
}, event.origin);
|
||||
|
||||
log("已发送迁移数据");
|
||||
// 自动关闭窗口(延迟 500ms)
|
||||
setTimeout(() => {
|
||||
window.close();
|
||||
}, 500);
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
100
public/privacy-policy.html
Normal file
100
public/privacy-policy.html
Normal file
@@ -0,0 +1,100 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>隐私政策</title>
|
||||
</head>
|
||||
<body
|
||||
style="display:flex;justify-content:center">
|
||||
<div class="privacy-page"
|
||||
style="width: 60vw;"
|
||||
>
|
||||
<h1 style="text-align: center">隐私政策</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>邮箱:zyronon@163.com</p>
|
||||
</section>
|
||||
|
||||
<div class="update-time">
|
||||
<p>最后更新时间:2025年11月11日</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
BIN
public/qq.jpg
Normal file
BIN
public/qq.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 183 KiB |
@@ -1,4 +1,4 @@
|
||||
User-agent: *
|
||||
Disallow:
|
||||
|
||||
Sitemap: https://2study.top/sitemap.xml
|
||||
Sitemap: https://typewords.cc/sitemap.xml
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
!function(){"use strict";(t=>{const{screen:{width:e,height:a},navigator:{language:n,doNotTrack:i,msDoNotTrack:r},location:o,document:s,history:c,top:u,doNotTrack:d}=t,{currentScript:l,referrer:h}=s;if(!l)return;const{hostname:f,href:m,origin:p}=o,y=m.startsWith("data:")?void 0:t.localStorage,g="data-",b="true",v=l.getAttribute.bind(l),w=v(g+"website-id"),S=v(g+"host-url"),k=v(g+"before-send"),N=v(g+"tag")||void 0,T="false"!==v(g+"auto-track"),A=v(g+"do-not-track")===b,j=v(g+"exclude-search")===b,x=v(g+"exclude-hash")===b,$=v(g+"domains")||"",E=$.split(",").map(t=>t.trim()),K=`${(S||"https://api-gateway.umami.dev"||l.src.split("/").slice(0,-1).join("/")).replace(/\/$/,"")}/api/send`,L=`${e}x${a}`,O=/data-umami-event-([\w-_]+)/,_=g+"umami-event",D=300,U=()=>({website:w,screen:L,language:n,title:s.title,hostname:f,url:z,referrer:F,tag:N,id:q||void 0}),W=(t,e,a)=>{a&&(F=z,z=new URL(a,o.href),j&&(z.search=""),x&&(z.hash=""),z=z.toString(),z!==F&&setTimeout(J,D))},B=()=>H||!w||y&&y.getItem("umami.disabled")||$&&!E.includes(f)||A&&(()=>{const t=d||i||r;return 1===t||"1"===t||"yes"===t})(),C=async(e,a="event")=>{if(B())return;const n=t[k];if("function"==typeof n&&(e=n(a,e)),e)try{const t=await fetch(K,{keepalive:!0,method:"POST",body:JSON.stringify({type:a,payload:e}),headers:{"Content-Type":"application/json",...void 0!==R&&{"x-umami-cache":R}},credentials:"omit"}),n=await t.json();n&&(H=!!n.disabled,R=n.cache)}catch(t){}},I=()=>{G||(G=!0,J(),(()=>{const t=(t,e,a)=>{const n=t[e];return(...e)=>(a.apply(null,e),n.apply(t,e))};c.pushState=t(c,"pushState",W),c.replaceState=t(c,"replaceState",W)})(),(()=>{const t=async t=>{const e=t.getAttribute(_);if(e){const a={};return t.getAttributeNames().forEach(e=>{const n=e.match(O);n&&(a[n[1]]=t.getAttribute(e))}),J(e,a)}};s.addEventListener("click",async e=>{const a=e.target,n=a.closest("a,button");if(!n)return t(a);const{href:i,target:r}=n;if(n.getAttribute(_)){if("BUTTON"===n.tagName)return t(n);if("A"===n.tagName&&i){const a="_blank"===r||e.ctrlKey||e.shiftKey||e.metaKey||e.button&&1===e.button;return a||e.preventDefault(),t(n).then(()=>{a||(("_top"===r?u.location:o).href=i)})}}},!0)})())},J=(t,e)=>C("string"==typeof t?{...U(),name:t,data:e}:"object"==typeof t?{...t}:"function"==typeof t?t(U()):U()),P=(t,e)=>("string"==typeof t&&(q=t),R="",C({...U(),data:"object"==typeof t?t:e},"identify"));t.umami||(t.umami={track:J,identify:P});let R,q,z=m,F=h.startsWith(p)?"":h,G=!1,H=!1;T&&!B()&&("complete"===s.readyState?I():s.addEventListener("readystatechange",I,!0))})(window)}();
|
||||
12
public/service-worker.js
Normal file
12
public/service-worker.js
Normal file
@@ -0,0 +1,12 @@
|
||||
// 'install' 事件在 Service Worker 首次被安装时触发。
|
||||
self.addEventListener('install', event => {
|
||||
self.skipWaiting();
|
||||
});
|
||||
|
||||
// 'activate' 事件在 Service Worker 变为激活状态时触发。
|
||||
self.addEventListener('activate', event => {
|
||||
return self.clients.claim();
|
||||
});
|
||||
|
||||
self.addEventListener('fetch', event => {
|
||||
});
|
||||
569
public/static-home.html
Normal file
569
public/static-home.html
Normal file
@@ -0,0 +1,569 @@
|
||||
<!doctype html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8"/>
|
||||
<title>Type Words 官网 - 词文记 | 单词跟打 · 文章跟打</title>
|
||||
<!-- 搜索引擎描述 -->
|
||||
<meta name="description"
|
||||
content="Type Words 官方网站 - 在线英语练习平台,支持单词、文章跟打练习,提升英语学习效率。Practice English, one strike, one step forward">
|
||||
<!-- 关键词(可选,搜索引擎基本不用,但能补充信息) -->
|
||||
<meta name="keywords"
|
||||
content="Type Words, Typing Word, Type Words 官网, 官方网站, 英语打字练习, 单词跟打, 文章跟打, 键盘练习, 英语学习, 文章学习, 打字练习软件, 单词记忆工具, 英语学习软件, 背单词神器, 英语肌肉记忆, 键盘工作者, 免费英语学习, 音标发音, 默写练习, 在线学英语, CET-4, CET-6, TOEFL, IELTS, GRE, GMAT, SAT, 考研英语, 专四专八, 程序员英语, JavaScript API, Node.js API, Java API, Linux命令, 编程词汇, 技术英语, VSCode插件, 开源项目, GitHub趋势榜, V2EX热搜, Gitee GVP, 少数派推荐, 英语打字训练, WPM统计, 准确率分析, 商务英语, BEC, 雅思听力, 日语学习, 多语言学习, 英语口语练习, 单词拼写训练">
|
||||
|
||||
<meta name="author" content="zyronon"/>
|
||||
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1"/>
|
||||
<link rel="canonical" href="https://typewords.cc/"/>
|
||||
|
||||
<!-- Open Graph(用于社交媒体分享,微信/QQ/知乎/Facebook 等) -->
|
||||
<meta property="og:title" content="Type Words 官网 - 英语打字练习平台">
|
||||
<meta property="og:description"
|
||||
content="Type Words 官方网站 - 在线英语练习平台,支持单词、文章跟打练习,提升英语学习效率。Practice English, one strike, one step forward">
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:url" content="https://typewords.cc/">
|
||||
<meta property="og:image" content="https://typewords.cc/favicon.png">
|
||||
|
||||
<!-- Twitter Card(用于 Twitter 分享) -->
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="Type Words 官网 - 英语打字练习平台">
|
||||
<meta name="twitter:description"
|
||||
content="Type Words 官方网站 - 在线英语练习平台,支持单词、文章跟打练习,提升英语学习效率。Practice English, one strike, one step forward">
|
||||
<meta name="twitter:image" content="https://typewords.cc/favicon.png">
|
||||
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.png"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<!-- 苹果设备(iOS Safari)在用户添加到主屏时显示的图标-->
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/favicon.png"/>
|
||||
<!-- 设置浏览器地址栏颜色(在 Android Chrome 特别明显)。-->
|
||||
<meta name="theme-color" content="#818CF8"/>
|
||||
<link rel="manifest" href="/manifest.json">
|
||||
|
||||
<!-- 阻止 iOS 自动把数字识别为电话号码。-->
|
||||
<!-- HandheldFriendly 和 MobileOptimized 是旧手机浏览器的优化提示(现在作用不大)。-->
|
||||
<meta name="format-detection" content="telephone=no"/>
|
||||
<meta name="HandheldFriendly" content="True"/>
|
||||
<meta name="MobileOptimized" content="320"/>
|
||||
|
||||
<!-- referrer 控制请求来源信息-->
|
||||
<meta name="referrer" content="origin-when-cross-origin"/>
|
||||
<!-- color-scheme 告诉浏览器支持亮/暗模式-->
|
||||
<meta name="color-scheme" content="light dark"/>
|
||||
|
||||
<style>
|
||||
body {
|
||||
background: rgb(231, 232, 235);
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 4.8rem !important;
|
||||
background: linear-gradient(120deg, #bd34fe 30%, #41d1ff);
|
||||
-webkit-text-fill-color: transparent;
|
||||
-webkit-background-clip: text;
|
||||
background-clip: text;
|
||||
color: transparent;
|
||||
margin: 0;
|
||||
font-weight: bold !important;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 1.4rem !important;
|
||||
font-weight: normal !important;
|
||||
color: rgb(91, 91, 91);
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.card {
|
||||
position: relative;
|
||||
border-radius: 1rem;
|
||||
padding: 1rem;
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
gap: 0.6rem;
|
||||
margin-bottom: 0;
|
||||
width: 25%;
|
||||
background: rgb(247, 247, 247);
|
||||
|
||||
.emoji {
|
||||
display: inline-block;
|
||||
background: rgb(226 232 240 / 1);
|
||||
padding: 0.3rem .6rem;
|
||||
border-radius: 0.4rem;
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
|
||||
.title {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
ul {
|
||||
margin: 0;
|
||||
padding-left: 1.2rem;
|
||||
}
|
||||
}
|
||||
|
||||
a {
|
||||
color: dodgerblue !important;
|
||||
}
|
||||
|
||||
.base-button {
|
||||
cursor: pointer;
|
||||
box-sizing: border-box;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
outline: none;
|
||||
text-align: center;
|
||||
transition: 0.1s;
|
||||
user-select: none;
|
||||
vertical-align: middle;
|
||||
white-space: nowrap;
|
||||
border-radius: 0.3rem;
|
||||
color: white;
|
||||
background: rgb(12, 140, 233);
|
||||
padding: 0 1.3rem;
|
||||
height: 2.5rem;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
.base-button + .base-button {
|
||||
margin-left: 2rem;
|
||||
}
|
||||
|
||||
.base-button:hover {
|
||||
opacity: 0.8;
|
||||
}
|
||||
|
||||
.icon {
|
||||
cursor: pointer;
|
||||
width: 2rem;
|
||||
height: 2rem;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border-radius: .3rem;
|
||||
background: transparent;
|
||||
transition: all .3s;
|
||||
color: dimgray;
|
||||
}
|
||||
|
||||
.icon:hover {
|
||||
background: rgb(12, 140, 233);
|
||||
color: white;
|
||||
}
|
||||
|
||||
.mask {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
background: rgba(0, 0, 0, 0.3);
|
||||
display: none;
|
||||
opacity: 0;
|
||||
transition: all .3s;
|
||||
}
|
||||
|
||||
.dialog {
|
||||
position: fixed;
|
||||
left: 50%;
|
||||
top: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
background: rgb(247, 247, 247);
|
||||
width: 30rem;
|
||||
border-radius: 1rem;
|
||||
display: none;
|
||||
opacity: 0;
|
||||
transition: all .3s;
|
||||
}
|
||||
|
||||
.dialog header {
|
||||
padding: 1rem;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.dialog header .title {
|
||||
font-size: 1.4rem;
|
||||
}
|
||||
|
||||
.dialog-body {
|
||||
padding: 0 1.2rem 1.2rem 1.2rem;
|
||||
}
|
||||
|
||||
.wrapper {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
min-height: 100vh;
|
||||
}
|
||||
|
||||
.content {
|
||||
margin-top: 6rem;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
gap: 2rem;
|
||||
}
|
||||
|
||||
.text-center {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.sky {
|
||||
margin-top: 3rem;
|
||||
border-top: 1px solid #cecece;
|
||||
border-bottom: 1px solid #cecece;
|
||||
padding: 1.2rem 0;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
gap: 0.4rem;
|
||||
width: 100%;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.w {
|
||||
width: 60vw;
|
||||
}
|
||||
|
||||
.sky-img {
|
||||
width: 100%;
|
||||
border-radius: 0.5rem;
|
||||
}
|
||||
|
||||
.card-wrap {
|
||||
display: flex;
|
||||
margin-bottom: 1.2rem;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.bottom {
|
||||
display: flex;
|
||||
gap: 1rem;
|
||||
margin: 1rem 0 2rem 0;
|
||||
width: 100%;
|
||||
padding-top: 1.5rem;
|
||||
border-top: 1px solid #c4c4c4;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.gap-1 {
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.center {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.img {
|
||||
width: 16rem;
|
||||
border-radius: 1rem;
|
||||
margin-top: 1.2rem;
|
||||
}
|
||||
|
||||
.cursor-pointer{
|
||||
cursor: pointer;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
if ('serviceWorker' in navigator) {
|
||||
window.addEventListener('load', () => {
|
||||
navigator.serviceWorker.register('/service-worker.js').then(registration => {
|
||||
console.log('ServiceWorker registration successful with scope: ', registration.scope);
|
||||
}).catch(error => {
|
||||
console.log('ServiceWorker registration failed: ', error);
|
||||
});
|
||||
});
|
||||
}
|
||||
</script>
|
||||
<script>
|
||||
function nav(url) {
|
||||
window.location.href = url;
|
||||
// history.pushState(null, "", url);
|
||||
}
|
||||
|
||||
function toggleEl(val, close = false) {
|
||||
let le = document.querySelector(val)
|
||||
if (le) {
|
||||
if (['none', ''].includes(le.style.display) && !close) {
|
||||
le.style.display = 'block';
|
||||
setTimeout(function () {
|
||||
le.style.opacity = 1;
|
||||
}, 10)
|
||||
} else {
|
||||
le.style.opacity = 0;
|
||||
setTimeout(function () {
|
||||
le.style.display = 'none';
|
||||
}, 300)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function toggleWechatDialog() {
|
||||
toggleEl('.mask')
|
||||
toggleEl('#wechatDialog')
|
||||
}
|
||||
|
||||
function toggleQQDialog() {
|
||||
toggleEl('.mask')
|
||||
toggleEl('#qqDialog')
|
||||
}
|
||||
|
||||
function toggleXhsDialog() {
|
||||
toggleEl('.mask')
|
||||
toggleEl('#xhsDialog')
|
||||
}
|
||||
|
||||
function closeDialog() {
|
||||
toggleEl('.mask')
|
||||
toggleEl('#wechatDialog', true)
|
||||
toggleEl('#xhsDialog', true)
|
||||
toggleEl('#qqDialog', true)
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="wrapper">
|
||||
<div class="content">
|
||||
<h1>Type Words</h1>
|
||||
<div class="text-center">
|
||||
<h2>学习英语,一次敲击,一点进步,开源单词与文章练习工具</h2>
|
||||
</div>
|
||||
<div class="">
|
||||
<div class="base-button" onclick="nav('/words')">单词练习</div>
|
||||
<div class="base-button" onclick="nav('/articles')">文章练习</div>
|
||||
</div>
|
||||
|
||||
<div class="sky">
|
||||
<a href="https://skywork.ai/p/GrXQb4" style="width: 40%;" target="_blank">
|
||||
<img src="https://typewords.cc/skywork-ai.png"
|
||||
alt="Skywork.AI"
|
||||
class="sky-img"></a>
|
||||
<span>赞助:<a href="https://skywork.ai/p/GrXQb4" class="color-blue!" target="_blank">Skywork.AI: 10 tasks in 1 hour, not 10 hours →Limited free spots: 127 left</a></span>
|
||||
</div>
|
||||
<div class="w">
|
||||
<div class="card-wrap">
|
||||
<div class="card">
|
||||
<div class="emoji">📚</div>
|
||||
<div class="title">单词练习</div>
|
||||
<div class="desc">
|
||||
<ul>
|
||||
<li>三种输入模式:跟打 / 复习 / 默写</li>
|
||||
<li>智能模式:智能规划复习与默写</li>
|
||||
<li>自由模式:不受限制,自行规划</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="emoji">✍️</div>
|
||||
<div class="title">文章练习</div>
|
||||
<div class="desc">
|
||||
<ul>
|
||||
<li>内置常见书籍,也可自行添加文章</li>
|
||||
<li>跟打 + 默写双模式,让背诵更高效</li>
|
||||
<li>支持边听边默写,强化记忆</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="emoji">📕</div>
|
||||
<div class="title">收藏、错词本、已掌握</div>
|
||||
<div class="desc">
|
||||
<ul>
|
||||
<li>输入错误自动添加到错词本</li>
|
||||
<li>主动添加到已掌握,后续自动跳过</li>
|
||||
<li>主动添加到收藏中,以便巩固复习</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="emoji">🌐</div>
|
||||
<div class="title">海量词库</div>
|
||||
<div class="desc">
|
||||
内置小学、初中、高中、四六级、考研、雅思、托福、GRE、GMAT、SAT、BEC、专四、专八等词库
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-wrap">
|
||||
<div class="card">
|
||||
<div class="emoji">🆓</div>
|
||||
<div class="title">免费开源</div>
|
||||
<div class="desc">
|
||||
<ul>
|
||||
<li>完全开源,可审查、可修改</li>
|
||||
<li>免费使用</li>
|
||||
<li>私有部署</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="emoji">⚙️</div>
|
||||
<div class="title">高度自由</div>
|
||||
<div class="desc">
|
||||
<ul>
|
||||
<li>丰富的键盘音效</li>
|
||||
<li>可自定义快捷键</li>
|
||||
<li>高度定制化的设置选项</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="emoji">🎨</div>
|
||||
<div class="title">简洁高效</div>
|
||||
<div class="desc">
|
||||
<ul>
|
||||
<li>简洁设计,现代化UI</li>
|
||||
<li>界面清爽,操作简单</li>
|
||||
<li>不强制关注任何平台</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="emoji">🎯</div>
|
||||
<div class="title">个性学习</div>
|
||||
<div class="desc">
|
||||
<ul>
|
||||
<li>自由添加词典与文章</li>
|
||||
<li>定制个性学习计划</li>
|
||||
<li>多种学习复习策略</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="bottom">
|
||||
<div class="center gap-1">
|
||||
<a
|
||||
href="https://github.com/zyronon/TypeWords"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
aria-label="Github Address">
|
||||
<div class="icon">
|
||||
<svg viewBox="0 0 24 24" width="1.4em" height="1.4em">
|
||||
<path fill="currentColor"
|
||||
d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path>
|
||||
</svg>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
<div class="icon" onclick="toggleWechatDialog()">
|
||||
<svg viewBox="0 0 24 24" width="1.4em" height="1.4em">
|
||||
<path fill="currentColor"
|
||||
d="M8.691 2.188C3.891 2.188 0 5.476 0 9.53c0 2.212 1.17 4.203 3.002 5.55a.59.59 0 0 1 .213.665l-.39 1.48c-.019.07-.048.141-.048.213c0 .163.13.295.29.295a.33.33 0 0 0 .167-.054l1.903-1.114a.86.86 0 0 1 .717-.098a10.2 10.2 0 0 0 2.837.403c.276 0 .543-.027.811-.05c-.857-2.578.157-4.972 1.932-6.446c1.703-1.415 3.882-1.98 5.853-1.838c-.576-3.583-4.196-6.348-8.596-6.348M5.785 5.991c.642 0 1.162.529 1.162 1.18a1.17 1.17 0 0 1-1.162 1.178A1.17 1.17 0 0 1 4.623 7.17c0-.651.52-1.18 1.162-1.18zm5.813 0c.642 0 1.162.529 1.162 1.18a1.17 1.17 0 0 1-1.162 1.178a1.17 1.17 0 0 1-1.162-1.178c0-.651.52-1.18 1.162-1.18m5.34 2.867c-1.797-.052-3.746.512-5.28 1.786c-1.72 1.428-2.687 3.72-1.78 6.22c.942 2.453 3.666 4.229 6.884 4.229c.826 0 1.622-.12 2.361-.336a.72.72 0 0 1 .598.082l1.584.926a.3.3 0 0 0 .14.047c.134 0 .24-.111.24-.247c0-.06-.023-.12-.038-.177l-.327-1.233a.6.6 0 0 1-.023-.156a.49.49 0 0 1 .201-.398C23.024 18.48 24 16.82 24 14.98c0-3.21-2.931-5.837-6.656-6.088V8.89c-.135-.01-.27-.027-.407-.03zm-2.53 3.274c.535 0 .969.44.969.982a.976.976 0 0 1-.969.983a.976.976 0 0 1-.969-.983c0-.542.434-.982.97-.982zm4.844 0c.535 0 .969.44.969.982a.976.976 0 0 1-.969.983a.976.976 0 0 1-.969-.983c0-.542.434-.982.969-.982"></path>
|
||||
</svg>
|
||||
</div>
|
||||
|
||||
<div class="icon" onclick="toggleQQDialog()">
|
||||
<svg viewBox="0 0 24 24" width="1.4em" height="1.4em">
|
||||
<g fill="none">
|
||||
<path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"/>
|
||||
<path fill="currentColor"
|
||||
d="M12 2a6.285 6.285 0 0 0-6.276 5.937l-.146 2.63a28 28 0 0 0-.615 1.41c-1.24 3.073-1.728 5.773-1.088 6.032c.335.135.913-.426 1.566-1.432a6.67 6.67 0 0 0 1.968 3.593c-1.027.35-1.91.828-1.91 1.33c0 .509 2.48.503 4.239.5h.001c.549-.002 1.01-.008 1.38-.057a6.7 6.7 0 0 0 1.76 0c.37.05.833.055 1.382.056c1.76.004 4.239.01 4.239-.499c0-.502-.883-.979-1.909-1.33a6.67 6.67 0 0 0 1.967-3.586c.65 1.002 1.227 1.56 1.56 1.425c.64-.259.154-2.96-1.088-6.032a28 28 0 0 0-.607-1.395l-.147-2.645A6.285 6.285 0 0 0 12 2"/>
|
||||
</g>
|
||||
</svg>
|
||||
</div>
|
||||
<div class="icon" onclick="toggleXhsDialog()">
|
||||
<svg viewBox="0 0 24 24" width="1.4em" height="1.4em">
|
||||
<path fill="currentColor"
|
||||
d="M22.405 9.879c.002.016.01.02.07.019h.725a.797.797 0 0 0 .78-.972a.794.794 0 0 0-.884-.618a.795.795 0 0 0-.692.794c0 .101-.002.666.001.777m-11.509 4.808c-.203.001-1.353.004-1.685.003a2.5 2.5 0 0 1-.766-.126a.025.025 0 0 0-.03.014L7.7 16.127a.025.025 0 0 0 .01.032c.111.06.336.124.495.124c.66.01 1.32.002 1.981 0q.017 0 .023-.015l.712-1.545a.025.025 0 0 0-.024-.036zM.477 9.91c-.071 0-.076.002-.076.01l-.01.08c-.027.397-.038.495-.234 3.06c-.012.24-.034.389-.135.607c-.026.057-.033.042.003.112c.046.092.681 1.523.787 1.74c.008.015.011.02.017.02c.008 0 .033-.026.047-.044q.219-.282.371-.606c.306-.635.44-1.325.486-1.706c.014-.11.021-.22.03-.33l.204-2.616l.022-.293c.003-.029 0-.033-.03-.034zm7.203 3.757a1.4 1.4 0 0 1-.135-.607c-.004-.084-.031-.39-.235-3.06a.4.4 0 0 0-.01-.082c-.004-.011-.052-.008-.076-.008h-1.48c-.03.001-.034.005-.03.034l.021.293q.114 1.473.233 2.946c.05.4.186 1.085.487 1.706c.103.215.223.419.37.606c.015.018.037.051.048.049c.02-.003.742-1.642.804-1.765c.036-.07.03-.055.003-.112m3.861-.913h-.872a.126.126 0 0 1-.116-.178l1.178-2.625a.025.025 0 0 0-.023-.035l-1.318-.003a.148.148 0 0 1-.135-.21l.876-1.954a.025.025 0 0 0-.023-.035h-1.56q-.017 0-.024.015l-.926 2.068c-.085.169-.314.634-.399.938a.5.5 0 0 0-.02.191a.46.46 0 0 0 .23.378a1 1 0 0 0 .46.119h.59c.041 0-.688 1.482-.834 1.972a.5.5 0 0 0-.023.172a.47.47 0 0 0 .23.398c.15.092.342.12.475.12l1.66-.001q.017 0 .023-.015l.575-1.28a.025.025 0 0 0-.024-.035m-6.93-4.937H3.1a.032.032 0 0 0-.034.033c0 1.048-.01 2.795-.01 6.829c0 .288-.269.262-.28.262h-.74c-.04.001-.044.004-.04.047c.001.037.465 1.064.555 1.263c.01.02.03.033.051.033c.157.003.767.009.938-.014c.153-.02.3-.06.438-.132c.3-.156.49-.419.595-.765c.052-.172.075-.353.075-.533q.003-3.495-.007-6.991a.03.03 0 0 0-.032-.032zm11.784 6.896q-.002-.02-.024-.022h-1.465c-.048-.001-.049-.002-.05-.049v-4.66c0-.072-.005-.07.07-.07h.863c.08 0 .075.004.075-.074V8.393c0-.082.006-.076-.08-.076h-3.5c-.064 0-.075-.006-.075.073v1.445c0 .083-.006.077.08.077h.854c.075 0 .07-.004.07.07v4.624c0 .095.008.084-.085.084c-.37 0-1.11-.002-1.304 0c-.048.001-.06.03-.06.03l-.697 1.519s-.014.025-.008.036s.013.008.058.008q2.622.003 5.243.002c.03-.001.034-.006.035-.033zm4.177-3.43q0 .021-.02.024c-.346.006-.692.004-1.037.004q-.021-.003-.022-.024q-.006-.651-.01-1.303c0-.072-.006-.071.07-.07l.733-.003c.041 0 .081.002.12.015c.093.025.16.107.165.204c.006.431.002 1.153.001 1.153m2.67.244a1.95 1.95 0 0 0-.883-.222h-.18c-.04-.001-.04-.003-.042-.04V10.21q.001-.198-.025-.394a1.8 1.8 0 0 0-.153-.53a1.53 1.53 0 0 0-.677-.71a2.2 2.2 0 0 0-1-.258c-.153-.003-.567 0-.72 0c-.07 0-.068.004-.068-.065V7.76c0-.031-.01-.041-.046-.039H17.93s-.016 0-.023.007q-.008.008-.008.023v.546c-.008.036-.057.015-.082.022h-.95c-.022.002-.028.008-.03.032v1.481c0 .09-.004.082.082.082h.913c.082 0 .072.128.072.128v1.148s.003.117-.06.117h-1.482c-.068 0-.06.082-.06.082v1.445s-.01.068.064.068h1.457c.082 0 .076-.006.076.079v3.225c0 .088-.007.081.082.081h1.43c.09 0 .082.007.082-.08v-3.27c0-.029.006-.035.033-.035l2.323-.003a.7.7 0 0 1 .28.061a.46.46 0 0 1 .274.407c.008.395.003.79.003 1.185c0 .259-.107.367-.33.367h-1.218c-.023.002-.029.008-.028.033q.276.655.57 1.303a.05.05 0 0 0 .04.026c.17.005.34.002.51.003c.15-.002.517.004.666-.01a2 2 0 0 0 .408-.075c.59-.18.975-.698.976-1.313v-1.981q.001-.191-.034-.38c0 .078-.029-.641-.724-.998"></path>
|
||||
</svg>
|
||||
</div>
|
||||
|
||||
<a
|
||||
href="https://x.com/typewords2"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
aria-label="关注我的 X 账户 typewords2">
|
||||
<div class="icon">
|
||||
<svg viewBox="0 0 24 24" width="1.4em" height="1.4em">
|
||||
<path fill="currentColor"
|
||||
d="M22.213 5.656a8.4 8.4 0 0 1-2.402.658A4.2 4.2 0 0 0 21.649 4c-.82.488-1.719.83-2.655 1.015a4.182 4.182 0 0 0-7.126 3.814a11.87 11.87 0 0 1-8.621-4.37a4.17 4.17 0 0 0-.566 2.103c0 1.45.739 2.731 1.86 3.481a4.2 4.2 0 0 1-1.894-.523v.051a4.185 4.185 0 0 0 3.355 4.102a4.2 4.2 0 0 1-1.89.072A4.185 4.185 0 0 0 8.02 16.65a8.4 8.4 0 0 1-6.192 1.732a11.83 11.83 0 0 0 6.41 1.88c7.694 0 11.9-6.373 11.9-11.9q0-.271-.012-.541a8.5 8.5 0 0 0 2.086-2.164"></path>
|
||||
</svg>
|
||||
</div>
|
||||
</a>
|
||||
<a
|
||||
href="mailto:zyronon@163.com"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
aria-label="发送邮件到 zyronon@163.com">
|
||||
<div class="icon">
|
||||
<svg viewBox="0 0 24 24" width="1.4em" height="1.4em">
|
||||
<path fill="currentColor"
|
||||
d="M4 20q-.825 0-1.412-.587T2 18V6q0-.825.588-1.412T4 4h16q.825 0 1.413.588T22 6v12q0 .825-.587 1.413T20 20zm8-7l8-5V6l-8 5l-8-5v2z"></path>
|
||||
</svg>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div><a href="https://beian.mps.gov.cn/#/query/webSearch?code=51015602001426" target="_blank">川公网安备51015602001426号 </a></div>
|
||||
|
||||
<div><a href="https://beian.miit.gov.cn/" target="_blank">蜀ICP备2025157466号-2</a></div>
|
||||
</div>
|
||||
|
||||
<div class="mask" onclick="closeDialog()"></div>
|
||||
|
||||
<div class="dialog" id="wechatDialog">
|
||||
<header>
|
||||
<div class="title">微信群</div>
|
||||
<svg
|
||||
onclick="toggleWechatDialog()"
|
||||
viewBox="0 0 20 20" width="24" height="1.2em" class="cursor-pointer">
|
||||
<path fill="currentColor"
|
||||
d="m4.089 4.216l.057-.07a.5.5 0 0 1 .638-.057l.07.057L10 9.293l5.146-5.147a.5.5 0 0 1 .638-.057l.07.057a.5.5 0 0 1 .057.638l-.057.07L10.707 10l5.147 5.146a.5.5 0 0 1 .057.638l-.057.07a.5.5 0 0 1-.638.057l-.07-.057L10 10.707l-5.146 5.147a.5.5 0 0 1-.638.057l-.07-.057a.5.5 0 0 1-.057-.638l.057-.07L9.293 10L4.146 4.854a.5.5 0 0 1-.057-.638l.057-.07z"></path>
|
||||
</svg>
|
||||
</header>
|
||||
<div class="dialog-body">
|
||||
<span>加入我们的用户社群后,您可以与我们的开发团队进行沟通,分享您的使用体验和建议,帮助我们改进产品,同时也能够及时了解我们的最新动态和更新内容。</span>
|
||||
<div class="center">
|
||||
<img src="/wechat.png" alt="微信群二维码" class="img">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="dialog" id="xhsDialog">
|
||||
<header>
|
||||
<div class="title">小红书</div>
|
||||
<svg
|
||||
onclick="toggleXhsDialog()"
|
||||
viewBox="0 0 20 20" width="24" height="1.2em" class="cursor-pointer">
|
||||
<path fill="currentColor"
|
||||
d="m4.089 4.216l.057-.07a.5.5 0 0 1 .638-.057l.07.057L10 9.293l5.146-5.147a.5.5 0 0 1 .638-.057l.07.057a.5.5 0 0 1 .057.638l-.057.07L10.707 10l5.147 5.146a.5.5 0 0 1 .057.638l-.057.07a.5.5 0 0 1-.638.057l-.07-.057L10 10.707l-5.146 5.147a.5.5 0 0 1-.638.057l-.07-.057a.5.5 0 0 1-.057-.638l.057-.07L9.293 10L4.146 4.854a.5.5 0 0 1-.057-.638l.057-.07z"></path>
|
||||
</svg>
|
||||
</header>
|
||||
<div class="dialog-body">
|
||||
<span>关注小红书后,您可以获得开发团队的最新动态和更新内容,反馈您的使用体验和建议,帮助我们改进产品,同时也能够及时了解我们的最新动态和更新内容。</span>
|
||||
<div class="center">
|
||||
<img src="/xhs.png" alt="小红书二维码" class="img">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="dialog" id="qqDialog">
|
||||
<header>
|
||||
<div class="title">QQ群</div>
|
||||
<svg
|
||||
onclick="toggleQQDialog()"
|
||||
viewBox="0 0 20 20" width="24" height="1.2em" class="cursor-pointer">
|
||||
<path fill="currentColor"
|
||||
d="m4.089 4.216l.057-.07a.5.5 0 0 1 .638-.057l.07.057L10 9.293l5.146-5.147a.5.5 0 0 1 .638-.057l.07.057a.5.5 0 0 1 .057.638l-.057.07L10.707 10l5.147 5.146a.5.5 0 0 1 .057.638l-.057.07a.5.5 0 0 1-.638.057l-.07-.057L10 10.707l-5.146 5.147a.5.5 0 0 1-.638.057l-.07-.057a.5.5 0 0 1-.057-.638l.057-.07L9.293 10L4.146 4.854a.5.5 0 0 1-.057-.638l.057-.07z"></path>
|
||||
</svg>
|
||||
</header>
|
||||
<div class="dialog-body">
|
||||
<span>加入我们的用户社群后,您可以与我们的开发团队进行沟通,分享您的使用体验和建议,帮助我们改进产品,同时也能够及时了解我们的最新动态和更新内容。</span>
|
||||
<div class="center">
|
||||
<img src="/qq.jpg" alt="QQ群二维码" class="img">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
83
public/user-agreement.html
Normal file
83
public/user-agreement.html
Normal file
@@ -0,0 +1,83 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>用户协议</title>
|
||||
</head>
|
||||
<body
|
||||
style="display:flex;justify-content:center">
|
||||
<div class="privacy-page"
|
||||
style="width: 60vw;"
|
||||
>
|
||||
<h1 style="text-align: center">用户协议</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>最后更新时间:2025年11月11日</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 103 KiB After Width: | Height: | Size: 59 KiB |
BIN
public/word.png
BIN
public/word.png
Binary file not shown.
|
Before Width: | Height: | Size: 166 KiB |
Reference in New Issue
Block a user