vue3+node.js+mysql写接口(二)

目录

一、产品模块(products表)

1.1、添加产品(/adminapi/product/add)

1.2、产品列表(/adminapi/product/list)

1.3、编辑产品(/adminapi/product/update)

1.4、首页产品联动

二、前台模块

2.1、路由配置

2.2、NavBar组件

2.3、新闻搜索

2.4、新闻选项卡

2.5、新闻详情

2.6、产品与服务

三、总结

前言:

前端项目git地址:Enterprise Product Management System: 企业产品管理系统:web端展示、后台进行添加信息,前端用的vue3+vuex。

后端项目git地址:Enterprise Product Management System Backend: 企业产品管理系统:后端项目,用的node +mysql

查看git记录:"第一版"是只有后台管理+admin/web分离的接口,"第二版"是将前台页面和后台管理系统放在一起了,根据自己需要进行下载与切换。目前是"第二版"。

一、产品模块(products表)

1.1、添加产品(/adminapi/product/add)

后端先创建一个products表

-- 创建products表
CREATE TABLE IF NOT EXISTS products (id INT AUTO_INCREMENT PRIMARY KEY,-- 1、传统自增int主键title VARCHAR(50) NOT NULL UNIQUE,introduction TEXT,detail TEXT,cover VARCHAR(255),userId INT DEFAULT 1,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,edit_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- 2、UUID作为主键
-- id CHAR(36) PRIMARY KEY DEFAULT (UUID())
-- 缺点:不连续,索引性能低于自增int
-- 3、时间戳作为主键
-- 4、带前缀的自增编号(如 NEWS0001、PROD0001)
-- 每个表直接会重复?-- 插入测试产品数据
INSERT INTO products (title, introduction, detail, cover,userId) VALUES
('标题1','简要描述1','详细描述1','/avatar/admin.jpg', 1),
('标题2','简要描述1','详细描述2','/avatar/editor.jpg', 2)

1.2、产品列表(/adminapi/product/list)

1.3、编辑产品(/adminapi/product/update)

前三个接口几乎可以照搬vue3+node.js+mysql写接口(一)_node.js mysql vue-CSDN博客,除了字段不一样。

1.4、首页产品联动

当添加产品成功后,首页就会产生相应的轮播图

<el-carousel:interval="4000"type="card"height="400px"v-if="loopList.length > 0"><el-carousel-item v-for="item in loopList" :key="item.id"><div:style="{backgroundImage: `url(http://localhost:3000${item.cover})`,backgroundSize: 'cover',height: '400px',}"><h3>{{ item.title }}</h3></div></el-carousel-item>
</el-carousel>
<style lang="scss" scoped>
.el-carousel__item h3 {color: white;opacity: 0.75;line-height: 200px;margin: 0;text-align: center;
}
.el-carousel__item:nth-child(2n) {background-color: #99a9bf;
}
.el-carousel__item:nth-child(2n + 1) {background-color: #d3dce6;
}
</style>

二、前台模块

这里介绍的是单独开发一个项目,而不是和后台管理放在一起的。

2.1、路由配置

import { createRouter, createWebHashHistory } from "vue-router";
import Home from "../views/Home.vue";
import News from "../views/News.vue";
import NewsDetails from "../views/NewsDetails";
import Product from "../views/Product.vue";
const routes = [{path: "/",name: "home",component: Home,},{path: "/news",name: "news",component: News,},{path: "/news-detail/:id",name: "NewsDetails",component: NewsDetails,},{path: "/product",name: "product",component: Product,},
];
const router = createRouter({history: createWebHashHistory(),routes,
});
export default router;

2.2、NavBar组件

<template><div class="navbar"><el-menu:default-active="route.fullPath"class="el-menu-demo"mode="horizontal"router><el-menu-item index="/">首页</el-menu-item><el-menu-item index="/news">新闻中心</el-menu-item><el-menu-item index="/product">产品与服务</el-menu-item><el-menu-item index="" @click="handleClick">登录</el-menu-item></el-menu><div class="right">企业门户管理系统</div></div>
</template>
<script setup>
import { useRoute } from "vue-router";
const route = useRoute();
const handleClick = () => {window.location = "http://localhost:8081/";
};
</script>
<style lang="scss" scoped>
.navbar {position: sticky;top: 0px;z-index: 999;
}
.right {position: fixed;top: 0;right: 20px;width: 160px;height: 59px;line-height: 59px;text-align: center;
}
</style>

2.3、新闻搜索

    <div class="search-center"><el-popovertitle="检索结果"placement="bottom"width="50%":visible="popVisible"><template #reference><el-inputv-model="searhText"placeholder="请输入新闻关键字":prefix-icon="Search"type="search"size="large"@input="popVisible = true"@blur="popVisible = false"/></template><div v-if="newsListFilter.length"><divv-for="(data, index) in newsListFilter":key="data.id"class="search-item"@click="handleClick(data.id)">{{ index + 1 }} . {{ data.title }}</div></div><div v-else><el-empty description="暂无新闻" :image-size="50" /></div></el-popover></div>
// 根据搜索内容过滤
const newsListFilter = computed(() => {return newsList.value.filter((item) => {return item.title.includes(searhText.value);});
});

2.4、新闻选项卡

    <el-tabs v-model="whichTab" style="margin: 20px"><el-tab-panev-for="item in options":key="item.value":label="item.label":name="item.value"><el-row :gutter="20"><el-col :span="18"><divv-for="data in tabnews[item.value]":key="data.id"style="padding: 10px"><el-card:body-style="{ padding: '0px' }"shadow="hover"@click="handleClick(data.id)"><divclass="tab-image":style="{backgroundImage: `url(http://localhost:3000${data.cover})`,}"></div><div style="padding: 14px; float: left"><span>{{ data.title }}</span><div class="edit-time"><span>{{ formatTime.getTime(data.edit_time) }}</span></div></div></el-card></div></el-col><el-col :span="6"><el-timeline style="padding-top: 16px"><el-timeline-itemv-for="data in tabnews[item.value]":key="data.id":timestamp="formatTime.getTime(data.edit_time)">{{ data.title }}</el-timeline-item></el-timeline></el-col></el-row></el-tab-pane></el-tabs>

借助lodash组装数组,将其分为三类(后台创建时的三类选项)

import _ from "lodash";//npm i lodash
// 组装选项卡数据
// groupBy用法:https://www.lodashjs.com/docs/lodash.groupBy
const tabnews = computed(() =>_.groupBy(newsList.value, (item) => item.category)
);

2.5、新闻详情

点击右侧新闻,此时左侧内容更新:这里相当于自己跳转到自己,onMounted只会触发一次,需要监听路由变化的话,需要使用watchEffect

const stop = watchEffect(async () => {if (!route.params.id) return;const res = await axios.get(`/adminapi/news/list/${route.params.id}`);const res1 = await axios.get(`/adminapi/news/topList?limit=4`); //可以用vuex存储主页的;也可以由后端返回最新的前四个数据currentNews.value = res.data[0];topNews.value = res1.data;
});
// 页面销毁时取消监听
onBeforeUnmount(() => {stop();
});
const router = useRouter();
// 跳转详情
// 注意:这里相当于自己跳转到自己,onMounted只会触发一次,需要监听路由变化的话,需要使用watchEffect
const handleClick = (id) => {router.push(`/news-detail/${id}`);
};

2.6、产品与服务

其实就是将后端的数据返回,前端根据指定样式渲染即可

三、总结

后端:

post请求参数:用body接收;

get请求参数:接收URL路径中的参数用params接收、查询字符串参数用query接收

前端:

1、model属性:让表单的验证功能正常工作,再结合rules+prop

2、如果表单form是ref或者reactive对象,直接赋值,会改变原始数据tableData,需要深拷贝

3、文件上传时,前端拿到的是file文件【二进制】格式,传给后端时一般用FormData形式,此时需要改变消息头:multipart/form-data

4、当一个页面自己跳转到自己,onMounted只会触发一次,需要监听路由变化的话,需要使用watchEffect,在页面销毁时取消监听。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/914000.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914000.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解析LLM层裁剪:Qwen实战指南

怎么实现对LLM 部分层裁剪输出结果 Qwen 7b 是28层MLP,28头 Qwen 14b 是48层MLP,40头,词向量维度:5120 模型加载部分 from transformers import AutoTokenizer, AutoModelForCausalLM

【AI大模型】深度学习正则化技术:Batch Normalization (BatchNorm) 详解

1. 为什么需要 BatchNorm&#xff1f; - 问题的根源&#xff1a;Internal Covariate Shift (ICS)问题描述&#xff1a; 深度神经网络在训练过程中&#xff0c;随着网络层数的加深&#xff0c;前面层参数的微小更新会导致后面层输入数据的分布发生显著变化。这种现象称为内部协变…

20.缓存问题与解决方案详解教程

文章目录1. 缓存基础概念1.1 什么是缓存1.2 缓存的作用1.3 常见的缓存类型1.4 缓存架构示例2. 缓存雪崩 (Cache Avalanche)2.1 什么是缓存雪崩2.2 缓存雪崩的原因2.3 缓存雪崩的危害2.4 缓存雪崩的解决方案方案1&#xff1a;设置随机过期时间方案2&#xff1a;缓存集群和主从复…

(满满的坑LLAMA3使用申请被拒绝rejected)利用huggingface导入LLAMA3模型

文章目录前言坑后续前言 大家都知道&#xff0c;使用huggingface导入大模型是使用如下办法 from transformers import AutoModelForCausalLM, AutoTokenizermodel_name "Qwen/Qwen2.5-7B-Instruct"#要导入的大模型名称。model AutoModelForCausalLM.from_pretrai…

大规模集群下 Prometheus 监控架构实战经验分享

大规模集群下 Prometheus 监控架构实战经验分享 1 业务场景描述 在互联网金融业务发展过程中&#xff0c;我们需要对数千台主机、上万容器与微服务实例进行指标监控&#xff0c;并统计历史数据以支持 SLA 报表、告警与容量规划。传统监控系统面临以下挑战&#xff1a; 实例动态…

主流消息队列技术总结和对比

消息队列&#xff08;Message Queue&#xff0c;简称 MQ&#xff09;作为构建分布式互联网应用的关键组件&#xff0c;松耦合的架构设计能显著提升系统的可用性与可扩展性。在分布式系统中扮演着至关重要的角色&#xff0c;主要承担着实现异步消息传递、应用解耦、流量削峰以及…

数据结构 顺序表(3)---顺序表的应用

在之间的两篇文章中&#xff0c;我们着重讲了顺序表及顺序表的实现。今天这篇文章我们将简单讲解关于顺序表的三个算法题。这三个题也都属于力扣上的经典例题。1.例题1:移除元素例题来源(力扣) : https://leetcode.cn/problems/remove-element/description/这是一道数组操作算法…

逆向入门(9)汇编篇-bound指令的学习

看程序的时候碰到这么一行没见过的代码&#xff0c;简单记录一下 00427AC8 |. 6215 3C7B4200 |bound edx,qword ptr ds:[0x427B3C]这里是用到了bound指令&#xff0c;这是 x86 汇编中的指令&#xff0c;用于检查数组索引是否在有效范围内。 指令解析 bound edx, qword ptr ds…

【web应用】若依框架中,使用Echarts导出报表为PDF文件

文章目录前言一、Echarts准备工作1、查看是否安装了Echarts2、Echarts导入script 中3、使用Echarts创建图表二、报表制作打印html2canvas和jsPDF准备工作1、安装html2canvas和jsPDF依赖包2、html2canvas和jsPDF引用到script中3、制作并打印报表三、导出结果前言 若依框架前端中…

优选算法 --(双指针算法 1~8)

引言&#xff1a;此专栏为记录算法学习&#xff0c;本专题作为算法学习的第一部分&#xff0c;优选算法专题共计100题&#xff0c;分为不同小模块进行&#xff0c;算法学习需坚持积累&#xff0c;时代不会辜负长期主义者&#xff0c;仅以此句&#xff0c;与君共勉。 讲解算法分…

XRDMatch代码复现与分析报告

XRDMatch代码复现与分析报告 1. 项目概述 XRDMatch是一个用于X射线衍射(XRD)数据匹配和分析的开源工具,由zhengwan-chem开发并托管在GitHub上。本项目旨在复现XRDMatch的核心功能,并对其实现进行详细分析。 X射线衍射是材料科学中用于确定晶体结构的重要技术,通过分析衍射…

SpringAI×Ollama:Java生态无缝集成本地大模型实践指南

摘要 随着大语言模型(LLM)的普及,数据隐私和技术栈统一性成为企业级AI应用的核心挑战。本文系统阐述如何通过SpringAI框架与Ollama本地化模型引擎的结合,构建安全高效的生成式AI应用。通过实战案例解析配置优化、流式响应、工具调用等关键技术,为Java开发者提供零Python依…

从采购申请到报废核销:如何用数字化缝合企业物资管理的“断点”?

在企业的日常运营中&#xff0c;物资管理是一项至关重要的工作。从采购申请到物资的入库、使用&#xff0c;再到最终的报废核销&#xff0c;这一系列流程就像一条长长的链条&#xff0c;环环相扣。然而&#xff0c;在传统管理模式下&#xff0c;这条链条上却存在着诸多“断点”…

AVL平衡二叉树

01. 初始AVL树 AVL树是最早发明的自平衡二叉搜索树。在AVL树中&#xff0c;任何节点的两个子树的高度差&#xff08;平衡因子&#xff09;最多为1&#xff0c;这使得AVL树能够保持较好的平衡性&#xff0c;从而保证查找、插入和删除操作的时间复杂度都是O(log n)。包含n个节点…

教育行业可以采用Html5全链路对视频进行加密?有什么优势?

文章目录前言一、什么是Html5加密&#xff1f;二、使用Html5对视频加密的好处三、如何采用Html5全链路对视频进行加密&#xff1f;四、教育行业采用Html5全链路视频加密有什么优势&#xff1f;总结前言 面对优质课程盗录传播的行业痛点&#xff0c;教育机构如何守护核心知识产…

Vue3 tailwindcss

1、安装tailwindcsspnpm i -D tailwindcss postcss autoprefixer # yarn add -D tailwindcss postcss autoprefixer # npm i -D tailwindcss postcss autoprefixer2、 创建TailwindCSS配置文件npx tailwindcss init -ptailwind.config.js/** type {import(tailwindcss).Config}…

提示工程:解锁大模型潜力的核心密码

以下是对Lilian Weng的提示工程权威指南&#xff08;原文链接&#xff09;的深度解析与博客化重构&#xff0c;融入最新行业实践&#xff1a; 提示工程&#xff1a;解锁大模型潜力的核心密码 ——从基础技巧到工业级解决方案全解析 一、重新定义人机交互范式 传统编程 vs 提示…

Python3邮件发送全指南:文本、HTML与附件

在 Python3 中&#xff0c;使用内置的 smtplib 库和 email 模块发送邮件是一个常见的需求。以下是更详细的实现指南&#xff0c;包含各种场景的解决方案和技术细节&#xff1a;一、发送纯文本邮件的完整实现准备工作&#xff1a;确保已开通 SMTP 服务&#xff08;各邮箱开启方式…

CSS和CSS3区别对比

CSS&#xff08;层叠样式表&#xff09;与CSS3&#xff08;CSS的第三个版本&#xff09;的区别主要体现在功能扩展、语法特性以及应用场景等方面。以下是两者的核心对比&#xff1a; 一、核心概念与版本关系CSS&#xff1a;是基础样式表语言&#xff0c;用于分离网页内容与样式…

JVM--监控和故障处理工具

一、命令行工具 1. jps (Java Process Status) 作用&#xff1a;列出当前系统中所有的 Java 进程 常用命令&#xff1a; jps -l # 显示进程ID和主类全名 jps -v # 显示JVM启动参数 输出示例&#xff1a; 1234 com.example.MainApp 5678 org.apache.catalina.startup.Bootstra…