提供一个全栈实现的方案,包罗 Vue 3 前端、Express 后端和 MySQL 数据库的分类模糊搜索功能。让我们徐徐来看:
1. 数据库设计 (MySQL)
起首,我们必要一个存储分类的表:
- CREATE TABLE categories (
- id INT AUTO_INCREMENT PRIMARY KEY,
- name VARCHAR(255) NOT NULL,
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
- );
- -- 插入一些示例数据
- INSERT INTO categories (name) VALUES
- ('Electronics'), ('Books'), ('Clothing'), ('Home & Garden'), ('Sports');
复制代码 2. 后端实现 (Express)
安装必要的包
- npm install express mysql2
复制代码 创建数据库毗连
- // db.js
- const mysql = require('mysql2/promise');
- const pool = mysql.createPool({
- host: 'localhost',
- user: 'your_username',
- password: 'your_password',
- database: 'your_database',
- waitForConnections: true,
- connectionLimit: 10,
- queueLimit: 0
- });
- module.exports = pool;
复制代码 实现 Express 路由
- // app.js
- const express = require('express');
- const db = require('./db');
- const app = express();
- app.use(express.json());
- app.get('/api/categories/search', async (req, res) => {
- try {
- const { query } = req.query;
- const [rows] = await db.query(
- 'SELECT * FROM categories WHERE name LIKE ?',
- [`%${query}%`]
- );
- res.json(rows);
- } catch (error) {
- console.error(error);
- res.status(500).json({ error: 'Internal server error' });
- }
- });
- const PORT = process.env.PORT || 3000;
- app.listen(PORT, () => console.log(`Server running on port ${PORT}`));
复制代码 3. 前端实现 (Vue 3)
创建一个新的 Vue 3 组件
- <!-- CategorySearch.vue -->
- <template>
- <div>
- <input
- v-model="searchQuery"
- @input="searchCategories"
- placeholder="Search categories..."
- />
- <ul>
- <li v-for="category in categories" :key="category.id">
- {{ category.name }}
- </li>
- </ul>
- </div>
- </template>
- <script>
- import { ref } from 'vue';
- import axios from 'axios';
- export default {
- setup() {
- const searchQuery = ref('');
- const categories = ref([]);
- const searchCategories = async () => {
- if (searchQuery.value.length > 0) {
- try {
- const response = await axios.get(`/api/categories/search?query=${searchQuery.value}`);
- categories.value = response.data;
- } catch (error) {
- console.error('Error fetching categories:', error);
- }
- } else {
- categories.value = [];
- }
- };
- return {
- searchQuery,
- categories,
- searchCategories
- };
- }
- };
- </script>
复制代码 在主应用中利用组件
- <!-- App.vue -->
- <template>
- <div id="app">
- <h1>Category Search</h1>
- <CategorySearch />
- </div>
- </template>
- <script>
- import CategorySearch from './components/CategorySearch.vue';
- export default {
- name: 'App',
- components: {
- CategorySearch
- }
- };
- </script>
复制代码 4. 优化建议
- 防抖:在前端实现防抖,避免频仍的 API 调用。
- 缓存:考虑在后端实现缓存机制,减少数据库查询。
- 分页:假如分类数量很大,考虑实现分页功能。
- 索引:在 MySQL 的 categories 表的 name 列上添加索引,进步查询性能。
- CREATE INDEX idx_category_name ON categories(name);
复制代码
- 安全性:确保对用户输入进行适当的验证和清理,防止 SQL 注入攻击。
这个实现提供了一个基本的全栈分类模糊搜索功能。您可以根据详细需求进行进一步的定制和优化。假如您有任何问题或必要更详细的解释,请随时告诉我。
注意,MySQL 的 LIKE 操纵符默认是不区分巨细写的。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |