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

英漢詞典文件(*.mdx , *.mdd)? 已經放在 /js/testdict/?

2. 安裝依賴

在項目根目錄下運行以下命令,初始化項目并安裝所需的依賴:
cd mydict-app
npm init -y
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" id="word" size="30" placeholder="請輸入英文單詞"><input type="submit" name="eng_han" value="英譯漢"><input type="button" name="btn1" id="btn1" value="前綴查詢"><input type="button" name="btn2" id="btn2" value="模糊查詢"></form><p></p>
<div style="float:left; width:100%;"><div id="result" style="float:left; width:75%; height:500; border:2px;"><iframe name="iframe" id="iframe" width="100%" height="500"> </iframe></div><div id="alist" style="float:right; width:25%; height:500; border:2px;"></div>
</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?中編寫前端邏輯:

  const iframe = $('#iframe')[0]; // 獲取 iframe DOM 元素// 頁面加載添加:監聽iframe網頁點擊事件$(document).ready(function(){let listener = window.addEventListener('blur', function(){if (document.activeElement === document.getElementById('iframe')){$('iframe').contents().find('a').click(function(event){event.preventDefault();let a = $(this);if (a){let addr = a.attr('href');if (addr.indexOf('entry://')==0 && addr.indexOf('entry://#')!=0){               let word = encodeURIComponent(addr.substring(8));$.ajax({url: `/search?word=${word}`,method: 'GET',success: function (html) {// 將 HTML 內容加載到 iframe 中//$('#iframe').attr('srcdoc', html);let iframeDoc = iframe.contentDocument || iframe.contentWindow.document;if (html){// 寫入 HTML 內容iframeDoc.open();iframeDoc.write(html);iframeDoc.close();}},error: function (error) {console.error('entry:請求失敗:', error);}});} else if (addr.indexOf('sound://')==0){let url = "/data/" + addr.substring(8);let mp3 = new Audio(url);mp3.addEventListener("canplaythrough", (event)=> {mp3.play();});mp3.addEventListener('error', (e) => {console.error('play error:', e);});} else {console.log('href='+addr);}}});}});});// 前綴查詢
$(function(){$("#btn1").click(function(){$.getJSON("/prefix?word="+$("#word").val(), function(data){let items = [];$.each(data, function(i, item){if (i<=20){items[i] = '<a href="/search?word=' +item+ '" target="iframe">' +item+ "</a><br>";}});let a = items.join('\n');if (a) $('#alist').html(a);})})
});// 模糊查詢
$(function(){$("#btn2").click(function(){$.getJSON("/fuzzy?word="+$("#word").val(), function(data){let items = [];$.each(data, function(i, item){if (i<=20){items[i] = '<a href="/search?word=' +item+ '" target="iframe">' +item+ "</a><br>";}});let a = items.join('\n');if (a) $('#alist').html(a);})})
});

4. 創建后端服務器

在?server/server2.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 = 8002;// 加載MDict詞典文件
//const mdict = new Mdict('path/to/your/dictionary.mdx');
const mdx = new Mdict.MDX('/js/testdict/your英漢詞典插圖版.mdx');
const mdd = new Mdict.MDD('/js/testdict/your英漢詞典插圖版.mdd');
//console.log(mdd.locate('\\goods'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
// 提供靜態文件
app.use(express.static(path.join(__dirname, '../public')));const isWord = (txt) => {// 只允許字母、/、空格、-return /^[a-zA-Z \/\-]+$/.test(txt);
};// 處理查詢請求
app.get('/search', (req, res) => {let word = req.query.word;if (word) {let data = mdx.lookup(word);console.log("cha: "+ word);if(data.definition){res.send(data.definition);} else {res.status(200).send('this word not found.');}} else {res.status(400).send('error: No word input');}
});// 處理前綴查詢請求
app.get('/prefix', (req, res) => {let word = req.query.word;// 檢查word是否合法if (word.length>50 || !isWord(word)) {return res.status(400).send('Invalid input.');}if (word) {let alist = mdx.prefix(word);console.log("pre: "+ word);if(alist.length >0){let wordls = [];alist.forEach(function(value){wordls.push(value.keyText);});  res.json(wordls);} else {res.status(400).send('this word not found');}} else {res.status(400).send('error: No word input');}
});// 處理模糊查詢請求
app.get('/fuzzy', (req, res) => {let word = req.query.word;// 檢查word是否合法if (word.length>50 || !isWord(word)) {return res.status(400).send('Invalid input.');}if (word) {let alist = mdx.fuzzy_search(word,3,1);console.log("fuzzy: "+ word);if(alist.length >0){let wordls = [];alist.forEach(function(value){wordls.push(value.keyText);});  res.json(wordls);} else {res.status(400).send('this word not found');}} else {res.status(400).send('error: No word input');}
});// 指定目錄
const dir1 = "/";// 實現image文件下載,不帶路徑
app.get('/:fileName', (req, res, next) => {let path1 = '/'; let fileName = req.params.fileName; // 捕獲文件名// 檢查路徑中是否包含非法字符(如 ..)if (fileName.includes('..')) {return res.status(400).send('Invalid path: Path traversal is not allowed.');}//console.log(fileName);let extname = path.extname(fileName);let ext = extname.substring(1).toLowerCase();if (['bmp','gif','jpg','png'].includes(ext)){let filePath = path.join(path1, fileName);//console.log(filePath);let data = mdd.locate(filePath);if (data){console.log('key: '+ data.keyText);//console.log(Buffer.isBuffer(data.definition));if (data.definition){let binaryData = Buffer.from(data.definition, 'base64');//res.setHeader('Content-Type', 'application/octet-stream');res.set({'Content-Type': 'image','Content-Disposition': 'attachment;','Content-Length': Buffer.byteLength(binaryData)});//console.log('bytes: '+ Buffer.byteLength(binaryData));res.end(binaryData);} else {res.status(400).send('error: data.definition is null');}} else {res.status(400).send('error: data is null');}} else {res.status(400).send('filename.ext is not image');}
});// 實現image文件下載,*/是路徑
app.get('/*/:fileName', (req, res, next) => {let path1 = req.params[0]; // 捕獲 * 匹配的部分let fileName = req.params.fileName; // 捕獲文件名// 檢查路徑中是否包含非法字符(如 ..)if (fileName.includes('..')) {return res.status(400).send('Invalid path: Path traversal is not allowed.');}//console.log(fileName);let extname = path.extname(fileName);let ext = extname.substring(1).toLowerCase();if (['bmp','gif','jpg','png'].includes(ext)){let filePath = path.join(dir1,path1, fileName);//console.log(filePath);let data = mdd.locate(filePath);if (data){console.log('key: '+ data.keyText);//console.log(Buffer.isBuffer(data.definition));if (data.definition){let binaryData = Buffer.from(data.definition, 'base64');//res.setHeader('Content-Type', 'application/octet-stream');res.set({'Content-Type': 'image','Content-Disposition': 'attachment;','Content-Length': Buffer.byteLength(binaryData)});//console.log('bytes: '+ Buffer.byteLength(binaryData));res.end(binaryData);} else {res.status(400).send('error: data.definition is null');}} else {res.status(400).send('error: data is null');}} else {res.status(400).send('filename.ext is not image');}
});app.listen(port, () => {console.log(`Server is running on http://localhost:${port}`);
});

5. 運行項目

在項目根目錄下運行以下命令啟動服務器:cd /js/mydict-app ;
node server/server2.js

然后打開瀏覽器,訪問?http://localhost:8002,你應該可以看到一個簡單的詞典查詢頁面。輸入單詞并點擊查詢按鈕,頁面會顯示該單詞的釋義,并顯示插圖。

6. 部署

你可以將這個應用部署到任何支持 Node.js 的服務器上。

7. 進一步優化

  • 錯誤處理: 在前端和后端添加更多的錯誤處理邏輯。

  • UI 改進: 使用前端框架(如React、Vue.js)來改進用戶界面。

  • 緩存: 在后端添加緩存機制,提高查詢速度。

  • 多詞典支持: 支持加載多個詞典文件,并提供切換詞典的功能。

希望這些步驟能幫助你實現一個簡單的在線英語單詞查詢應用!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/895910.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/895910.shtml
英文地址,請注明出處:http://en.pswp.cn/news/895910.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【數據分析】2.數據分析業務全流程

業務流程方法論&#xff1a;3階段6步驟 一、課程核心內容結構 1. 方法論概述 目標&#xff1a;系統性地解決商業中的關鍵問題框架&#xff1a;分為三個階段&#xff0c;每個階段包含兩個步驟適用場景&#xff1a;適用于數據分析師、業務經理等需要通過數據分析支持決策的從業…

【后端】k8s

1. 命令 1.1 獲取service服務 獲取集群內所有命名空間的service服務 sudo kubectl get service --all-namespaces 獲取集群內指定命名空間的service服務 sudo kubectl get service -n命名空間 當權限限制到一個命名空間時,只能使用下面這個 sudo kubectl -n 命名空間 get se…

Mybatis MyBatis框架的緩存 一級緩存

1. 緩存的概念 緩存的概念 在內存中臨時存儲數據&#xff0c;速度快&#xff0c;可以減少數據庫的訪問次數。經常需要查詢&#xff0c;不經常修改的數據&#xff0c;不是特別重要的數據都適合于存儲到緩存中。 2.Mybatis緩存 mybatis包含了一個非常強大的查詢緩存特性&#…

Linux csplit 命令實現日志文件的拆分

目錄 一. 項目背景二. 通過 csplit 命令按照行數進行切割2.1 步驟分解驗證2.2 直接拆分 三. 文件合并后與原文件進行diff3.1 通過 sed 命令進行合并3.2 通過 cat 命令進行合并 一. 項目背景 ?需要的問題 項目中需要獲取某個war產生的log文件&#xff0c;由于是商用環境的log…

【EndNote】WPS 導入EndNote 21

寫在前面&#xff1a;有沒有人有激活碼&#xff0c;跪求&#xff01; EndNote&#xff0c;在文獻管理和文獻引用方面很好用。寫文章的時候&#xff0c;使用EndNote引入需要的文獻會很方便。我目前用的WPS&#xff0c;想把EndNote的CWYW&#xff08;Cite While You Write&#…

嵌入式0xDEADBEEF

在嵌入式系統中&#xff0c;0xDEADBEEF 是一個常見的“魔數”&#xff08;magic number&#xff09;&#xff0c;通常用于調試和內存管理。它的含義和用途如下&#xff1a; 1. 調試用途 未初始化內存的標記&#xff1a;在調試時&#xff0c;0xDEADBEEF 常用于標記未初始化或已…

RT-Thread+STM32L475VET6實現紅外遙控實驗

文章目錄 前言一、板載資源介紹二、具體步驟1. 確定紅外接收頭引腳編號2. 下載infrared軟件包3. 配置infrared軟件包4. 打開STM32CubeMX進行相關配置4.1 使用外部高速時鐘&#xff0c;并修改時鐘樹4.2 打開定時器16(定時器根據自己需求調整)4.3 打開串口4.4 生成工程 5. 打開HW…

【HarmonyOS Next】鴻蒙應用進程和線程詳解

【HarmonyOS Next】鴻蒙應用進程和線程詳解 一、前言 進程的定義&#xff1a; 進程是系統進行資源分配的基本單位&#xff0c;是操作系統結構的基礎。 在鴻蒙系統中&#xff0c;一個應用下會有三類進程&#xff1a; (1) 主進程&#xff0c; (2) ExtensionAbility進程&#xff…

迪威模型網:免費暢享 3D 打印盛宴,科技魅力與趣味創意并存

還在為尋找優質3D打印模型而發愁&#xff1f;快來迪威模型網&#xff08;https://www.3dwhere.com/&#xff09;&#xff0c;一個集前沿科技與無限趣味于一體的免費3D打印寶藏平臺&#xff01; 踏入迪威模型網&#xff0c;仿佛開啟一場未來科技之旅。其“3D打印”專區&#xff…

力扣LeetCode: 1287 有序數組中出現次數超過25%的元素

題目&#xff1a; 給你一個非遞減的 有序 整數數組&#xff0c;已知這個數組中恰好有一個整數&#xff0c;它的出現次數超過數組元素總數的 25%。 請你找到并返回這個整數 示例&#xff1a; 輸入&#xff1a;arr [1,2,2,6,6,6,6,7,10] 輸出&#xff1a;6提示&#xff1a; …

一文看常見的消息隊列對比

一、核心特性對比表 維度KafkaRabbitMQRocketMQPulsar架構設計分布式日志系統&#xff0c;依賴ZooKeeper基于AMQP協議的代理模型主從架構NameServer協調分層架構&#xff08;BrokerBookKeeper&#xff09;單機吞吐量100萬 TPS5萬 TPS50萬 TPS150萬 TPS消息延遲毫秒級&#xff…

Ubuntu USB耳機找不到設備解決

? 一. 確定硬件連接 lsusb -t 插拔USB耳機&#xff0c;確定是否有USB識別到 二. 查看輸出設備 sudo apt-get install pavucontrol pavucontrol 點擊想要使用的輸出設備后面的綠色選項 三. 輸出設備沒有USB耳機時調試 3.1 確認ALSA是否識別設備 列出ALSA播放設備&#…

[筆記.AI]如何判斷模型是否通過剪枝、量化、蒸餾生成?

以下摘自與DeepSeek-R1在線聯網版的對話 一、基礎判斷維度 技術類型核心特征驗證方法剪枝模型參數減少、結構稀疏化1. 檢查模型參數量是否顯著小于同類標準模型1 2. 分析權重矩陣稀疏性&#xff08;如非零參數占比<30%&#xff09;4量化權重/激活值精度降低、推理速度提升1…

Redis如何解決熱Key問題

目錄 **如何解決 Redis 的熱 Key&#xff08;Hot Key&#xff09;問題&#xff1f;****解決方案** **1. 使用多級緩存****方案** **2. 進行 Key 預分片&#xff08;Key Sharding&#xff09;****方案** **3. 使用 Redis 復制機制&#xff08;主從復制或集群&#xff09;****方案…

云計算架構學習之Ansible-playbook實戰、Ansible-流程控制、Ansible-字典循環-roles角色

一、Ansible-playbook實戰 1.Ansible-playbook安裝軟件 bash #編寫yml [rootansible ansible]# cat wget.yml - hosts: backup tasks: - name: Install wget yum: name: wget state: present #檢查playbook的語法 [rootansible ansible]…

【Web前端開發精品課 HTML CSS JavaScript基礎教程】第二十四章課后題答案

文章目錄 問題1&#xff1a;問題2&#xff1a;問題3&#xff1a; 問題1&#xff1a; 在HTML中嵌入JavaScript&#xff0c;應該使用的標簽是&#xff08; &#xff09;。 選項&#xff1a; A. <style></style> B. <script></script> C. <js><…

用python進行二分法查找(python實例三十)

目錄 1.認識Python 2.環境與工具 2.1 python環境 2.2 Visual Studio Code編譯 3.代碼示例 4.運行結果 1.認識Python Python 是一個高層次的結合了解釋性、編譯性、互動性和面向對象的腳本語言。 Python 的設計具有很強的可讀性&#xff0c;相比其他語言經常使用英文關鍵…

Qt學習(五)自定義對話框,多窗口開發---添加設計師類, MDI多窗口開發

一 對話框 實現功能&#xff1a;打開文件&#xff0c;選擇目錄&#xff0c;保存文件&#xff0c;選擇顏色&#xff0c;選擇字體&#xff0c;輸入信息&#xff0c; 消息提示框 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE na…

用 Python 實現簡易的 Web 爬蟲:從入門到實戰

一、引言 在信息爆炸的時代,網絡上蘊含著海量的數據。如果我們想要獲取特定的信息,手動從網頁上復制粘貼顯然效率極低。這時,Web 爬蟲就派上了用場。Web 爬蟲是一種自動獲取網頁內容的程序,它可以模擬人類在瀏覽器中的操作,快速地抓取網頁上的數據。本文將帶領大家使用 Py…

機器視覺檢測中,2D面陣相機和線掃相機的區別

2D面陣相機和線掃相機是工業視覺系統中常用的兩種相機類型&#xff0c;各有其特點和應用場景。 2D面陣相機 特點&#xff1a; 成像方式&#xff1a;通過二維傳感器一次性捕捉整個場景的圖像。 分辨率&#xff1a;分辨率由傳感器的像素數決定&#xff0c;常見的有百萬像素到幾千…