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
英文地址,請注明出處:http://en.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…