nodejs:express + js-mdict 网页查询英汉词典

news/2025/2/1 6:29:14 标签: nodejs, express, js-mdict

向 DeepSeek R1 提问:
我想写一个Web 前端网页,后台用 nodejs + js-mdict, 实现在线查询英语单词

1. 项目结构

首先,创建一个项目目录,结构如下:

mydict-app/
├── public/
│   ├── index.html
│   ├── styles.css
│   └── script.js
├── server/
│   └── server.js
├── package.json
└── README.md

2. 安装依赖

在项目根目录下运行以下命令,初始化项目并安装所需的依赖:
npm install express
added 69 packages in 6s

npm install js-mdict
added 3 packages in 2s

3. 创建前端页面

在 public/index.html 中创建一个简单的HTML页面,包含一个输入框和一个按钮用于查询单词:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>查询英汉词典</title>
    <script src="jquery.js"></script>
    <style>
/* portrait 判断为竖屏 */
@media only screen and (orientation: portrait){
     #lab1 {display:none;}
} 
/* landscape 判断为横屏 */ 
@media only screen and (orientation: landscape){
     #lab1 {display: ;}
}    
    </style>
</head>
<body>
  <form name="form" id="form" action="search" method="GET" target="iframe">
    <label id="lab1">请输入:</label>
    <input type="text" name="word" size="30" placeholder="请输入英文单词">
    <input type="submit" name="eng_han" value="英译汉">
  </form>
  <p></p>
<div id="result">
  <iframe name="iframe" id="iframe" width="90%" height="450">     
  </iframe>
</div>
<script src="script.js"></script>
</body>
</html>

 在 public 中添加一些英汉字典的样式:oalecd8e.css , oalecd8e.js , uk_pron.png, us_pron.png,
copy jquery-3.2.1.min.js pulibc\jquery.js

在 public/script.js 中编写前端逻辑:

  // 页面加载添加:监听iframe网页点击事件
  $(document).ready(function(){
    var listener = window.addEventListener('blur', function(){
      if (document.activeElement === document.getElementById('iframe')){
        $('iframe').contents().find('a.fayin').click(function(event){
          event.preventDefault();
          var a = $(this);
         if (a){
          var addr = a.attr('href');
          if (addr.indexOf('sound://')==0){
            var url = "/data" + addr.substring(7);
            var mp3 = new Audio(url);
            mp3.addEventListener("canplaythrough", (event)=> {
               mp3.play();
            });
          } else {
            alert('href='+addr);
          }
         }
        })
      }
    });
  });

4. 创建后端服务器

在 server/server.js 中编写Node.js服务器代码,使用 express 和 js-mdict 来处理查询请求:

const express = require('express');
const fs = require('fs');
const path = require('path');
const Mdict = require('js-mdict');
//console.log(Mdict);
const app = express();
const port = 8000;

// 加载MDict词典文件
//const mdict = new Mdict('path/to/your/dictionary.mdx');
const mdict = new Mdict.MDX('./data/oale8.mdx');
//const mdd = new Mdict.MDD('./data/oale8.mdd');

app.use(express.json());
app.use(express.urlencoded({ extended: false }));
// 提供静态文件
app.use(express.static(path.join(__dirname, '../public')));

// 处理查询请求
app.get('/search', (req, res) => {
    let word = req.query.word;
    if (word) {
        let data = mdict.lookup(word);
        console.log("cha: "+ word);
        if(data){
            res.send(data.definition);
        } else {
            res.status(400).send('error: word not found');
        }
    } else {
        res.status(400).send('error: No word input');
    }
});

// 指定目录
const dir1 = "../testdict/data";
const isValidPath = (path1) => {
    // 只允许字母、数字、下划线、点
    return /^[a-zA-Z0-9_\.]+$/.test(path1);
};
// 实现文件下载,*/是路径
app.get('/data/*/:fileName', (req, res, next) => {
    let path1 = req.params[0]; // 捕获 * 匹配的部分
    let fileName = req.params.fileName; // 捕获文件名
    // 检查路径中是否包含非法字符(如 ..)
    if (path1.includes('..') || fileName.includes('..')) {
        return res.status(400).send('Invalid path: Path traversal is not allowed.');
    }
    // 检查路径是否合法
    if (!isValidPath(path1) || !isValidPath(fileName)) {
        return res.status(400).send('Invalid path.');
    }    
    let filePath = path.join(dir1,path1, fileName);
    console.log(filePath);
    let stats = fs.statSync(filePath);
    if(stats.isFile()){
      if (path.extname(fileName) === '.mp3'){
        res.set({
         'Content-Type': 'application/octet-stream',
         'Content-Disposition': 'attachment;',
         'Content-Length': stats.size
        });
        //'Content-Disposition': 'attachment; filename='+encodeURI(fileName),
        res.download(filePath);
      } else {
         res.status(400).send('filename.ext is not .mp3');
      }
    } else {
      res.end('404');
    }
});

app.listen(port, () => {
    console.log(`Server is running on http://localhost:${port}`);
});

5. 运行项目

在项目根目录下运行以下命令启动服务器:node server/server.js

然后打开浏览器,访问 http://localhost:8000,你应该可以看到一个简单的词典查询页面。输入单词并点击查询按钮,页面会显示该单词的释义。

6. 部署

你可以将这个应用部署到任何支持 Node.js 的服务器上。

7. 进一步优化

  • 错误处理: 在前端和后端添加更多的错误处理逻辑。

  • UI 改进: 使用前端框架(如React、Vue.js)来改进用户界面。

  • 缓存: 在后端添加缓存机制,提高查询速度。

  • 多词典支持: 支持加载多个词典文件,并提供切换词典的功能。

希望这些步骤能帮助你实现一个简单的在线英语单词查询应用!


http://www.niftyadmin.cn/n/5839068.html

相关文章

数据分析系列--⑥RapidMiner构建决策树(泰坦尼克号案例含数据)

一、资源下载 二、数据处理 1.导入数据 2.数据预处理 三、构建模型 1.构建决策树 2.划分训练集和测试集 3.应用模型 4.结果分析 一、资源下载 点击下载数据集 二、数据处理 1.导入数据 2.数据预处理 三、构建模型 1.构建决策树 虽然决策树已经构建,但对于大多数初学者或…

TensorFlow 手动构建一个神经网络

TensorFlow 和 Keras 来构建和训练一个简单的神经网络模型。我们来逐行解析它的功能 import tensorflow as tf import numpy as np tensorflow&#xff1a;导入 TensorFlow 库&#xff0c;TensorFlow 是一个开源的机器学习框架。numpy&#xff1a;导入 NumPy 库&#xff0c;它…

27.Word:财务软件应用的书稿【10】

目录 NO1.2 NO3 NO5.6​ NO7.8​ NO9​ 存在页码链接关系&#xff0c;只是页码格式不同 NO1.2 另存为/F12&#xff1a;考生文件夹布局→页面设置对话框→页边距&#xff1a;上下内外/装订线→纸张大小→布局&#xff1a;页眉页脚 NO3 样式的应用&#xff1a;超快速❗ 开…

RRT_STAR路径规划代码

这是一段使用MATLAB编写的代码&#xff0c;实现了一个基于RRT*&#xff08;Rapidly-exploring Random Trees Star&#xff09;算法的路径规划。RRT*是一种用于在配置空间中搜索路径的采样算法&#xff0c;常用于机器人路径规划等领域。以下是代码的主要功能和结构&#xff1a; …

vue之pinia组件的使用

1、搭建pinia环境 cnpm i pinia #安装pinia的组件 cnpm i nanoid #唯一id&#xff0c;相当于uuid cnpm install axios #网络请求组件 2、存储读取数据 存储数据 >> Count.ts文件import {defineStore} from piniaexport const useCountStore defineStore(count,{// a…

【蓝桥杯】43697.机器人塔

题目描述 X 星球的机器人表演拉拉队有两种服装&#xff0c;A 和 B。 他们这次表演的是搭机器人塔。 类似&#xff1a; A B B A B A A A B B B B B A B A B A B B A 队内的组塔规则是&#xff1a; A 只能站在 AA 或 BB 的肩上。 B 只能站在 AB 或 BA 的肩上。 你的…

1 HDFS

1 HDFS 1. HDFS概述2. HDFS架构3. HDFS的特性4. HDFS 的命令行使用5. hdfs的高级使用命令6. HDFS 的 block 块和副本机制6.1 抽象为block块的好处6.2 块缓存6.3 hdfs的文件权限验证6.4 hdfs的副本因子 7. HDFS 文件写入过程&#xff08;非常重要&#xff09;7.1 网络拓扑概念7.…

如何获取Springboot项目运行路径 (idea 启动以及打包为jar均可) 针对无服务器容器新建上传文件路径(适用于win 与 linunix)

public class Constants {public static String getUploadDir() {// 获取 JAR 包所在目录ApplicationHome home new ApplicationHome(Constants.class);File jarDir home.getDir();// 构建上传文件存储路径&#xff08;JAR 同级目录下的 uploads 文件夹&#xff09;File uplo…