Rumah  >  Artikel  >  hujung hadapan web  >  Cara membina projek tindanan penuh dengan Node.js dan Vue.js

Cara membina projek tindanan penuh dengan Node.js dan Vue.js

PHPz
PHPzasal
2023-04-05 13:50:15977semak imbas

Node.js dan Vue.js ialah dua teknologi yang sangat popular pada masa ini Node.js ialah platform pembangunan sisi pelayan yang dijalankan pada JavaScript, manakala Vue.js ialah rangka kerja progresif untuk membina antara muka pengguna. Gabungan kedua-dua teknologi ini boleh meningkatkan kecekapan pembangunan dan pengalaman pengguna aplikasi web. Dalam artikel ini, kami akan menggunakan projek praktikal untuk menunjukkan cara menggunakan Node.js dan Vue.js untuk membina aplikasi web tindanan penuh.

1. Pengenalan Projek

Kami akan membangunkan sistem penerbitan dan pengurusan artikel yang mudah Pengguna boleh mendaftar dan log masuk untuk menerbitkan artikel, mengulas dan melihat artikel yang diterbitkan oleh pengguna lain. Untuk mencapai fungsi ini, kami akan menggunakan Node.js sebagai bahasa pembangunan bahagian belakang dan rangka kerja teknologi, Vue.js sebagai rangka kerja pembangunan bahagian hadapan, dan MongoDB sebagai pangkalan data.

2. Persediaan persekitaran

Sebelum memulakan pembangunan, anda perlu menyediakan persekitaran pembangunan Node.js, Vue.js dan MongoDB dalam persekitaran setempat.

1. Pasang Node.js: Anda boleh memuat turun pakej pemasangan Node.js daripada tapak web rasmi untuk pemasangan.

2. Pasang Vue.js: Anda boleh menggunakan alat baris arahan npm untuk memasang Vue.js. Masukkan arahan berikut pada baris arahan:

npm install -g vue-cli

3. Pasang MongoDB: Anda boleh memuat turun pakej pemasangan MongoDB dari tapak web rasmi dan memasangnya.

3. Struktur projek

Kami membahagikan projek kepada dua bahagian: bahagian hadapan dan bahagian belakang, jadi kami perlu mencipta dua folder untuk menyimpan kod kedua-dua bahagian ini Buat folder bernama "node-vue-app" dalam direktori akar untuk menyimpan keseluruhan projek.

1. Buat bahagian belakang

Buat folder bernama "pelayan" di bawah folder "node-vue-app", dan buat folder bernama fail "app.js", yang akan berfungsi sebagai fail kemasukan perkhidmatan bahagian belakang kami. Pada masa yang sama, kita perlu mencipta folder bernama "laluan" di bawah folder "pelayan" untuk menyimpan kod penghalaan dan mencipta folder bernama "model" di bawah folder "pelayan" untuk menyimpan kod model Data .

2. Cipta bahagian hadapan

Buat folder bernama "klien" di bawah folder "node-vue-app", di mana kami akan melaksanakan pembangunan bahagian hadapan. Anda boleh mencipta projek Vue.js menggunakan alat baris arahan yang disediakan oleh Vue.js:

vue init webpack client

Arahan ini akan mencipta folder bernama "src" di bawah folder "klien" Akan mengandungi semua bahagian hadapan kami -kod tamat.

4. Pembangunan bahagian belakang

Dalam kes ini, kami akan menggunakan Express sebagai rangka kerja bahagian belakang untuk melengkapkan pembangunan API RESTful. Dalam fail "app.js", kami perlu memperkenalkan modul dan perpustakaan yang berkaitan dan memulakan aplikasi Express:

const express = require('express');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');

const app = express();
app.use(bodyParser.json());

mongoose.connect('mongodb://localhost:27017/node-vue-app', { useNewUrlParser: true });
mongoose.connection.once('open', () => {
    console.log('connected to database');
});

app.listen(3000, () => console.log('server is running on port 3000'));

1 Tentukan model data

Kami perlu menentukan data model dalam fail "models" Tentukan model data kami di bawah folder dan buat fail bernama "article.js":

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const articleSchema = new Schema({
    title: String,
    author: String,
    content: String,
    created_at: Date,
    updated_at: Date
});

module.exports = mongoose.model('Article', articleSchema);

Dalam fail ini, kami mentakrifkan model data bernama "Article" dan mentakrifkan struktur data yang sepadan.

2. Tentukan laluan

Buat fail bernama "articles.js" di bawah folder "routes" Kami akan mentakrifkan logik pemprosesan penghalaan yang berkaitan dengan artikel dalam fail ini:

const express = require('express');
const router = express.Router();
const Article = require('../models/article');

// 获取文章列表
router.get('/', (req, res) => {
    Article.find((err, articles) => {
        if (err) {
            console.log(err);
        } else {
            res.json({ articles });
        }
    });
});

// 获取单篇文章
router.get('/:id', (req, res) => {
    Article.findById(req.params.id, (err, article) => {
        if (err) {
            console.log(err);
        } else {
            res.json({ article });
        }
    });
});

// 新增文章
router.post('/', (req, res) => {
    const article = new Article(req.body);
    article.save()
        .then(() => res.json({ success: true }))
        .catch(err => console.log(err));
});

// 更新文章
router.put('/:id', (req, res) => {
    Article.findByIdAndUpdate(req.params.id, req.body, { new: true }, (err, article) => {
        if (err) {
            console.log(err);
        } else {
            res.json({ article });
        }
    });
});

// 删除文章
router.delete('/:id', (req, res) => {
    Article.findByIdAndRemove(req.params.id, (err, article) => {
        if (err) {
            console.log(err);
        } else {
            res.json({ article });
        }
    });
});

module.exports = router;

Dalam fail ini, kami mentakrifkan semua logik pemprosesan penghalaan yang berkaitan dengan artikel, termasuk mendapatkan senarai artikel, mendapatkan satu artikel, menambah artikel baharu, mengemas kini artikel dan memadamkan artikel.

5. Pembangunan bahagian hadapan

Dalam kes ini, kami akan menggunakan komponen Vue.js untuk melengkapkan pembangunan bahagian hadapan. Cipta folder bernama "komponen" di bawah folder "klien/src" untuk menyimpan komponen Vue.js Kami akan mencipta komponen bernama "Artikel" di bawah folder ini, yang akan melaksanakan paparan senarai, penambahan, pengeditan dan pemadaman:

<template>
    <div class="articles">
        <table>
            <thead>
                <tr>
                    <th>ID</th>
                    <th>Title</th>
                    <th>Author</th>
                    <th>Created At</th>
                    <th>Updated At</th>
                    <th>Actions</th>
                </tr>
            </thead>
            <tbody>
                <tr v-for="article in articles" :key="article._id">
                    <td>{{ article._id }}</td>
                    <td>{{ article.title }}</td>
                    <td>{{ article.author }}</td>
                    <td>{{ article.created_at }}</td>
                    <td>{{ article.updated_at }}</td>
                    <td>
                        <button @click="edit(article._id)">Edit</button>
                        <button @click="del(article._id)">Delete</button>
                    </td>
                </tr>
            </tbody>
        </table>
        <div class="form">
            <form @submit.prevent="submit">
                <input type="text" v-model="article.title" placeholder="Title">
                <input type="text" v-model="article.author" placeholder="Author">
                <textarea v-model="article.content" placeholder="Content"></textarea>
                <button type="submit">{{ isNew ? 'Create' : 'Update' }}</button>
            </form>
        </div>
    </div>
</template>

<script>
    export default {
        data() {
            return {
                articles: [],
                article: {
                    title: '',
                    author: '',
                    content: ''
                },
                isNew: true
            }
        },
        created() {
            this.getArticles();
        },
        methods: {
            getArticles() {
                fetch('/api/articles')
                    .then(res => res.json())
                    .then(data => this.articles = data.articles)
                    .catch(err => console.log(err));
            },
            createArticle() {
                fetch('/api/articles', {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json'
                    },
                    body: JSON.stringify(this.article)
                })
                    .then(res => res.json())
                    .then(data => {
                        if (data.success) {
                            this.article = { title: '', author: '', content: '' };
                            this.getArticles();
                        }
                    })
                    .catch(err => console.log(err));
            },
            updateArticle(id) {
                fetch(`/api/articles/${id}`, {
                    method: 'PUT',
                    headers: {
                        'Content-Type': 'application/json'
                    },
                    body: JSON.stringify(this.article)
                })
                    .then(res => res.json())
                    .then(data => {
                        if (data.article) {
                            this.article = { title: '', author: '', content: '' };
                            this.isNew = true;
                            this.getArticles();
                        }
                    })
                    .catch(err => console.log(err));
            },
            deleteArticle(id) {
                fetch(`/api/articles/${id}`, {
                    method: 'DELETE'
                })
                    .then(res => res.json())
                    .then(data => {
                        if (data.article) {
                            this.getArticles();
                        }
                    })
                    .catch(err => console.log(err));
            },
            submit() {
                if (this.isNew) {
                    this.createArticle();
                } else {
                    this.updateArticle(this.article._id);
                }
            },
            edit(id) {
                const article = this.articles.find(a => a._id === id);
                this.article = { ...article };
                this.isNew = false;
            },
            del(id) {
                const article = this.articles.find(a => a._id === id);
                if (window.confirm(`Are you sure to delete article: ${article.title}?`)) {
                    this.deleteArticle(id);
                }
            }
        }
    }
</script>

<style scoped>
    table {
        border-collapse: collapse;
        width: 100%;
    }
    td, th {
        border: 1px solid #ddd;
        padding: 8px;
        text-align: left;
    }
    tr:nth-child(even) {
        background-color: #f2f2f2;
    }
    form {
        display: flex;
        flex-direction: column;
    }
    textarea {
        height: 100px;
    }
    button {
        margin-top: 10px;
        padding: 8px 16px;
        background-color: #1E6FAF;
        color: #fff;
        border: none;
        border-radius: 4px;
        cursor: pointer;
    }
    button:hover {
        background-color: #15446F;
    }
</style>

Dalam komponen ini, kami mentakrifkan komponen Vue.js bernama "Artikel" dan melaksanakan fungsi paparan, penambahan senarai artikel , penyuntingan dan pemadaman Komponen ini memanggil API bahagian belakang untuk mendapatkan, mencipta , kemas kini dan padam artikel melalui fungsi fetch().

6. Mulakan aplikasi

Selepas melengkapkan pembangunan bahagian belakang dan bahagian hadapan, kami perlu memulakan aplikasi untuk mengesahkan sama ada kod kami berfungsi dengan betul. Masukkan direktori akar projek dalam baris arahan dan laksanakan arahan berikut dalam folder "pelayan" dan "klien" masing-masing:

npm install
npm start

Arahan ini akan memulakan perkhidmatan bahagian belakang dan bahagian hadapan masing-masing, dan paparkannya dalam penyemak imbas Buka aplikasi bahagian hadapan dalam . Masukkan "http://localhost:8080" dalam pelayar anda untuk mengakses sistem penerbitan dan pengurusan artikel kami.

7. Ringkasan

Gabungan Node.js dan Vue.js boleh membantu kami membina aplikasi web tindanan penuh dan mencapai pembangunan yang cekap serta pengalaman pengguna yang baik. Dalam artikel ini, kami menunjukkan cara menggunakan Node.js dan Vue.js untuk membina aplikasi web tindanan penuh melalui projek praktikal. Saya percaya artikel ini boleh membantu pembangun lebih memahami aplikasi Node.js dan Vue.js.

Atas ialah kandungan terperinci Cara membina projek tindanan penuh dengan Node.js dan Vue.js. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn