一、 前言
Express 是 Node.js 的一个流行框架,用于构建 Web 应用程序和 API。它提供了许多功能强大的工具和中间件,使得开发者能够轻松地创建高性能的服务器端应用。然而,实现一个完整的 Web 应用一个重要的方面是前台(客户端)与后台(服务器端)之间的交互。在这篇文章中,我们将探讨如何在 Express 框架下实现有效的前后端交互。
二、简介
实现前台与后台的交互通常要处理以后台路由、前台交互等内容:
1. 后台路由
在 Express 中,后台路由是定义了端点(endpoint)和处理函数的部分。这些路由负责处理来自客户端的请求,并返回相应的数据或执行相应的操作。下面是一个简单的后台路由示例:
const express = require ( 'express' ) ;
const app = express ( ) ;
app. get ( '/api/data' , ( req, res ) => {
const data = { message : '这是来自服务器的数据' } ;
res. json ( data) ;
} ) ;
app. listen ( 3000 , ( ) => {
console. log ( '服务器已启动,端口号: 3000' ) ;
} ) ;
在上面的例子中,我们定义了一个 GET 请求的路由 /api/data
,当客户端发送 GET 请求到这个路由时,服务器将返回一个 JSON 格式的数据。
2. 前台交互
要在前台与后台进行交互,通常使用 JavaScript 来发送请求并处理响应。在浏览器端,可以使用 Fetch API 或 XMLHttpRequest 对象来实现。以下是一个使用 Fetch API 的简单示例:
fetch ( '/api/data' )
. then ( response => {
if ( ! response. ok) {
throw new Error ( '网络请求失败' ) ;
}
return response. json ( ) ;
} )
. then ( data => {
console. log ( data) ;
} )
. catch ( error => {
console. error ( '发生错误:' , error) ;
} ) ;
在这个示例中,我们向 /api/data
路由发送了一个 GET 请求,并在收到响应后处理返回的数据。
三、真实案例
我们以视频网站的【分类编辑】的页面来介来看看在项目中如何实现前台与后台的异步交互;这里涉及到的重点 内容有:
前台如何通过后台读、写数据库中的数据
前台页面中的控件事件挂接
3.1前台通过后台获取数据库中的数据
在实现前台通过后台获取数据库中的数据时,首先需要后台提供相应的数据获取方法供前台调用。在较为优良的实践中,常见的做法是将数据表进行封装,形成模型。这种模型封装可以提供一种结构化的方式来管理和操作数据库中的数据,使得后台的数据访问更加可维护和可扩展。我们以Mysql数据库为例介绍后台的方法,其中数据库链接部分请参阅前面文章,这里只在末尾给出代码以方便调试;
CREATE TABLE `video_site`.`video_categories2` (
`ID` INT NOT NULL AUTO_INCREMENT,
`CategoriesName` VARCHAR(255) NOT NULL,
PRIMARY KEY (`ID`, `CategoriesName`),
UNIQUE INDEX `ID_UNIQUE` (`ID` ASC));
3.1.1 在NodeJs中提供数据表访问代码
创建Model\videoCategoryModel.js
做为视频分类的模型封装,提供对数据表的增、删、改、查功能,其代码如下:
const db = require('./dbUtils');
class VideoCategory {
constructor(data) {
this.id = data.ID;
this.categoryName = data.CategoriesName;
}
// 根据分类ID查询分类
static async findById(id) {
try {
const results = await db.query.withoutConnection('SELECT * FROM video_categories WHERE ID = ?', [id]);
if (results.length > 0) {
const categoryData = results[0];
return new VideoCategory({
id: categoryData.ID,
categoryName: categoryData.CategoriesName
});
}
} catch (err) {
console.error('Error fetching video category by ID:', err);
throw err;
}
}
// 静态方法,用于查询所有分类
static async findAll() {
try {
const results = await db.query.withoutConnection('SELECT * FROM video_categories');
return results.map(categoryData => new VideoCategory(categoryData));
} catch (err) {
console.error('Error fetching all video categories:', err);
throw err;
}
}
// 实例方法,用于保存分类到数据库
async save() {
try {
const results = await db.query.withoutConnection(
'INSERT INTO video_categories (CategoriesName) VALUES (?)',
[this.categoryName]
);
this.id = results.insertId;
} catch (err) {
console.error('Error saving video category:', err);
throw err;
}
}
}
module.exports = VideoCategory;
3.1.2 提供路由
增加routes\categories.js
文件作为视频分类的路由文件,提供数据表内容访问API接口
const express = require('express');
const router = express.Router();
const CategoryModel = require('../model/CategoryModel');
// 渲染分类维护页面,当用户切换到视频分类页面时显示分类编辑页面
router.get('/admin/categories', async (req, res) => {
try {
const categories = await CategoryModel.getAllCategories();
res.render('categories', { categories });
} catch (error) {
console.error('Error rendering categories page:', error);
res.status(500).send('Internal Server Error');
}
});
// API调用获取所有分类
router.get('/admin/categories/api/Categories', async (req, res) => {
try {
const categories = await CategoryModel.getAllCategories();
res.json(categories);
} catch (error) {
console.error('Error fetching categories:', error);
res.status(500).json({ error: 'Internal Server Error' });
}
});
// API调用添加分类
router.post('/admin/categories/api/Categories', async (req, res) => {
try {
const { CategoriesName } = req.body;
await CategoryModel.addCategory(CategoriesName);
res.status(201).json({ message: 'Category added successfully' });
} catch (error) {
console.error('Error adding category:', error);
res.status(500).json({ error: 'Internal Server Error' });
}
});
// API调用更新分类
router.put('/admin/categories/api/Categories/:id', async (req, res) => {
try {
const { id } = req.params;
const { CategoriesName } = req.body;
await CategoryModel.updateCategory(id, CategoriesName);
res.json({ message: 'Category updated successfully' });
} catch (error) {
console.error('Error updating category:', error);
res.status(500).json({ error: 'Internal Server Error' });
}
});
// API调用删除分类
router.delete('/admin/categories/api/Categories/:id', async (req, res) => {
try {
const { id } = req.params;
await CategoryModel.deleteCategory(id);
res.json({ message: 'Category deleted successfully' });
} catch (error) {
console.error('Error deleting category:', error);
res.status(500).json({ error: 'Internal Server Error' });
}
});
module.exports = router;
3.1.3 将路由添加到由表中
在App.js
文件中添加以下代码
//……其它代码
const categoriesRoutes = require('./routes/categories');
//……其它代码
app.use('/', categoriesRoutes); // 挂载分类维护页面的路由
//……其它代码
3.2前台通过后台获取数据库中的数据
3.2.1 前台页面事件说明
在页面中提供一个文本框用于增加分类时输入分类名称,一个【增加】按钮用于增加分类,以及一个表格用于显示分类数据;数据修改及删除通过表格完成;表格显示如下
ID
分类名称
操作
1
初中
删除
2
高中
删除
增加views\categories.ejs
页面,并添加相应的事件,下面就所需要事件展开说明 1 document.addEventListener
事件说明请参阅附2 2 "DOMContentLoaded"
页面加载事件,内部主要实现:
挂接submit
事件,用于添加新分类;
定义window.deleteCategory
删除分类方法,用于挂接在表格中的删除按钮单击事件;
定义fetchCategories()
用于加载所有分类; 以上三个方法放到【"DOMContentLoaded"
】是为保证事件挂接成功,避免某些情况下因页面未完全加载完毕所挂接的控件未定义从而造成的挂接失败;
3 function createTableRow(category)
用于创建表格的方法; 4 async function validateAndUpdateCategory(element, id)
用于在表格中修改分类名称响应函数; 在创建表格时 ${category.CategoriesName}
时,指定了单元修输入后的响应函数; 5 async function updateCategory(id, newName)
用于修改分类名称后调用相应的后台API
3.2.1 前台页面代码细节说明
在categoryForm.addEventListener('submit'
页面提交事件中event.preventDefault()
用于阻止页面的默认提交事件,这样我们才能机会对用户输入内容进行验证,并根据验证结果决定处理动作;
单元格默认是不能编辑的,通过设置contenteditable="true"
至使单元可以编辑。
在增加分类后,这里直接重新加载了页面,若不想重新加载整个页面,可参见单元格编辑响应事件修改此处代码;
3.3 views\categories.ejs
代码如下:
课程分类管理
ID
分类名称? 分类名称不能包含以下字符:\ / : * ? " < > |,长度不能超过255个字符
操作
4. 结论
通过 Express 框架,我们可以轻松地实现前后端之间的数据交互。在后台,通过定义路由来处理来自客户端的请求;在前台,通过 JavaScript 来发送请求并处理响应。这种前后端交互的方式使得我们能够构建功能丰富、动态的 Web 应用程序。
附
1 数据库链接代码
文件名Model\dbUtils.js
,代码如下
const mysql = require('mysql');
// 创建数据库连接池
const pool = mysql.createPool({
connectionLimit: 10,
host: 'localhost',
user: '数据库用户名',
password: '数据库密码',
database: 'video_site', //使用的数据库名
debug: false // 开启调试模式,会输出详细的 SQL 执行日志
});
// 获取数据库连接的方法
const getDBConnection = () => {
return new Promise((resolve, reject) => {
pool.getConnection((error, connection) => {
if (error) {
reject(error);
} else {
resolve(connection);
}
});
});
};
// 执行查询的方法(重载1:带 connection 参数)
const query = {
// 当调用者已经拥有连接时使用的查询方法
withConnection: (connection, sql, params) => {
return new Promise((resolve, reject) => {
connection.query(sql, params, (error, results, fields) => {
if (error) {
reject(error);
} else {
resolve(results);
}
});
});
},
// 当调用者没有连接时使用的查询方法,这个方法会负责获取和释放连接
withoutConnection: async (sql, params) => {
let connection;
try {
connection = await getDBConnection();
const results = await query.withConnection(connection, sql, params);
return results;
} catch (error) {
throw error;
} finally {
if (connection) {
connection.release();
}
}
}
};
module.exports = {
getDBConnection,
query
};
2 document.addEventListener说明
document.addEventListener
是 JavaScript 中用于添加事件监听器的方法之一。它允许开发者在特定的文档对象上监听各种类型的事件,比如鼠标点击、键盘按下、页面加载完成等,以便在事件发生时执行相应的操作。
使用方法
document. addEventListener ( event, function , useCapture) ;
event
: 要监听的事件类型,比如 “click”、“keydown”、“load” 等。
function
: 事件发生时要执行的函数,也称为事件处理程序。
useCapture
(可选): 一个布尔值,表示事件是在捕获阶段(true
)还是冒泡阶段(false
)触发事件处理程序。默认为 false
。
示例
document. addEventListener ( 'click' , function ( event ) {
console. log ( '点击了文档' ) ;
} ) ;
document. addEventListener ( 'keydown' , function ( event ) {
console. log ( '按下了键盘键:' , event. key) ;
} ) ;
在这个示例中,我们分别监听了文档的点击事件和键盘按键事件。当用户点击文档时,会在控制台输出 “点击了文档”;当用户按下键盘时,会在控制台输出相应的按键值。
优势
多事件处理 : 可以同时监听多个不同类型的事件,而不需要像传统的 onclick
或 onkeydown
一样,将事件处理程序直接赋值给特定的属性。
灵活性 : 可以使用匿名函数或命名函数作为事件处理程序,使代码更加模块化和可维护。
事件委托 : 可以利用事件冒泡机制,在父元素上添加一个事件监听器,来代理处理子元素的事件,提高性能和代码简洁度。
总之,document.addEventListener
是 JavaScript 中一种强大的事件处理机制,它为开发者提供了一种灵活、高效的方式来处理各种类型的事件。
你可能感兴趣的:(NodeJs,入门,交互,node.js,express,mysql,数据库)
Moodle + Websoft9:创新教育的强大组合,助力教学与学习
开源软件
Moodle+Websoft9:构建未来课堂的技术基石一、Moodle:开源生态的深度解析•模块化设计:支持超800个官方插件,如H5P交互内容创作、BigBlueButton虚拟课堂,满足个性化教学需求。•学习分析引擎:内置LearningAnalyticsAPI,可集成Python/R语言进行深度学习,预测学生学业风险。•移动优先战略:MoodleApp支持离线学习、扫码签到,2023年新增A
互联网运营为何必须做好用户行为数据分析
开源软件埋点数据分析
近年来互联网运营已经成为大多数企业不可或缺的一部分。随着互联网技术的不断发展和数字化转型的推进,越来越多的企业都在加速向互联网运营转型,而在这一过程当中,分析用户行为数据是至关重要的。接下来,我们就来探讨一下其中的原因。一、什么是用户行为数据?用户行为数据指的是在用户与产品、服务或平台交互过程中产生的各种数据。举个例子:某app中,某个用户在某个时间点在某个地方以某种方式完成了某个具体的操作。实际
快速上手系列丨如何管理 PieCloudDB Database 虚拟数仓
云原生数据库教程管理
为增强社区用户的体验,PieCloudDBDatabase社区版已于8月完成了全面改版升级。同时,PieCloudDB社区还特别制作了《快速入门PieCloudDB社区版》系列课程,旨在帮助大家全面了解新版本,逐步探索PieCloudDB的强大功能。PieCloudDB社区版提供免费下载,可用于体验产品新特性、个人学习、PoC验证等场景,方便社区用户快速体验领先的数仓虚拟化技术。PieCloudD
向量数据库 PieCloudVector 进阶系列丨打造以 LLM 为基础的聊天机器人
本系列前两篇文章深入探讨了PieCloudVector在图片和音频数据上的应用之后,本文将聚焦于文本数据,探索PieCloudVector对于文本数据的向量化处理、存储以及检索,并最终结合LLM打造聊天机器人的全流程。在自然语言处理任务中涉及到大量对文本数据的处理、分析和理解,而向量数据库在其中发挥了重要的作用。本文为《PieCloudVector进阶系列》的第三篇,将为大家介绍如何利用PieCl
Axure高级功能深度解析一一高效原型设计的利器
招风的黑耳
Axure
Axure作为一款专业的原型设计工具,凭借其强大的功能和灵活的交互设计,成为了众多设计师和开发者的首选。本文将深入探讨Axure的高级功能,帮助大家更好地利用这款工具,提升原型设计的效率和质量。一、Axure高级功能概览•变量管理:介绍局部变量和全局变量的使用场景、命名规则以及如何在原型设计中实现数据传递和交互逻辑。•动态面板:详细解析动态面板的工作原理,包括如何创建、编辑和管理动态面板状态,以及
基于 Websoft9 平台的 Odoo 教学实践:助力智能制造、物流与财务会计专业教师提升教学效果
开源
Websoft9作为企业级开源软件的自动化部署与管理平台,为高校智能制造、物流与财务会计等专业提供了完整的Odoo(开源ERP)教学解决方案。以下从部署、维护及功能扩展三方面解析其核心价值:一、部署:开箱即用的企业级业务场景模拟一键构建复杂业务架构Websoft9预置了Odoo全模块集成模板,部署时可自动关联PostgreSQL数据库、Nginx负载均衡及Let'sEncryptSSL证书,还原真
MySQL 面试题
你曾经是少年
mysql 数据库
1.数据库基础问题:请解释数据库(DB)、数据库管理系统(DBMS)、SQL三者的区别。参考答案:DB:存储数据的结构化仓库DBMS:管理数据库的软件(如MySQL、Oracle)SQL:操作关系型数据库的标准化语言2.SQL分类问题:SQL分为哪几类?分别写出对应的关键字(至少3个)。参考答案:DDL:CREATE/DROP/ALTERDML:INSERT/UPDATE/DELETEDQL:SE
计算机专业毕业设计题目推荐(新颖选题)本科计算机科学专业相关毕业设计选题大全✅
会写代码的羊
毕设选题 课程设计 计算机网络 毕设选题 毕设系统 毕设题目 计算机科学专业
文章目录前言最新毕设选题(建议收藏起来)本科计算机科学专业相关的毕业设计选题毕设作品推荐前言2025全新毕业设计项目博主介绍:✌全网粉丝10W+,CSDN全栈领域优质创作者,博客之星、掘金/华为云/阿里云等平台优质作者。技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、大数据、机器学习等设计与开发。主要内容:免费功能设计
【微信小程序变通实现DeepSeek支持语音】
技术与健康
微信小程序 小程序
微信小程序实现录音转文字,并调用后端服务(Node.js)进行语音识别和,然后调用DeepSeek处理的完整实现。整体架构前端(微信小程序):实现录音功能。将录音文件上传到后端。接收后端返回的语音识别结果,并显示在可编辑的文本框中。调用DeepSeek处理文本。后端(Node.js):接收小程序上传的录音文件。调用腾讯云语音识别(ASR)服务,将语音转换为文字。返回识别结果给小程序。提供DeepS
C语言入门第七天字符串输入输出函数和控制语句
Do vis824
算法 c# c语言 linux
一:字符串输入输出函数1:字符串输入函数getsa:格式:char*gets(char*s)现在指针不懂的可以直接写成gets(s)b:功能:从键盘输入一以回车结束的字符串放入字符数组中,并自动加'\0',c:输入串长度应小于字符数组维数d:与scanf函数不同,gets函数并不以空格作为字符串输入结束的标志e:代码展示#includeintmain(){chara[5];gets(a);prin
不要再走弯路了2025最全的黑客入门学习路线在这
渗透代老师
学习 网络安全 web安全 网络 python
基于入门网络安全/黑客打造的:黑客&网络安全入门&进阶学习资源包在大多数的思维里总觉得[学习]得先收集资料、学习编程、学习计算机基础,这样不是不可以,但是这样学效率太低了!你要知道网络安全是一门技术,任何技术的学习一定是以实践为主的。也就是说很多的理论知识其实是可以在实践中去验证拓展的,这样学习比起你啃原理、啃书本要好理解很多。所以想要学习网络安全选对正确的学习方法很重要,这可以帮你少走很多弯路。
202年充电计划——自学手册 网络安全(黑客技术)
网安康sir
web安全 安全 网络 python linux
基于入门网络安全/黑客打造的:黑客&网络安全入门&进阶学习资源包前言什么是网络安全网络安全可以基于攻击和防御视角来分类,我们经常听到的“红队”、“渗透测试”等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。如何成为一名黑客很多朋友在学习安全方面都会半路转行,因为不知如何去学,在这里,我将这个整份答案分为黑客(网络安全)入门必备、黑客(网络安全)职业指南、黑客(网络安全)学习
自学网络安全(黑客技术)2025年 —90天学习计划
网安CILLE
web安全 学习 安全 网络 网络安全
基于入门网络安全/黑客打造的:黑客&网络安全入门&进阶学习资源包前言什么是网络安全网络安全可以基于攻击和防御视角来分类,我们经常听到的“红队”、“渗透测试”等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。如何成为一名黑客很多朋友在学习安全方面都会半路转行,因为不知如何去学,在这里,我将这个整份答案分为黑客(网络安全)入门必备、黑客(网络安全)职业指南、黑客(网络安全)学习
学习使用 Git 和 GitHub 开发项目的教程推荐
vortex5
学习 git github
Git和GitHub是现代软件开发中不可或缺的工具,无论你是个人开发者还是团队成员,掌握它们都能极大提升效率。本文精选了一系列优质教程资源,涵盖从基本Git命令到进阶多人协作的内容。这些教程既有文字形式,也有视频或交互式资源,适合不同学习风格的人。一、为何要学习Git和GitHub?Git是一个分布式版本控制系统,让你追踪代码变更、回滚错误并与他人协作;GitHub则将其扩展为一个云端平台,支持代
AI数字人分身系统+deepseek深层技术刨析
Yxh18137784554
数字人 人工智能 音视频 架构
#数字人分身系统##ai数字人#AI数字人分身系统:解码技术源头架构,重塑数字未来**在元宇宙加速渗透、人机交互边界持续突破的今天,AI数字人分身系统正从科幻概念演变为商业与社会的核心工具。其背后,一套融合顶尖AI技术与工程化思维的技术架构,正在重新定义“数字生命”的可能性。本文将从技术源头出发,深度解析AI数字人分身系统的核心架构设计,揭示其如何实现“形神兼备”的数字化身。---一、技术云罗数字
Electron对接语音唤醒Windows SDK
蚂蚁二娘
electron windows c++
一、项目主要依赖vuevue-cli-plugin-electron-builderelectronffi-napinodejs操作c++的dll库ref-napic++类型转换js-audio-recorder录音插件二、下载SDK设置好唤醒词后,下载windowsSdk,项目需要/bin目录下的msc_x64.dll和msc.dll(分别是64位和32位的dll,按需使用),以及/bin/ms
MySQL中,性别列(男,女)为什么不适合建索引?
程序员猫哥
MySQL mysql 数据库
文章目录在MySQL中,性别列(如仅包含"男"和"女"的列)不适合单独建立索引的主要原因如下:低区分度问题当某个列的唯一值比例(Cardinality)过低时(如性别列仅有2种值),索引的筛选效率会显著下降假设表中有100万条数据,使用性别索引查询时:SELECT*FROMusersWHEREgender='男'可能返回约50万条记录,此时:索引需要执行50万次回表查询(随机I/O)全表扫描只需一
零基础怎么开始学网络安全(非常详细)零基础入门到精通,收藏这一篇就够了
程序员羊羊
web安全 安全 网络 php 学习
一、学习建议1.了解基础概念:开始之前,了解网络安全的基本概念和术语是很重要的。你可以查找网络安全入门教程或在线课程,了解网络安全领域的基本概念,如黑客、漏洞、攻击类型等。2.网络基础知识:学习计算机网络基础知识,了解网络通信原理,不同网络协议(如TCP/IP)的工作方式,以及网络拓扑结构等。3.操作系统知识:了解常见的操作系统,特别是Windows和Linux。掌握基本的命令行操作和系统管理技能
网络安全入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
白帽黑客坤哥
web安全 网络 安全 python windows
href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/kdoc_html_views-1a98987dfd.css"rel="stylesheet"/>href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/ck_htmledit_v
AI学习指南RAG篇(24)-RAGFlow的社区与开源贡献
俞兆鹏
AI学习指南 人工智能
一、引言RAGFlow是一款基于深度文档理解的开源RAG(Retrieval-AugmentedGeneration,检索增强生成)引擎,旨在解决现有RAG技术在数据处理和生成答案方面的挑战。RAGFlow通过结合大型语言模型(LLMs)的强大生成能力和高效的信息检索系统,为用户提供了一种全新的交互体验。本文将鼓励读者参与到RAGFlow的开源社区中,共同推动技术的发展和创新。二、RAGFlow的
Nodejs模块:使用Helmet 增强Web应用安全性
ohn.yu
Nodejs javascript node.js
Helmet是一个Node.js中间件,主要用于增强Web应用的安全性。它通过设置各种HTTP响应头,帮助你的应用抵御多种常见的Web漏洞攻击,例如跨站脚本攻击(XSS)、点击劫持(Clickjacking)、内容嗅探攻击(ContentSniffing)等。1.什么是Helmet?为什么使用Helmet?Helmet本身并不是一个"银弹",不能解决所有的安全问题,但它提供了一个简单有效的方式来设
Redis 使用入门与进阶指南
ohn.yu
技术杂谈 redis 数据库 缓存
Redis(RemoteDictionaryServer)是一个高性能的开源内存数据存储系统,常被用作数据库、缓存和消息队列。它以速度快、支持多种数据结构和简单易用而著称。本文将带你从Redis的基础用法开始,逐步深入到适合中级技术人员的实际应用场景。如果你是一个初学者或有一定经验的技术人员,这篇博客会帮助你更好地掌握Redis。什么是Redis?Redis是一个键值对存储系统,但它不仅仅是简单的
如何在 Node.js 中使用 .env 文件管理环境变量 ?
鸠摩智首席音效师
node.js
Node.js应用程序通常依赖于环境变量来管理敏感信息或配置设置。.env文件已经成为一种流行的本地管理这些变量的方法,而无需在代码存储库中公开它们。本文将探讨.env文件为什么重要,以及如何在Node.js应用程序中有效的使用它。为什么使用.env文件?Security在源代码中保留敏感信息(如API密钥、数据库凭据)可能会将它们暴露给意想不到的访问者。将此数据分离到特定于环境的文件中,您可以使
【Vue+TypeScript实战指南:提高代码质量和开发效率】
小怪兽9699
typescript vue.js 前端
前言在现代前端开发中,Vue.js是一个非常流行且强大的框架,而TypeScript则是增强代码类型安全性和可维护性的利器。本文将详细介绍如何结合Vue和TypeScript来构建高质量的应用程序。无论你是有一定基础的开发者还是希望进一步提升技能的高手,本文都将为你提供详细的步骤和代码示例。1.环境搭建首先,确保你已经安装了Node.js和npm。然后,全局安装VueCLI:npminstall-
Node.js 中使用 RabbitMQ
海上彼尚
node.js node.js rabbitmq 分布式
目录一、RabbitMQ简介二、核心概念解析三、环境搭建(以Ubuntu为例)四、Node.js实战:生产者与消费者1.安装依赖2.生产者代码(发送消息)3.消费者代码(处理消息)五、高级配置与最佳实践六、常见问题与解决方案七、总结一、RabbitMQ简介RabbitMQ是一个基于AMQP协议的开源消息代理工具,专为分布式系统设计。它通过解耦生产者和消费者实现异步通信,支持流量削峰、任务队列、服务
若依框架入门指南:快速上手SpringBoot+前后端分离版
小小鸭程序员
spring java spring boot 后端 intellij-idea
若依(RuoYi)是一款基于SpringBoot的快速开发平台,集成了权限管理、代码生成、监控管理等功能。本文将以SpringBoot+Vue前后端分离版本为例,带你快速上手若依框架。一、环境准备基础环境:JDK1.8+MySQL5.7+Redis5.0+Maven3.6+Node.js14+(前端)下载项目:#后端项目gitclonehttps://gitee.com/y_project/Ruo
Deno入门教程:Node.js 的替代品
xiaoweids
编程语言 JavaScript node.js javascript 开发语言
转自:微点阅读https://www.weidianyuedu.com这几天假期,我学习了一下Deno[1]。它是Node.js的替代品。有了它,将来可能就不需要Node.js了。这篇文章就是Deno的一个初步介绍,尝试回答为什么Node.js不能满足需要,以及Deno能够带给我们什么?以下内容主要基于BertBelder[2]和RyanDahl[3]的最新演讲。0、进入主题之前,先说一下Deno
nvm 安装某个node.js版本后不能使用或者报错,或不能使用npm的问题
腥臭腐朽的日子熠熠生辉
node.js npm 前端
安装了nvm之后发现不能使用某个版本的node.js,报错之后,不能使用npm这个命令。可以这样解决:1、再node.js官网直接下载node.js的压缩包。找到nvm的安装目录2、直接将文件夹解压到这个安装目录中修改一下名字即可。
在Ubuntu上安装MEAN Stack的4个步骤
ubuntu
在Ubuntu上安装MEANStack的4个步骤为:1.安装MEAN;2.安装MongoDB;3.安装NodeJS,Git和NPM;4.安装剩余的依赖项。什么是MEANStack?平均堆栈一直在很大程度上升高为基于稳健的基于JavaScript的开发堆栈。名称的意思是指其组件;MongoDB,ExpressJS,Angularjs和NodeJS。第1步:安装MEAN对于此安装,我们将在本指南中使用
Vue.js的watch监听
阿珊和她的猫
vue.js 前端 javascript
前端开发工程师、技术日更博主、已过CET6阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1牛客高级专题作者、打造专栏《前端面试必备》、《2024面试高频手撕题》、《前端求职突破计划》蓝桥云课签约作者、上架课程《Vue.js和Egg.js开发企业级健康管理项目》、《带你从入门到实战全面掌握uni-app》文章目录引言`watch`选项的基本概念`watch`选项的基本语法`watch
解读Servlet原理篇二---GenericServlet与HttpServlet
周凡杨
java HttpServlet 源理 GenericService 源码
在上一篇《解读Servlet原理篇一》中提到,要实现javax.servlet.Servlet接口(即写自己的Servlet应用),你可以写一个继承自javax.servlet.GenericServletr的generic Servlet ,也可以写一个继承自java.servlet.http.HttpServlet的HTTP Servlet(这就是为什么我们自定义的Servlet通常是exte
MySQL性能优化
bijian1013
数据库 mysql
性能优化是通过某些有效的方法来提高MySQL的运行速度,减少占用的磁盘空间。性能优化包含很多方面,例如优化查询速度,优化更新速度和优化MySQL服务器等。本文介绍方法的主要有:
a.优化查询
b.优化数据库结构
ThreadPool定时重试
dai_lm
java ThreadPool thread timer timertask
项目需要当某事件触发时,执行http请求任务,失败时需要有重试机制,并根据失败次数的增加,重试间隔也相应增加,任务可能并发。
由于是耗时任务,首先考虑的就是用线程来实现,并且为了节约资源,因而选择线程池。
为了解决不定间隔的重试,选择Timer和TimerTask来完成
package threadpool;
public class ThreadPoolTest {
Oracle 查看数据库的连接情况
周凡杨
sql oracle 连接
首先要说的是,不同版本数据库提供的系统表会有不同,你可以根据数据字典查看该版本数据库所提供的表。
select * from dict where table_name like '%SESSION%';
就可以查出一些表,然后根据这些表就可以获得会话信息
select sid,serial#,status,username,schemaname,osuser,terminal,ma
类的继承
朱辉辉33
java
类的继承可以提高代码的重用行,减少冗余代码;还能提高代码的扩展性。Java继承的关键字是extends
格式:public class 类名(子类)extends 类名(父类){ }
子类可以继承到父类所有的属性和普通方法,但不能继承构造方法。且子类可以直接使用父类的public和
protected属性,但要使用private属性仍需通过调用。
子类的方法可以重写,但必须和父类的返回值类
android 悬浮窗特效
肆无忌惮_
android
最近在开发项目的时候需要做一个悬浮层的动画,类似于支付宝掉钱动画。但是区别在于,需求是浮出一个窗口,之后边缩放边位移至屏幕右下角标签处。效果图如下:
一开始考虑用自定义View来做。后来发现开线程让其移动很卡,ListView+动画也没法精确定位到目标点。
后来想利用Dialog的dismiss动画来完成。
自定义一个Dialog后,在styl
hadoop伪分布式搭建
林鹤霄
hadoop
要修改4个文件 1: vim hadoop-env.sh 第九行 2: vim core-site.xml <configuration> &n
gdb调试命令
aigo
gdb
原文:http://blog.csdn.net/hanchaoman/article/details/5517362
一、GDB常用命令简介
r run 运行.程序还没有运行前使用 c cuntinue 
Socket编程的HelloWorld实例
alleni123
socket
public class Client
{
public static void main(String[] args)
{
Client c=new Client();
c.receiveMessage();
}
public void receiveMessage(){
Socket s=null;
BufferedRea
线程同步和异步
百合不是茶
线程同步 异步
多线程和同步 : 如进程、线程同步,可理解为进程或线程A和B一块配合,A执行到一定程度时要依靠B的某个结果,于是停下来,示意B运行;B依言执行,再将结果给A;A再继续操作。 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回,同时其它线程也不能调用这个方法
多线程和异步:多线程可以做不同的事情,涉及到线程通知
&
JSP中文乱码分析
bijian1013
java jsp 中文乱码
在JSP的开发过程中,经常出现中文乱码的问题。
首先了解一下Java中文问题的由来:
Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,
js实现页面跳转重定向的几种方式
bijian1013
JavaScript 重定向
js实现页面跳转重定向有如下几种方式:
一.window.location.href
<script language="javascript"type="text/javascript">
window.location.href="http://www.baidu.c
【Struts2三】Struts2 Action转发类型
bit1129
struts2
在【Struts2一】 Struts Hello World http://bit1129.iteye.com/blog/2109365中配置了一个简单的Action,配置如下
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configurat
【HBase十一】Java API操作HBase
bit1129
hbase
Admin类的主要方法注释:
1. 创建表
/**
* Creates a new table. Synchronous operation.
*
* @param desc table descriptor for table
* @throws IllegalArgumentException if the table name is res
nginx gzip
ronin47
nginx gzip
Nginx GZip 压缩
Nginx GZip 模块文档详见:http://wiki.nginx.org/HttpGzipModule
常用配置片段如下:
gzip on; gzip_comp_level 2; # 压缩比例,比例越大,压缩时间越长。默认是1 gzip_types text/css text/javascript; # 哪些文件可以被压缩 gzip_disable &q
java-7.微软亚院之编程判断俩个链表是否相交 给出俩个单向链表的头指针,比如 h1 , h2 ,判断这俩个链表是否相交
bylijinnan
java
public class LinkListTest {
/**
* we deal with two main missions:
*
* A.
* 1.we create two joined-List(both have no loop)
* 2.whether list1 and list2 join
* 3.print the join
Spring源码学习-JdbcTemplate batchUpdate批量操作
bylijinnan
java spring
Spring JdbcTemplate的batch操作最后还是利用了JDBC提供的方法,Spring只是做了一下改造和封装
JDBC的batch操作:
String sql = "INSERT INTO CUSTOMER " +
"(CUST_ID, NAME, AGE) VALUES (?, ?, ?)";
[JWFD开源工作流]大规模拓扑矩阵存储结构最新进展
comsci
工作流
生成和创建类已经完成,构造一个100万个元素的矩阵模型,存储空间只有11M大,请大家参考我在博客园上面的文档"构造下一代工作流存储结构的尝试",更加相信的设计和代码将陆续推出.........
竞争对手的能力也很强.......,我相信..你们一定能够先于我们推出大规模拓扑扫描和分析系统的....
base64编码和url编码
cuityang
base64 url
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
web应用集群Session保持
dalan_123
session
关于使用 memcached 或redis 存储 session ,以及使用 terracotta 服务器共享。建议使用 redis,不仅仅因为它可以将缓存的内容持久化,还因为它支持的单个对象比较大,而且数据类型丰富,不只是缓存 session,还可以做其他用途,一举几得啊。1、使用 filter 方法存储这种方法比较推荐,因为它的服务器使用范围比较多,不仅限于tomcat ,而且实现的原理比较简
Yii 框架里数据库操作详解-[增加、查询、更新、删除的方法 'AR模式']
dcj3sjt126com
数据库
public function getMinLimit () { $sql = "..."; $result = yii::app()->db->createCo
solr StatsComponent(聚合统计)
eksliang
solr聚合查询 solr stats
StatsComponent
转载请出自出处:http://eksliang.iteye.com/blog/2169134
http://eksliang.iteye.com/ 一、概述
Solr可以利用StatsComponent 实现数据库的聚合统计查询,也就是min、max、avg、count、sum的功能
二、参数
百度一道面试题
greemranqq
位运算 百度面试 寻找奇数算法 bitmap 算法
那天看朋友提了一个百度面试的题目:怎么找出{1,1,2,3,3,4,4,4,5,5,5,5} 找出出现次数为奇数的数字.
我这里复制的是原话,当然顺序是不一定的,很多拿到题目第一反应就是用map,当然可以解决,但是效率不高。
还有人觉得应该用算法xxx,我是没想到用啥算法好...!
还有觉得应该先排序...
还有觉
Spring之在开发中使用SpringJDBC
ihuning
spring
在实际开发中使用SpringJDBC有两种方式:
1. 在Dao中添加属性JdbcTemplate并用Spring注入;
JdbcTemplate类被设计成为线程安全的,所以可以在IOC 容器中声明它的单个实例,并将这个实例注入到所有的 DAO 实例中。JdbcTemplate也利用了Java 1.5 的特定(自动装箱,泛型,可变长度
JSON API 1.0 核心开发者自述 | 你所不知道的那些技术细节
justjavac
json
2013年5月,Yehuda Katz 完成了JSON API(英文,中文) 技术规范的初稿。事情就发生在 RailsConf 之后,在那次会议上他和 Steve Klabnik 就 JSON 雏形的技术细节相聊甚欢。在沟通单一 Rails 服务器库—— ActiveModel::Serializers 和单一 JavaScript 客户端库——&
网站项目建设流程概述
macroli
工作
一.概念
网站项目管理就是根据特定的规范、在预算范围内、按时完成的网站开发任务。
二.需求分析
项目立项
我们接到客户的业务咨询,经过双方不断的接洽和了解,并通过基本的可行性讨论够,初步达成制作协议,这时就需要将项目立项。较好的做法是成立一个专门的项目小组,小组成员包括:项目经理,网页设计,程序员,测试员,编辑/文档等必须人员。项目实行项目经理制。
客户的需求说明书
第一步是需
AngularJs 三目运算 表达式判断
qiaolevip
每天进步一点点 学习永无止境 众观千象 AngularJS
事件回顾:由于需要修改同一个模板,里面包含2个不同的内容,第一个里面使用的时间差和第二个里面名称不一样,其他过滤器,内容都大同小异。希望杜绝If这样比较傻的来判断if-show or not,继续追究其源码。
var b = "{{",
a = "}}";
this.startSymbol = function(a) {
Spark算子:统计RDD分区中的元素及数量
superlxw1234
spark spark算子 Spark RDD分区元素
关键字:Spark算子、Spark RDD分区、Spark RDD分区元素数量
Spark RDD是被分区的,在生成RDD时候,一般可以指定分区的数量,如果不指定分区数量,当RDD从集合创建时候,则默认为该程序所分配到的资源的CPU核数,如果是从HDFS文件创建,默认为文件的Block数。
可以利用RDD的mapPartitionsWithInd
Spring 3.2.x将于2016年12月31日停止支持
wiselyman
Spring 3
Spring 团队公布在2016年12月31日停止对Spring Framework 3.2.x(包含tomcat 6.x)的支持。在此之前spring团队将持续发布3.2.x的维护版本。
请大家及时准备及时升级到Spring
fis纯前端解决方案fis-pure
zccst
JavaScript
作者:zccst
FIS通过插件扩展可以完美的支持模块化的前端开发方案,我们通过FIS的二次封装能力,封装了一个功能完备的纯前端模块化方案pure。
1,fis-pure的安装
$ fis install -g fis-pure
$ pure -v
0.1.4
2,下载demo到本地
git clone https://github.com/hefangshi/f