图书商城Vue+Element+Node项目练习(...)

本系列文章是为学习Vue的项目练习笔记,尽量详细记录一下一个完整项目的开发过程。面向初学者,本人也是初学者,搬砖技术还不成熟。项目在技术上前端为主,包含一些后端代码,从基础的数据库(Sqlite)、到后端服务Node.js(Express),再到Web端的Vue,包含服务端、管理后台、商城网站、小程序/App,分为下面多个篇文档。。
系列目录:
- 图书商城Vue+Element+Node+TS项目练习
- 图书商城①管理后台Vue2+ElementUI
- 图书商城②后端服务Node+Express+Sqlite
- 未完成:商城网站Vue3+TS、商城APP端Vue3+TS+uniapp
- 源代码地址:Github / KWebNote,Gitee / KWebNote
- 管理后端在线演示地址:http://kanding.gitee.io/kwebnote (用户名、密码随意)
01、这是什么项目?
一个很简单的图书商城系统,可以下单购买书籍,支持PC端、移动端访问。因此在业务上就有多个子系统,如后台管理系统,用来管理用户、图书、订单,给管理员用;面向PC端/移动端的图书(前台)商城网站,面向移动端的商城App、小程序;以及后端服务和数据库。


如下图,包含多个子系统

后端服务(server):
- 数据库+后台API服务,为前台应用提供登录服务、文件管理服务、数据管理服务等功能。
- 采用Node+Express为主的技术栈,数据库使用的轻量级关系型数据库Sqlite3。
管理后台(book_admin):
- 图书系统的管理后台,管理员或商家使用。提供了登录、图书管理、订单管理、字典管理等各种管理功能,满足系统的运营、管理需求。
- 采用Vue2版本为主的技术栈,其他还包括ElementUI、vuex、vue-router、axios、echarts、i18n、less等。
商城前台(book_shop):
- 面向C端用户的图书商城网站,自适应PC端、移动端浏览器
- 进行中
APP/小程序:计划中...
02、需求分析
简单做一个需求设计:

后端服务(server):
- 文件上传、下载,支持图片上传和下载。
- 登录,验证用户信息并返回Token。
- 数据管理API,图书、订单、字典数据的增删改查管理,及数据的存储。
管理后台(book_admin):
- 登录页:用户登录,记住用户名。
- 首页:作为默认页面,展示系统的一些概况、用户的一些统计信息、通知信息等。
- 图书管理:图书信息的增删改查管理。
- 订单管理:订单的查询、查看功能,订单在图书商城中用户下单产生。
- 字典管理:字典类型、字典数据的管理,用来管理一些可变的分类数据,如图书分类、商品促销类型、品牌、国家、省市区地址等。
图书商城(包括网站、App/小程序):
- 登录:用户登录,记住用户名。
- 首页:商城的首页,显示Logo、搜索框、商品类型、广告,及推荐的商品图书。
- 商品搜索列表:显示搜索结果的商品列表。
- 商品详情页面:显示商品的基本信息、详细信息、评论信息,可以加入购物车。
- 购物车:加入购物车的商品,本地保存,可以下单。
- 个人中心:个人信息及个人订单。
03、技术架构
而在技术上以Vue为主(Vue2、Vue3都有,不同子系统),UI框架Element-UI为主。后台服务做的比较简单,主要是为了满足前端服务接口,基于Node,Express+Sqlite数据库,Sqlite3数据库非常的轻量,是一个比较完整的关系型数据库,只需要安装一个npm包即可,通过JS访问。
虽然是一个小项目,还是画一个技术架构图吧:(未完...)

后端服务(server):
- Node.js,开发运行环境
v16.17.1 - express,Web组件
v4.18 - sqlite3,数据库
express.static:静态资源托管,express提供的,无需额外安装。multer:文件上传
管理后台(book_admin):Vue v2.,ElementUI v2.
vuex:状态管理vue-router:前端路由axios:HTTP调用echarts:图表组件,按需定制i18n:多语言国际化vue-i18nv8.*版本@wangeditor:富文本编辑器Less:CSS预处理器/语言
图书商城网站
- Vue3,TypeScript
- //TODO
App/小程序
- //TODO
04、部署
NodeJS部署
前后端部署的可以用NodeJS。
- 把前端编译好的包放到Node目录下,用Express的静态文件服务中间件实现代理。
- 如果前端使用了history模式路由,则需要后端设置重定向。
//管理后台"book_admin"的部署
//静态资源
server.use('/bookadmin', express.static('./book_admin'));
const fs = require('fs')
const rpath = require('path')
//前端路由的重定向
server.get('/bookadmin/*', function(req, res) {
const html = fs.readFileSync(rpath.resolve(__dirname, '../server/book_admin/index.html'), 'utf-8')
res.send(html)
})
Gitee Pages部署
同Github Pages 一样,Gitee Pages也是一个静态WEB服务,可以用来发布一些静态页面,为了网上可以预览管理后台网站,就用Gitee Pages部署一个。
- 因为只能部署静态网页,管理后台项目需要做一点调整:
- 项目里后简易的实现了一个mock,模拟一些数据。
- 修改路由模式为hash,避免刷新后出现404错误。
- Gitee Page的部署比较简单,如下图,按照官方提示配置地址路径即可。

05、其他
1.1、API接口封装axios
与后端的API调用采用axios插件,Axios 是一个基于XHR(XMLHttpRequests)支持promise 的网络请求库,作用于node.js 和浏览器中。内部是基于XHR(XMLHttpRequest)实现的(在浏览器中),兼容性良好,功能也比较完整。Fetch其实也不错,是浏览器原生支持的HTTP调用技术,语法简单,只是在功能上Axios要更完善一些。
基于axios来封装统一的API调用,主要目的:
- 全局的配置、拦截,统一配置一些请求、响应信息和处理规则。
- 统一管理所有API接口,方便mock测试。
♂️实现过程:
1、api.js的封装:统一管理API的URL地址和接口,配置代理。
// 地址配置
// 开发环境的跨域代理
const proxy = process.env.NODE_ENV === 'production' ? '' : '/server';
const URL = {
proxy: proxy,
upload: proxy + '/upload',
login: '/api/login',
book_list: '/api/book/list',
}
// 引入axios
import axios from 'axios';
//创建实例
let api = axios.create({
baseURL: proxy, //基础URL
timeout: 9000,
});
//拦截的封装,对请求、响应进行通用化的拦截处理
//请求拦截,可处理token、实现进度条效果
api.interceptors.request.use(function (cfg) {
return cfg;
})
// 响应拦截,可判断响应状态
api.interceptors.response.use(res => {
if (res.status === 200 && res.data?.status === 'OK')
return Promise.resolve(res.data);
else
return Promise.reject(res.data?.message ? res.data.message : res.status);
}, err => {
console.error(err);
return Promise.reject(err.message);
})
//接口
api.login = function (param) {
return api.post(URL.login, param);
}
api.book_list = function (param) {
return api.post(URL.book_list, param);
}
2、在main.js引入api:挂载到Vue原型上,就可以在Vue中全局使用了。
// 引入axios封装的api
import api from './api/api';
// 挂载到vue上
Vue.prototype.$api = api;
调用方式:更简洁
laodData() {
this.loading = true;
this.$api.dictype()
.then(res => {
this.dictypeList = res.data;
})
.catch(err => {
this.$message.error(err);
})
.finally(() => this.loading = false)
},
3、处理跨域,本地开发调试的时候,调用后端API肯定是要配置代理的,解决跨域问题。正式部署的时候,前端代码和后端服务大多是部署在一块的,就不存在跨域问题。Vue中可通过本地Node服务端来代理实现跨域,在vue.config.js中配置需要代理的的地址。
这里用“/server”作为代理URL的前缀标志,在API访问中都需要加上这个前缀。
module.exports = defineConfig({
//基本url,多用于指定子路径
publicPath: '/bookadmin/',
devServer: {
proxy: {
'/server': { //用 “/server” 代理 “http://localhost:3000”
target: 'http://localhost:3000', //代理的目标
changeOrigin: true,
ws: true,
pathRewrite: { '^/server': '' }
}
}
},
遇到一个401的错误,详见《Vue跨域配置异常采坑:Request failed with status code 401》
1.2、vue页面模板/片段
安装了Vetur插件,会自带vue单文件的多种代码片段模板,如下图输入vue就会提示,键盘、鼠标选择或者回车选中第一个。

如果需要自定义片段,也很简单,通过系统菜单>“配置用户代码片段”功能来配置。

如下示例,代码片段配置是一个JSON结构配置文件,body为片段内容,字符数组结构。$n($1)为光标位置,选择片段后,光标所在位置,如果多个则Tab键切换。
"Vue": {
"prefix": "vuek",
"body": [
"<template>",
"\t$1",
"</template>",
"",
"<script>",
"export default {",
"\tdata() {",
"\t\treturn {",
"\t\t\t",
"\t\t}",
"\t},",
"\tmethods: {",
"\t\t",
"\t}",
"}",
"</script>",
"",
"<style lang='less' scoped>",
"\t",
"</style>",
],
"description": "vue页码模板"
}
}
参考资料:
️版权申明:版权所有@安木夕,本文内容仅供学习,欢迎指正、交流,转载请注明出处!原文编辑地址-语雀
图书商城Vue+Element+Node项目练习(...)的更多相关文章
- 在Vue&Element前端项目中,使用FastReport + pdf.js生成并展示自定义报表
在我的<FastReport报表随笔>介绍过各种FastReport的报表设计和使用,FastReport报表可以弹性的独立设计格式,并可以在Asp.net网站上.Winform端上使用, ...
- 在Vue&Element前端项目中,对于字典列表的显示处理
在很多项目开发中,我们为了使用方便,一般都会封装一些自定义组件来简化界面的显示处理,例如参照字典的下拉列表显示,是我们项目中经常用到的功能之一,本篇随笔介绍在Vue&Element前端项目中如 ...
- Vue + Element UI项目初始化
1.安装相关组件 1.1安装Node 检查本地是否安装node node -v 如果没有安装,从Node官网下载 1.2安装npm npm -v 如果没有安装:使用该指令安装: npm install ...
- 基于electron+vue+element构建项目模板之【自定义标题栏&右键菜单项篇】
1.概述 开发平台OS:windows 开发平台IDE:vs code 本篇章将介绍自定义标题栏和右键菜单项,基于electron现有版本安全性的建议,此次的改造中主进程和渲染进程彼此语境隔离,通过预 ...
- 基于electron+vue+element构建项目模板之【改造项目篇】
1.概述 开发平台OS:windows 开发平台IDE:vs code 上一篇中已完成了electron-vue项目的创建,本篇章中则介绍在此项目基础上进行取消devtools的安装.项目结构的改造. ...
- 基于electron+vue+element构建项目模板之【创建项目篇】
1.概述 electron:使用javascript.css.html构建跨平台的桌面应用程序 vue:数据驱动视图中的一款渐进式的javascript框架 element:基于vue的桌面端UI组件 ...
- vue + element + 初始化项目
前提:已经安装了好了npm 和 vue脚手架 注意: 进入想要放置项目的目录下. 1.vue init webpack sun-vue-element 2.根据提示输入 y/n 3.npm run d ...
- 【vue】使用vue+element搭建项目,Tree树形控件使用
1.依赖安装 本例中,使用render-content进行树节点内容的自定义,因此需要支持JSX语法.(见参考资料第3个) 在Git bash中运行一下指令 cnpm install\ babel-p ...
- 【vue】vue +element 搭建项目,mock模拟数据(纯干货)
1.安装mockjs依赖 (c)npm install mockjs --save-dev 2.安装axios(Ajax) (c)npm install --save axios 3.项目目录 4.设 ...
- vue+element ui项目总结点(一)select、Cascader级联选择器、encodeURI、decodeURI转码解码、mockjs用法、路由懒加载三种方式
不多说上代码: <template> <div class="hello"> <h1>{{ msg }}</h1> <p> ...
随机推荐
- [Web Server]Tomcat调优之工作原理、线程池/连接池
1 Tomcat 概述 Tomcat隶属于Apache基金会,是开源的轻量级Web应用服务器,使用非常广泛. 1.0 Tomcat 容器与原理 1.0.1 Tomcat组件构成 注意,如图所示,阴影部 ...
- [Linux]浅析"command > /dev/null 2>&1 &" 与 "command 1>/dev/null 2>&1 &"
1 问题描述 1.1 问题描述 在一项目中查看CENTOS 服务器的定时任务crontab时查看到如下这段命令: 命令clearLog.sh > /dev/null 2>&1 &a ...
- Hugging News #0407: Google AI 的 Pix2Struct 来啦、开发者资源页面发布
每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...
- API Gateway vs Load Balancer:选择适合你的网络流量管理组件
本文从对比了 API Gateway 和 Load Balancer 的功能区别,帮助读者更好地了解他们在系统架构中扮演的角色. 作者陈泵,API7.ai 技术工程师. 原文链接 由于互联网技术的发展 ...
- 洛谷:P5716日份天数
题目描述 输入年份和月份,输出这一年的这一月有多少天.需要考虑闰年. 输入格式 输入两个正整数,分别表示年份 \(y\) 和月数 \(m\),以空格隔开. 输出格式 输出一行一个正整数,表示这个月有多 ...
- LINUX经常使用的命令详解
LINUX经常使用的命令详解 源地址:http://blog.itpub.net/29065182/viewspace-1189162/ 1.man 对你熟悉或不熟悉的命令提供帮助解释 eg:man ...
- CSS3实现了左右固定中间自适应的几种方法
1,弹性盒(flex)布局 中间 .center 区域设置 flex-grow: 1 或者 width: 100% .container { width: 100%; min-height: 2 ...
- 机器学习02-(损失函数loss、梯度下降、线性回归、评估训练、模型加载、岭回归、多项式回归)
机器学习-02 回归模型 线性回归 评估训练结果误差(metrics) 模型的保存和加载 岭回归 多项式回归 代码总结 线性回归 绘制图像,观察w0.w1.loss的变化过程 以等高线的方式绘制梯度下 ...
- Win YAPI + Jenkins 实现接口自动化测试
自动化测试 传统的接口自动化测试成本高,大量的项目没有使用自动化测试保证接口的质量,仅仅依靠手动测试,是非常不可靠和容易出错的. 为了解决这个问题,使用YAPI接口自动化测试功能,只需要配置每个接口的 ...
- 2023-03-29:如何高效计算三条线路选择方案?小A的旅行线路规划问题
2023-03-29:第一行有一个正整数n(3<=n<=100000),代表小A拟定的路线数量 第二行有n个正整数,第i个代表第i条路线的起始日期 第三行有n个正整数,第i个代表第i条路线 ...