首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【项目日志|苍穹外卖】 Day1:项目环境搭建与架构设计

【项目日志|苍穹外卖】 Day1:项目环境搭建与架构设计

作者头像
超级苦力怕
发布2025-12-23 17:54:44
发布2025-12-23 17:54:44
6070
举报

本文记录了苍穹外卖项目第一天的学习内容,包括项目结构设计,Nginx反向代理配置与JWT令牌等核心知识点。

请添加图片描述
请添加图片描述


完成任务清单

  • 了解软件开发流程
  • 熟悉项目结构设计
  • 掌握Git版本控制
  • 学习Swagger接口文档
  • 完善登录功能

主要功能展示

1.项目结构划分

苍穹外卖项目采用三层架构设计,主要分为三个核心模块:

在这里插入图片描述
在这里插入图片描述

sky-common - 公共模块 主要存放公共类,供其他模块使用

包名

说明

职责

constant

存放相关常量类

定义系统常量

context

存放上下文类

管理请求上下文

enumeration

项目的枚举类存储

定义业务枚举

exception

存放自定义异常类

统一异常处理

json

处理json转换的类

数据序列化

properties

存放SpringBoot相关的配置属性类

配置管理

result

返回结果类的封装

统一响应格式

utils

常用工具类

工具方法集合

在这里插入图片描述
在这里插入图片描述

sky-pojo - 数据对象模块 主要存放entity、DTO、VO等数据对象

包名

说明

用途

Entity

实体类

通常和数据库中的表对应

DTO

数据传输对象

通常用于程序中各层之间传递数据

VO

视图对象

为前端展示数据提供的对象

POJO

普通Java对象

只有属性和对应的getter和setter

在这里插入图片描述
在这里插入图片描述

sky-server - 服务模块 主要存放配置文件、配置类、拦截器、controller、service、mapper、启动类等

包名

说明

职责

config

存放配置类

系统配置管理

controller

存放controller类

接口层,处理HTTP请求

interceptor

存放拦截器类

请求拦截处理

mapper

存放mapper接口

数据访问层

service

存放service类

业务逻辑层

SkyApplication

启动类

应用程序入口

在这里插入图片描述
在这里插入图片描述
2. 完善登录功能

在当前项目中,我们主要使用的是MD5作为加密手段

MD5(Message Digest Algorithm 5)中文名为消息摘要算法第五版,是计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护

实现思路

使用MD5加密方式对明文密码加密

实现逻辑

代码语言:javascript
复制
/**
     * 员工登录
     *
     * @param employeeLoginDTO
     * @return
     */
    public Employee login(EmployeeLoginDTO employeeLoginDTO) {

        //1、根据用户名查询数据库中的数据
       
        //2、处理各种异常情况(用户名不存在、密码不对、账号被锁定)
        //.......
        //密码比对
        // TODO 后期需要进行md5加密,然后再进行比对
        password = DigestUtils.md5DigestAsHex(password.getBytes());
        if (!password.equals(employee.getPassword())) {
            //密码错误
            throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);
        }

        //........

        //3、返回实体对象
        return employee;
    }

拓充知识点

1.正向代理与反向代理

代理技术概述

代理技术是网络架构中的重要组成部分,根据代理对象的不同,分为正向代理反向代理两种模式。正向代理是隐藏客户端,反向代理是隐藏服务器.

正向代理 vs 反向代理对比

特性

正向代理 (Forward Proxy)

反向代理 (Reverse Proxy)

代理对象

🖥️ 代理客户端

🖥️ 代理服务器

隐藏信息

隐藏客户端身份

隐藏服务器信息

使用场景

科学上网、访问限制突破

负载均衡、安全防护

配置位置

客户端配置

服务器端配置

工作流程对比

正向代理流程:

代码语言:javascript
复制
🌐 客户端 → 🔄 代理服务器 → 🎯 目标服务器
     ↓           ↓              ↓
   隐藏身份    转发请求       接收请求

反向代理流程:

代码语言:javascript
复制
🌐 客户端 → 🔄 代理服务器 → 🎯 后端服务器集群
     ↓           ↓              ↓
   发起请求    负载分发       提供服务

正向代理与反向代理区别

1. 代理方向不同

  • 正向代理:客户端主动配置,代理服务器代表客户端访问目标服务器
  • 反向代理:服务器端配置,代理服务器代表后端服务器接收客户端请求

2. 应用场景不同

  • 正向代理:突破网络限制、保护客户端隐私、访问控制
  • 反向代理:负载均衡、高可用性、安全防护、缓存加速

3. 配置方式不同

  • 正向代理:需要在客户端配置代理服务器地址
  • 反向代理:在服务器端配置,客户端无感知

Nginx反向代理配置

基础反向代理配置:

代码语言:javascript
复制
server {
    listen 80;
    server_name localhost;
    
    location /api/ {
        proxy_pass http://localhost:8080/admin/;  # 反向代理
    }
}

配置说明:

  • 监听80端口
  • 当访问 http://localhost:80/api/...
  • 通过 location /api/ 反向代理到 http://localhost:8080/admin/
2. 负载均衡配置

负载均衡定义: 负载均衡(Load Balancing)是一种将大量的请求或数据流量分配到多台服务器上的技术,目的是避免单台服务器过载,提高系统的整体性能、可靠性和可扩展性。

Nginx负载均衡配置:

代码语言:javascript
复制
# 定义上游服务器组
upstream webservers {
    server 192.168.100.128:8080;
    server 192.168.100.129:8080;
}

server {
    listen 80;
    server_name localhost;
    
    location /api/ {
        proxy_pass http://webservers/admin;  # 负载均衡
    }
}

nginx 负载均衡策略:

名称

说明

轮询

默认方式

weight

权重方式,默认为1,权重越高,被分配的客户端请求就越多

ip_hash

依据ip分配方式,这样每个访客可以固定访问一个后端服务

least_conn

依据最少连接方式,把请求优先分配给连接数少的后端服务

url_hash

依据url分配方式,这样相同的url会被分配到同一个后端服务

fair

依据响应时间方式,响应时间短的服务将会被优先分配

3. JWT(JSON Web Token)

JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在各方之间安全地传输信息作为JSON对象。

JWT由HeaderPayloadSignature三部分组成: Header(头部):包含令牌类型和签名算法 Payload(载荷):包含声明(claims) Signature(签名):用于验证令牌的完整性

项目中的JWT架构

代码语言:javascript
复制
public class JwtUtil {
    /**
     * 生成JWT令牌
     */
    public static String createJWT(String secretKey, long ttlMillis, Map<String, Object> claims) {
        // 使用HS256算法
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        
        // 计算过期时间
        long expMillis = System.currentTimeMillis() + ttlMillis;
        Date exp = new Date(expMillis);
        
        // 构建JWT
        JwtBuilder builder = Jwts.builder()
                .setClaims(claims)  // 设置自定义声明
                .signWith(signatureAlgorithm, secretKey.getBytes(StandardCharsets.UTF_8))  // 签名
                .setExpiration(exp);  // 设置过期时间
        
        return builder.compact();
    }
    
    /**
     * 解析JWT令牌
     */
    public static Claims parseJWT(String secretKey, String token) {
        Claims claims = Jwts.parser()
                .setSigningKey(secretKey.getBytes(StandardCharsets.UTF_8))
                .parseClaimsJws(token).getBody();
        return claims;
    }
}

本文为苍穹外卖学习笔记,持续更新中…

如果我的内容对你有帮助,希望可以收获你的点赞、评论、收藏。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-08-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 完成任务清单
  • 主要功能展示
    • 1.项目结构划分
    • 2. 完善登录功能
  • 拓充知识点
    • 1.正向代理与反向代理
    • 2. 负载均衡配置
    • 3. JWT(JSON Web Token)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档