自建Web网站部署——案例分析

news/2024/8/26 16:38:10 标签: 前端

在这里插入图片描述

作者主页:

知孤云出岫在这里插入图片描述

目录

    • ==作者主页==:
    • 如何自建一个Web网站
      • 一、引言
      • 二、需求分析
      • 三、技术选型
      • 四、开发步骤
        • 1. 项目初始化
          • 初始化前端
          • 初始化后端
        • 2. 前端开发
          • 目录结构
          • 示例代码
            • App.js
            • Home.js
        • 3. 后端开发
          • 目录结构
          • 示例代码
            • app.js
            • productRoutes.js
            • Product.js
        • 4. 前后端连接
          • 安装axios
          • 在`Products.js`中获取产品数据
      • 五、部署
        • 1. Docker化
          • Dockerfile(前端
          • Dockerfile(后端)
          • docker-compose.yml
        • 2. 使用Nginx反向代理
          • nginx.conf
      • 六、总结

如何自建一个Web网站

在这里插入图片描述

一、引言

自建一个Web网站不仅可以展示个人或企业的内容,还可以提升技术能力和项目管理经验。本文将通过一个具体案例,从需求分析、技术选型、开发步骤到部署和维护,详细介绍如何自建一个Web网站。

二、需求分析

假设我们需要为一个小型企业创建一个展示其产品和服务的官方网站。需求包括:

  1. 首页:展示公司简介、主要产品和服务。
  2. 产品页:详细展示各个产品的图片和描述。
  3. 服务页:介绍公司提供的各类服务。
  4. 联系我们页:提供联系表单和公司地址。
  5. 后台管理系统:用于管理产品、服务和用户反馈。

三、技术选型

根据需求选择合适的技术栈:

  • 前端:HTML、CSS、JavaScript、React(用于构建用户界面)
  • 后端:Node.js、Express(用于处理服务器端逻辑)
  • 数据库:MongoDB(用于存储数据)
  • 部署:Docker、Nginx(用于容器化和部署)

四、开发步骤

1. 项目初始化

首先,创建一个新的项目文件夹,并初始化前后端项目。

mkdir my_website
cd my_website
初始化前端
npx create-react-app frontend
初始化后端
mkdir backend
cd backend
npm init -y
npm install express mongoose body-parser cors
2. 前端开发
目录结构
frontend
│   ├── public
│   ├── src
│   │   ├── components
│   │   ├── pages
│   │   ├── App.js
│   │   ├── index.js
│   └── package.json
示例代码
App.js
import React from 'react';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
import Home from './pages/Home';
import Products from './pages/Products';
import Services from './pages/Services';
import Contact from './pages/Contact';

function App() {
  return (
    <Router>
      <Switch>
        <Route path="/" exact component={Home} />
        <Route path="/products" component={Products} />
        <Route path="/services" component={Services} />
        <Route path="/contact" component={Contact} />
      </Switch>
    </Router>
  );
}

export default App;
Home.js
import React from 'react';

function Home() {
  return (
    <div>
      <h1>Welcome to Our Company</h1>
      <p>We offer the best products and services.</p>
    </div>
  );
}

export default Home;
3. 后端开发
目录结构
backend
│   ├── models
│   ├── routes
│   ├── app.js
│   └── package.json
示例代码
app.js
const express = require('express');
const mongoose = require('mongoose');
const bodyParser = require('body-parser');
const cors = require('cors');
const productRoutes = require('./routes/productRoutes');

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

mongoose.connect('mongodb://localhost:27017/my_website', {
  useNewUrlParser: true,
  useUnifiedTopology: true,
});

app.use('/api/products', productRoutes);

app.listen(5000, () => {
  console.log('Server is running on port 5000');
});
productRoutes.js
const express = require('express');
const router = express.Router();
const Product = require('../models/Product');

router.get('/', async (req, res) => {
  const products = await Product.find();
  res.json(products);
});

router.post('/', async (req, res) => {
  const newProduct = new Product(req.body);
  await newProduct.save();
  res.json(newProduct);
});

module.exports = router;
Product.js
const mongoose = require('mongoose');

const productSchema = new mongoose.Schema({
  name: String,
  description: String,
  price: Number,
  imageUrl: String,
});

const Product = mongoose.model('Product', productSchema);

module.exports = Product;
4. 前后端连接

前端,使用axios库与后端进行通信。

安装axios
npm install axios
Products.js中获取产品数据
import React, { useState, useEffect } from 'react';
import axios from 'axios';

function Products() {
  const [products, setProducts] = useState([]);

  useEffect(() => {
    axios.get('http://localhost:5000/api/products')
      .then(response => {
        setProducts(response.data);
      })
      .catch(error => {
        console.error('There was an error fetching the products!', error);
      });
  }, []);

  return (
    <div>
      <h1>Our Products</h1>
      <ul>
        {products.map(product => (
          <li key={product._id}>
            <h2>{product.name}</h2>
            <p>{product.description}</p>
            <p>${product.price}</p>
          </li>
        ))}
      </ul>
    </div>
  );
}

export default Products;

五、部署

1. Docker化

创建Dockerfile和docker-compose.yml文件,以便容器化应用。

Dockerfile(前端
# Base image
FROM node:14

# Set working directory
WORKDIR /app

# Install dependencies
COPY package*.json ./
RUN npm install

# Copy source code
COPY . .

# Build the application
RUN npm run build

# Expose the port
EXPOSE 3000

# Start the application
CMD ["npm", "start"]
Dockerfile(后端)
# Base image
FROM node:14

# Set working directory
WORKDIR /app

# Install dependencies
COPY package*.json ./
RUN npm install

# Copy source code
COPY . .

# Expose the port
EXPOSE 5000

# Start the application
CMD ["node", "app.js"]
docker-compose.yml
version: '3'
services:
  frontend:
    build: ./frontend
    ports:
      - '3000:3000'
    depends_on:
      - backend
  backend:
    build: ./backend
    ports:
      - '5000:5000'
    environment:
      - MONGO_URL=mongodb://mongo:27017/my_website
  mongo:
    image: mongo
    ports:
      - '27017:27017'
2. 使用Nginx反向代理
nginx.conf
server {
    listen 80;

    location / {
        proxy_pass http://frontend:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /api/ {
        proxy_pass http://backend:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

六、总结

自建一个Web网站需要综合考虑前后端技术选型、开发、部署及维护。通过本案例,我们实现了一个简单但功能齐全的网站,包括首页、产品页、服务页、联系我们页及后台管理系统。通过Docker和Nginx,我们确保了应用的可移植性和高可用性。在实际应用中,可能需要根据具体需求进行更多的定制和优化。


http://www.niftyadmin.cn/n/5558375.html

相关文章

RK3568 V1.4.0 SDK,USB OTG端子不能被电脑识别出adb设备,解决

修改后的/usr/bin/usbdevice: #!/bin/sh # # Usage: # usbdevice [start|update|stop] # # Hookable stages: # usb_<pre|post>_<init|prepare|start|stop|restart>_hook # <usb function>_<pre|post>_<prepare|start|stop>_hook # # Example …

Hadoop中HDFS、Hive 和 HBase三者之间的关系

HDFS&#xff08;Hadoop Distributed File System&#xff09;、Hive 和 HBase 是 Hadoop 生态系统中三个重要的组件&#xff0c;它们各自解决了大数据存储和处理的不同层面的问题。我们用大白话来解释这三个组件之间的关系&#xff1a; HDFS - 数据的仓库&#xff1a; HDFS 是…

【入门篇】2.3 STM32启动模式(一)

一,Boot引脚分步 二,启动电路 三,启动模式 STM32F4 根据 BOOT 引脚的电平选择启动模式,这两个 BOOT 引脚根据外部施加的电平来决定芯片的启动地址。 下表中 BOOT0 和 BOOT1 是 STM32 芯片上面的两个引脚,用于控制 STM32

常见的五种聚类算法总结

常见的聚类算法总结 1. K-Means 聚类 描述 K-Means 是一种迭代优化的聚类算法&#xff0c;它通过最小化样本点到质心的距离平方和来进行聚类。 思想 随机选择 K 个初始质心。分配每个数据点到最近的质心&#xff0c;形成 K 个簇。重新计算每个簇的质心。重复上述步骤&…

基于LSTM及其变体的回归预测

1 所用模型 代码中用到了以下模型&#xff1a; 1. LSTM&#xff08;Long Short-Term Memory&#xff09;&#xff1a;长短时记忆网络&#xff0c;是一种特殊的RNN&#xff08;循环神经网络&#xff09;&#xff0c;能够解决传统RNN在处理长序列时出现的梯度消失或爆炸的问题。L…

【iOS】OC类与对象的本质分析

目录 前言clang常用命令对象本质探索属性的本质对象的内存大小isa 指针探究 前言 OC 代码的底层实现都是 C/C代码&#xff0c;OC 的对象都是基于 C/C 的数据结构实现的&#xff0c;实际 OC 对象的本质就是结构体&#xff0c;那到底是一个怎样的结构体呢&#xff1f; clang常用…

提高Java程序效率:ImmutableList、Stream API 和 JSON序列化实战指南

常用列表构建方法&#xff1a; 1.ImmutableList.of() &#xff1a; 静态方法、不可变的列表 可以接受任意数量的参数&#xff0c;并将它们作为元素添加到新创建的列表中&#xff0c;但是一旦创建&#xff0c;集合的内容就不能被改变。在多线程环境中非常有用&#xff0c;因为…

linux后门教程

linux后门教程 alias 用法 系统默认别名&#xff1a;alias 设置别名&#xff1a;alias lsls -laih 删除别名&#xff1a;unalias ls **加参数&#xff1a;**alias ls‘ls -laih;pwd’ 注意 系统启动默认加载的配置文件 /etc/profile 切换用户就会执行/etc/profile /etc/bash…