基于node.js开发的文章生成器(八、网页版本的文章生成器--终章)

简介: # 引言不知不觉,我们的文章生成器已经迎来了终章,这是网页版狗屁不通文章生成器的终章,也是本系列的最后一章。接下来我就带着大家完成最后这一部分的学习。# 项目结构项目目录如下![image.png](https://ucc.alicdn.com/pic/developer-ecology/y3obldvnqeb54_63ca3afcfe4d4491ad90c23e73c0f2e1.png)上面就是项目的目录,分别是lib文件夹,node_modules目录,resources文件夹,axios文件夹,router文件夹,和router_handle目录。# lib目

引言

不知不觉,我们的文章生成器已经迎来了终章,这是网页版狗屁不通文章生成器的终章,也是本系列的最后一章。接下来我就带着大家完成最后这一部分的学习。

项目结构

项目目录如下

image.png

上面就是项目的目录,分别是lib文件夹,node_modules目录,resources文件夹,axios文件夹,router文件夹,和router_handle目录。

lib目录的编写

lib目录下文件如下

image.png

random.js中包含了生成随机数的randomInt()和抽象成过程的高阶函数randomFun()

article.js包含了sentence()生成句子的函数和最终的生成段落到文章的函数articleCreate()

resource目录

resource目录下包含一个data.json文件,包括我们的准备好的语料库。

router目录

这里是我们为主入口get,post请求准备的要抽象成路由的配置

router_handle目录

这里我们为router函数提供具体实现

src目录

这里我们来写项目的入口,因为之前有一个index.js文件,是控制台版的狗屁不通文章生成器代码,所以我们另外建立一个app.js作为本次项目的入口,另外我们再准备一个index.html作为本次项目的展示的页面。

index.html

这里我们写html部分的代码,代码如下:

<!DOCTYPE html>
<html>
    <head>
        <title>狗屁不通文章生成器</title>
        <style>
            body {
                background-image: linear-gradient(90deg,antiquewhite,aquamarine);
                display: flex;
            }
            h1 {
                color: coral;
                position: absolute;
            }
            .title {
                position: absolute;
                padding: 10px 10px 10px 10px;
                margin-left: 360px;
                margin-top: 120px;
                border-color: blue;
                border-top: 0px;
                border-right: 0px;
                border-left: 0px;
                border-color: brown;
                background-color:darkcyan;
                color: cornsilk;
                font-size: 20px;
            }
            .Num {
                background-color: burlywood;
                position: absolute;
                margin-left: 630px;
                margin-top: 120px;
                padding: 10px 10px 10px 10px;
                border-color: blue;
                border-top: 0px;
                border-right: 0px;
                border-left: 0px;
                font-size: 20px;
                color: cornsilk;
            }
            .Num::placeholder{
                margin-left: 15px;
                color: crimson;
            }
            .title::placeholder{
                color:cyan;
            }
            #content {
                margin-top: 185px;
                width: 80%;
                height: auto;
                margin-left: 10%;
                margin-right: 10%;
                background-color:rgb(215, 127, 64);
                flex-direction: column;
                flex-grow: 1;
                flex-basis: 630px;
                color:white;
                font-size: 18px;
            }
            .btn {
                position: absolute;
                margin-left: 960px;
                margin-top: 110px;
                padding-bottom: 23px;
                padding-right: 14px;
                border-radius: 5px;
                border-width: 6px;
                border-bottom: 6px;
                border-color: chartreuse;
                background-color: brown;
                color: aliceblue;
                font-size: 22px;
            }
            .btn:hover {
                font-size: 22px;
                background-color:coral;
                border-color: bisque;
                transition: all 1s;
                color:darkorchid;
            }
        </style>
    </head>
    <body>
        <h1>狗屁不通文章生成器</h1>
        <input id="title" class="title" name="title" type="text" placeholder="请输入文章标题" autocomplete="off">
        <input id="Num" name="Num" class="Num" type="number" placeholder="请输入字数" autocomplete="off">
        <button id="btn" class="btn">生成</button>
        <div id="content">          
        </div>
    </body>
    <script src="/axios"></script>
    <script>
        document.getElementById('btn').addEventListener('click',()=>{
            let title = document.getElementById('title').value;
            console.log(title);
            axios({
                method:"post",
                url : "http://localhost:8345/xx/create",
                data:"title="+title+"&"+"Num="+document.getElementById('Num').value,
            }).then((resp)=>{
                document.getElementById('content').innerHTML = resp.data;
            })
        },false);
    </script>
</html>

前端代码如下,背景上我用了background-image中的linear-gradient()函数做的渐变。

然后发送上我用了输入检查,控制生成的文章字数在十万字以下(主要是我穷,服务器流量没那么多...)

app.js部分代码。

准备部分

首先我们在控制台中输入npm install cors

我们下载cors来解决跨域问题。

import express from 'express';
import {readFileSync} from 'fs';
import {fileURLToPath} from 'url';
import {dirname, resolve} from 'path';
import {articleCreate} from '../lib/article.js';
import {randomInt,randomFun} from '../lib/random.js';
import cors from 'cors';

我们首先完成导入,导入express框架来使用express,导入fs模块中的readFileSync()函数来读取内容,导入path函数中的dirname和resolve函数,再导入url模块中的fileURLToPath()函数来做路径的转换,最后导入cors来解决跨域问题,再导入我们自定义的模块,包括article.js中的articleCreate()函数来完成文章的生成,random.js中的randomInt()函数和randomFun()函数。

接下来我们来配置路由。

请求的配置

我们在router目录下创建axoisSend.js和mainSend.js分别作为axios请求的响应和主要的文章生成请求的处理,同样我们也在router_handle目录中创建相应的文件作为具体函数的实现。

axiosSend.js

import {readFileSync} from 'fs';
import {fileURLToPath} from 'url';
import {dirname, resolve} from 'path';

import {generate} from '../lib/generator.js';
import {randomInt,createRandomPicker} from '../lib/random.js';
import express from 'express';
import { create } from 'domain';
const router = express.Router();
router.post('/create',(req,resp)=>
{
    const reqs = req.body;
    console.log(reqs);
    const title = reqs.title;
    let max = reqs.Num;
    console.log('执行了');
    const __dirname = dirname(fileURLToPath(import.meta.url));

    function loadCorpus(src) {
    const path = resolve(__dirname,"..", src);
    const data = readFileSync(path, {encoding: 'utf-8'});
    return JSON.parse(data);
    }

    const corpus = loadCorpus('corpus/data.json');

    const pickTitle = createRandomPicker(corpus.title);
    // const title = pickTitle();
    max = Number(max);
    console.log(typeof max);
    console.log(corpus);
    const article = generate(title, {corpus},3,max);
    console.log(`${title}\n\n    ${article.join('\n    ')}`);
    resp.send(`${title}\n\n    ${article.join('\n    ')}`)
    return `${title}\n\n    ${article.join('\n    ')}`;
});
export default router;

最后在app.js中调用,完成文章生成器的撰写、

相关文章
|
13天前
|
监控 JavaScript 前端开发
使用Vue.js开发员工上网行为监控的实时数据展示页面
使用Vue.js开发的实时员工上网行为监控页面,展示员工访问的网站、应用和时间等数据。页面响应式设计,适应不同设备。通过Vue组件显示实时数据,如`&lt;li v-for=&quot;activity in activities&quot;&gt;`循环渲染。数据定时更新,利用Vue的生命周期钩子和axios从服务器获取并自动刷新,确保数据的时效性。该页面有助于管理者即时了解员工网络活动,保障企业网络安全和资源管理。
69 5
|
21天前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的旅游网页附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的旅游网页附带文章和源代码部署视频讲解等
17 2
基于ssm+vue.js+uniapp小程序的旅游网页附带文章和源代码部署视频讲解等
|
3天前
|
缓存 JavaScript 前端开发
js开发代码片段与小技巧
js开发代码片段与小技巧
|
7天前
|
JavaScript 前端开发 安全
安全开发-JS应用&原生开发&JQuery库&Ajax技术&加密编码库&断点调试&逆向分析&元素属性操作
安全开发-JS应用&原生开发&JQuery库&Ajax技术&加密编码库&断点调试&逆向分析&元素属性操作
|
10天前
|
缓存 编解码 JavaScript
在JavaScript小游戏开发中,优化游戏性能是非常重要的
【6月更文挑战第16天】JavaScript小游戏性能优化涉及动画流畅度和减少重绘:使用requestAnimationFrame替代定时器;减少DOM操作,利用DocumentFragment或虚拟DOM;Canvas/WebGL高效渲染;压缩图像,使用雪碧图;分层渲染与视口裁剪;Web Workers处理后台计算;缓存计算结果;事件委托;定期性能分析。优化是持续过程,需结合具体需求调整。
42 8
|
10天前
|
JavaScript 前端开发 算法
Box2D(现在通常称为Box2D.js或者其WebAssembly版本,Emscripten Box2D)是一个流行的2D物理引擎,用于模拟刚体动力学、碰撞检测与响应以及关节约束等物理现象
【6月更文挑战第16天】Box2D.js,基于C++的2D物理引擎,经Emscripten编译为WebAssembly,用于JavaScript游戏中的真实物理模拟,包含碰撞检测和关节约束。它提供高效的碰撞检测,易于扩展和定制物理属性。使用步骤涉及初始化世界、创建刚体、添加碰撞形状、模拟物理及处理碰撞事件。物理引擎虽提升逼真度,但也增加复杂性和性能需求。其他选项如p2.js、matter.js和ammo.js也可供选择。
53 8
|
10天前
|
JavaScript 前端开发 Android开发
kotlin开发 webview如何在收到JS调用后,native返回数据给到JS
这段内容描述了在Hybrid App开发中,使用Kotlin的Compose构建的Web视图(WebView)如何通过JsBridge实现JavaScript与原生代码的交互
|
10天前
|
JavaScript 前端开发 Android开发
kotlin安卓在Jetpack Compose 框架下使用webview , 网页中的JavaScript代码如何与native交互
在Jetpack Compose中使用Kotlin创建Webview组件,设置JavaScript交互:`@Composable`函数`ComposableWebView`加载网页并启用JavaScript。通过`addJavascriptInterface`添加`WebAppInterface`类,允许JavaScript调用Android方法如播放音频。当页面加载完成时,执行`onWebViewReady`回调。
|
13天前
|
JavaScript 前端开发 编译器
探讨TypeScript如何帮助JavaScript开发者避免这些常见错误,从而提高代码质量和开发效率
【6月更文挑战第13天】TypeScript,JavaScript的超集,通过添加静态类型检查和面向对象特性,帮助开发者避免常见错误,提升代码质量和开发效率。它能检测类型错误,防止运行时类型转变引发的问题;使用可选链和空值合并避免引用错误;通过枚举减少逻辑错误中的魔法数字;接口和泛型等特性提高代码可维护性。学习TypeScript对提升JavaScript开发质量有显著效果。
24 4
|
14天前
|
Web App开发 监控 JavaScript
破解动态网页:如何用JavaScript获取自动消失的联想词
【6月更文挑战第2天】在获取动态加载的联想词时,遇到问题:输入搜索词后弹出的联想词框在失去焦点时消失,使得直接定位HTML元素困难。解决方案包括: 1. 查找DOM节点:在弹框出现时记录其类名或ID,然后通过JavaScript获取元素HTML内容。但由于元素加载有延迟,需在输入框获取焦点后延迟执行,例如使用`setTimeout`。 2. 使用`MutationObserver`监视DOM变化:创建观察者监听特定类的元素出现,当元素加载时打印其HTML。为避免获取旧内容,回调函数中使用`setTimeout`确保DOM完全渲染。
17 3