Merge branch 'master' into dev

# Conflicts:
#	.github/workflows/deploy-pages.yml
#	README.md
#	components.d.ts
#	index.html
#	package.json
#	pnpm-lock.yaml
#	src/App.vue
#	src/components/Backgorund.vue
#	src/components/Setting.vue
#	src/components/toolbar/FeedbackModal.vue
#	src/components/toolbar/index.vue
#	src/pages/dict/components/WordDictDetail.vue
#	src/pages/practice/practice-word/Typing.vue
#	src/pages/practice/practice-word/TypingWord.vue
#	src/stores/base.ts
#	src/stores/setting.ts
This commit is contained in:
zyronon
2025-08-10 01:35:02 +08:00
7 changed files with 166 additions and 107 deletions

View File

@@ -1,20 +0,0 @@
---
name: 功能请求 | Feature request
about: 创建一个功能请求 | Create a feature request
title: 功能请求 | Feature request
labels: ''
assignees: ''
---
1、描述
请尽可能详细描述您需要的特性。
2、这个功能解决了什么问题
请尽可能详尽地说明这个需求的用例和场景
1. Description
Please provide as detailed a description as possible of the features you need.
2. What problem does this feature solve?
Please provide as detailed a description of the use cases and scenarios for this requirement as possible

View File

@@ -1,33 +0,0 @@
---
name: 单词错误 | Word error
about: 创建一个单词释义错误、音标错误的报告 | Create a report of incorrect word definitions and phonetic
errors
title: 单词错误 | Word error
labels: ''
assignees: ''
---
1、词典名字
在这里填写词典名字
2、单词
在这里填写单词
3、错误内容
在这里填写错误内容
4、截图
可以直接按Ctrl + V 复制在这里(复制成功后会显示一串地址)
1. Dictionary name
Fill in the dictionary name here
2. Words
Fill in the words here
3. Error content
Fill in the incorrect content here
4. Screenshot
You can directly press Ctrl+V to copy here (a string of addresses will be displayed after successful copying)

View File

@@ -1,24 +0,0 @@
---
name: '问题报告 | Bug report '
about: '创建一个问题报告 | Create a bug report '
title: '问题报告 | Bug report '
labels: ''
assignees: ''
---
### 注意:请确认问题可以在浏览器的 无痕模式 下复现,而不是自己安装的其他插件或脚本导致的
1、描述
在这里填写问题描述
2、截图
可以直接按Ctrl + V 复制在这里(复制成功后会显示一串地址)
### Note: Please confirm that the problem can be reproduced in the browser's traceless mode, rather than being caused by other plugins or scripts installed by yourself
1. Description
Fill in the problem description here
2. Screenshot
You can directly press Ctrl+V to copy here (a string of addresses will be displayed after successful copying)

6
Dockerfile Normal file
View File

@@ -0,0 +1,6 @@
FROM node
COPY . /root/typing-word
WORKDIR /root/typing-word
EXPOSE 3000
RUN npm install
CMD ["npm", "start"]

View File

@@ -10,13 +10,16 @@
<a href="https://github.com/zyronon/type-word/blob/master/LICENSE"><img src="https://img.shields.io/github/license/zyronon/type-word" alt="License"></a>
<a><img src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg"/></a>
<a><img src="https://img.shields.io/badge/Powered%20by-Vue-blue"/></a>
<a href="https://hellogithub.com/repository/eb70616d65604458908fc1736e7d41fc" target="_blank"><img src="https://abroad.hellogithub.com/v1/widgets/recommend.svg?rid=eb70616d65604458908fc1736e7d41fc&claim_uid=k5e4ZAqRjJEGzCW&theme=small" alt="FeaturedHelloGitHub" /></a>
</p>
<div align=center>
<a href="https://trendshift.io/repositories/14139" target="_blank" class="trendshift-badge"><img src="https://trendshift.io/api/badge/repositories/14139" alt="TypeWords | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
</div>
## 📸 在线访问
Github Pages: <https://typing-word.ttentau.top>(国内推荐访问这个)
Netlify: <https://typing-words.netlify.app/>(需要翻墙)
Github Pages: <https://2study.top>
## 🛠 功能列表
@@ -57,22 +60,9 @@ API 等词库。 尽可能满足大部分用户对背单词的需求,也非常
- 王陆雅思王听力语料库
- 日语常见词、N1 N5
## 📗 API 词库
- JavaScript API、Node.js API、Java API、Linux Command、C#: List API
词库均来源于(除文章以外)[qwerty-learner](https://github.com/RealKai42/qwerty-learner/)
如果您需要背诵其他词库,欢迎在 Issue 中提出
## 🎙 功能与建议
目前项目处于开发初期,新功能正在持续添加中,如果你对软件有任何功能与建议,欢迎在 Issues 中提出
如果你也喜欢本软件的设计思想,欢迎提交 pr非常感谢你对我们的支持
### 灵感来源
[qwerty-learner](https://github.com/RealKai42/qwerty-learner/) 很喜欢作者的这个项目,但是它没有背单词所必备的 **生词本、错词本、已掌握** 的功能,可能是作者反复强调和提醒这个项目是“**为键盘工作者设计的单词记忆与英语肌肉记忆锻炼软件**”而不是一个“**背单词**”的软件吧,尽管绝大多数用户都是用它来背单词😂😂😂。
本项目参考其思路使用 Vue 重写了,并添加了 **生词本、错词本、已掌握****文章练习** 等功能

View File

@@ -14,19 +14,19 @@
})();
</script>
<script>
var _hmt = _hmt || [];
(function () {
var hm = document.createElement("script");
if (location.href.includes('netlify.app')) {
hm.src = "https://hm.baidu.com/hm.js?d77525f1ad23698a2f34f54ff69c7750";
} else if (location.href.includes('github.io')) {
hm.src = "https://hm.baidu.com/hm.js?d77525f1ad23698a2f34f54ff69c7750";
} else {
hm.src = "https://hm.baidu.com/hm.js?c558fd8cc39d4cc233a9db44ff5b6e3f";
}
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
if (!location.href.includes('localhost')
&& !location.href.includes('192.168')
&& !location.href.includes('172.16')
&& !location.href.includes('10.0')
) {
var _hmt = _hmt || [];
(function () {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?3dae52fcd5375a19905462e4ad3eb54e";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
}
</script>
</head>
<body>

View File

@@ -0,0 +1,140 @@
<script setup lang="ts">
import BaseButton from "@/components/BaseButton.vue";
import {watch} from "vue";
import {useSettingStore} from "@/stores/setting.ts";
let settingStore = useSettingStore()
let show = $ref(false)
function toggleNotice() {
show = false
}
watch(() => settingStore.load, (n) => {
const params = new URLSearchParams(window.location.search);
if (params.get('from') === 'redirect') {
show = true
}
})
</script>
<template>
<transition name="right">
<div class="HostNotice" v-if="show">
<div class="notice">
<div>检查到您是通过老域名 typing-word.ttentau.top 访问的本网站特此弹窗提示</div>
<p>老域名已不再续费7天后过期将无法访问请更换为新域名 <span class="active"><a href="https://2study.top">2study.top</a></span>
访问</p>
</div>
<div class="wrapper">
<BaseButton size="large" @click="toggleNotice">关闭</BaseButton>
</div>
</div>
</transition>
</template>
<style scoped lang="scss">
.right-enter-active,
.right-leave-active {
transition: all .5s ease;
}
.right-enter-from,
.right-leave-to {
transform: translateX(110%);
}
.HostNotice {
position: fixed;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
z-index: 2;
font-size: 20rem;
display: flex;
flex-direction: column;
align-items: center;
background: var(--color-second-bg);
padding: 30rem;
border-radius: 12rem;
width: 500rem;
color: var(--color-font-1);
line-height: 1.5;
border: 1px solid var(--color-item-border);
box-shadow: var(--shadow);
.notice {
margin-top: 30rem;
}
.active {
color: var(--color-main-active);
}
.wrapper {
.collect {
display: flex;
flex-direction: column;
align-items: center;
.href-wrapper {
display: flex;
font-size: 16rem;
align-items: center;
gap: 10rem;
.round {
color: var(--color-font-1);
border-radius: 50rem;
padding: 10rem 10rem;
padding-left: 20rem;
gap: 30rem;
display: flex;
align-items: center;
justify-content: space-between;
background: var(--color-main-bg);
.href {
font-size: 14rem;
}
}
.star {
color: var(--color-main-active);
}
.right {
display: flex;
align-items: center;
}
}
.collect-keyboard {
margin-top: 20rem;
font-size: 16rem;
span {
margin-left: 10rem;
}
}
}
}
.close-wrapper {
right: var(--space);
top: var(--space);
position: absolute;
font-size: 14rem;
display: flex;
justify-content: flex-end;
align-items: center;
color: var(--color-font-1);
gap: 10rem;
}
}
</style>