电商实战项目(java)知识点整理(持续更新)《苍穹外卖》

news2024/11/26 22:43:26

一、重要知识点精讲

1.1 nginx反向代理

1. nginx反向代理好处:

1. 提高访问速度(可以进行缓存,如果访问相同资源可以直接响应数据)

2. 可以进行负载均衡(如果没有nginx前端只能固定地访问后端某一台服务器,加入nginx则可以将请求分发给后端不同的服务器)

3. 保证后端服务安全(前端不能直接请求到后端服务器,需要通过Nginx转发)

2. nginx反向代理的搭建:

location /api/ 的意思是如果请求能匹配上/api/这个字符串。

proxy_pass 该指令的作用是设定转发的目的地,其后跟的是转发的目的地址。

3. nginx负载均衡的配置:

在webservers里面定义一组服务器,用于承接访问负载:

4. nginx负载均衡的策略:

服务器不一定需要平均承接请求,可以通过更改参数赋以不同的权重:

1. 按F12可以打开浏览器的调试工具  

2. 负载均衡:把大量的请求按照我们指定的指定的方式均衡的分配给集群中的每台服务器。

3. 备注写上TODO可以在IDEA下方的TODO列表看到待做的操作

二、项目开发介绍

2.1软件开发整体介绍

软件开发流程

1. 需求分析:需求规格说明书(word文档)、产品原型(静态网页展示功能图片)。

2. 设计:UI设计(用户界面,小到按钮,大到页面布局,人机交互)、数据库设计(表结构、字段、类型等)、接口设计。

3. 编码:项目代码、单元测试。

4. 测试:测试用例、测试报告。

5. 上线运维:软件环境安装、配置。

角色分工

软件环境

2.2 苍穹外卖项目介绍

项目介绍

为餐饮企业(餐厅、饭店)定制的一款软件产品。

功能架构:体现项目中的业务功能模块。

产品原型

产品原型:用于展示项目的业务功能(一般用静态的HTML页面+适当的说明文字进行展示),一般由产品经理进行设计。

技术选型

技术选型:展示项目中使用到的技术框架和中间件等。

三、环境搭建

3.1 开发环境搭建

前端环境搭建

先确保将nginx.exe放在无中文的目录下:

将监听的端口号更改为81,因为80端口时常被占用,如果用80端口可能会因为端口占用而无法打开!!

注意:这里配置的是nginx的监听端口,nginx在81号端口上监听网页端,最后是将数据传入8080端口的服务器端。

后端环境搭建

1. 熟悉项目框架

common存放的是公共类。constant常量类。context项目上下文。enumeration枚举类。exception异常类。json处理json转换的类。properties是Springboot中的一些配置属性类,会把配置文件中的配置项封装成对象。result后端的返回结果。utils工具类。

  

pojo存放的是一些entity、DTO、VO

server子模块存放的是配置文件、配置类、拦截器、controller、service、mapper、启动类等。

2. 使用Git进行版本控制

.gitignore中都是要忽略的文件:

VCS-Create Git Repository创建远程仓库,选中根目录即可,若右上角出现标志说明成功:

 

勾选所有文件,编写记录文字,点击Commit:

在gitee上创建远程仓库:

点击赋值按钮,在IDEA中点击向上的按钮:

点击下面的链接,然后将刚刚复制的粘贴进来点击OK:

然后直接点击Push即可,然后刷新一下gitee页面,会发现同步成功:

3. 搭建数据库

一共11张表如下:

将已经提供的建表语句粘贴到查询处,点击运行,左边建立成功11张表:

4. 前后端联调

要先将连接数据库的密码改为自己的密码:

在右端Maven处选中compile进行编译,若显示BUILD SUCCESS则说明编译通过:

 

在sky-server目录下的SkyApplication类中启动项目:

调试方法

打上断点,点击小虫:

光标放在字段上还会显示接收到的数据:

若想程序在所希望的地方停止,可以添加断点,然后点击左下角的按钮,意思是放行:

执行之后会在其中标明注入的数据:

按f12进入到开发者工具,点击登录,可以看到请求的路径:

但出现问题,前端请求的地址和后端接口的地址不一致是如何请求成功的呢?

nginx反向代理

但为什么需要NGINX进行转发呢?有什么好处呢?详细见1.1

3.2 完善登录功能

思路:将密码加密后进行存储,提高安全性。加密方式采用MD5。存储入数据库的数据将会是加密后的数据。并且加密的过程是不可逆的,无法通过加密结果算出明文。

e10adc3949ba59abbe56e057f20f883e记得要Ctrl+S保存更改结果:

只需调用Spring提供的DigestUtils类中的md5DigestAsHex方法传入密码即可将密码变成密文,提供给后面比对。

password = DigestUtils.md5DigestAsHex(password.getBytes());

四、接口文档和Swagger

4.1 导入接口文档

在开发之前需要先将接口定义好,然后前后端人员并行开发。

前后端分离开发流程

操作步骤

4.2 Swagger

Swagger介绍

使用Swagger只需要按照规范去定义接口及接口相关的信息,就可以做到生成接口文档,以及在线接口调试页面。Swagger可以帮助后端生成接口文档、进行在线接口测试。

Knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案。

Swagger使用方式

导入下面坐标:

<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-spring-starter</artifactId>
    <version>3.0.2</version>
</dependency>

相关配置:

@Bean
    public Docket docket() {
        ApiInfo apiInfo = new ApiInfoBuilder()
                .title("苍穹外卖项目接口文档")
                .version("2.0")
                .description("苍穹外卖项目接口文档")
                .build();
        Docket docket = new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.sky.controller"))
                .paths(PathSelectors.any())
                .build();
        return docket;
    }

设置静态资源映射:

protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
}

 

Swagger常用注解

@Api注解使用样例:

@ApiModel注解使用样例:

@ApiModelProperty注解使用样例:

@ApiOperation注解使用样例:

注解影响如下图:

五、员工功能模块制作

5.1 新增员工

1.需求分析和设计

一般是对产品原型(静态HTML页面)分析,因为比较直观。思考录入项有没有什么限制。

密码采用默认密码,登录后可以进行修改。

接口定义如下:

数据库设计如下:

2.代码开发

当前端提交的数据和实体类中对应的属性差别较大是,建议使用DTO来封装。

1. 首先在EmployeeController中编写如下代码,EmployeeDTO是网页端读入的字段数据,在这里传入employeeService中:

@PostMapping//post方式请求
    @ApiOperation("新增员工")
    //请求路径在类的头部已加过
    public Result save(@RequestBody EmployeeDTO employeeDTO){ //声明参数接收前端数据,json数据要在前面加@RequestBody
        log.info("新增员工:{}",employeeDTO);//方便调试
        employeeService.save(employeeDTO);
        return Result.success();//表示插入成功
    }

2. 然后再EmployeeService中编写如下代码:

//新增员工
    void save(EmployeeDTO employeeDTO);

3. 再在EmployeeServiceImpl中完成save()方法的编写,主要是添加除了employeeDTO以外字段的内容: 

@Override
    public void save(EmployeeDTO employeeDTO) {
        Employee employee = new Employee(); //创建Employee实体
        //对象属性拷贝,可以一次性拷贝过来
        BeanUtils.copyProperties(employeeDTO,employee); //employeeDTO是源,employee是目标,从源拷贝到目标
        //调用copuProperties方法的前提:属性名必须先是一致的
        //设置账号的状态,默认正常状态,1表示正常,0表示锁定
        employee.setStatus(StatusConstant.ENABLE);
        //设置密码,默认密码
        employee.setPassword(DigestUtils.md5DigestAsHex(PasswordConstant.DEFAULT_PASSWORD.getBytes()));//存入数据库要对密码进行md5加密
        //PasswordConstant.DEFAULT_PASSWORD中存储密码”123456“
        employee.setCreateTime(LocalDateTime.now());//设置当前记录的创建时间和修改时间
        employee.setUpdateTime(LocalDateTime.now());
        //设置当前记录创建人id和修改人id
        //TODO 后期需要改为当前登录用户的id
        employee.setCreateUser(10L);
        employee.setUpdateUser(10L);

        employeeMapper.insert(employee);//调用持久层插入数据
    }

4. 最后呢调用了一个EmployeeMapper执行了SQL语句,来将数据插入数据库:

 @Insert("insert into employee(name,username,password,phone,sex,id_number,create_time,update_time,create_user,update_user)" //数据库字段
            + "values" +
            "(#{name},#{username},#{password},#{phone},#{sex},#{idNumber},#{createTime},#{updateTime},#{createUser},#{updateUser},#{status}})") //实体类字段
    void insert(Employee employee); //单表新增操作,没必要写入xml,通过注解完成

下面是开启驼峰命名:

3.功能测试

4.代码完善

5.2 员工分页查询

5.3 启用禁用员工账号

5.4 编辑员工

5.5 导入分类模块功能代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/969318.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux系统编程—socket网络编程

Linux系统编程—socket网络编程 理论概念1. TCP与UDP对比端口号作用 socket开发过程服务端1. socket 创建套接字2. bind 绑定IP端口3. listen 监听客户端4. accept 接收客户端5. read / write 数据传输 客户端1. socket 创建套接字2. connect 连接服务3. read / write 数据传输…

合宙Air724UG LuatOS-Air LVGL API控件--下拉框 (Dropdown)

下拉框 (Dropdown) 在显示选项过多时&#xff0c;可以通过下拉框收起多余选项。只为用户展示列表中的一项。 示例代码 -- 回调函数 event_handler function(obj, event)if (event lvgl.EVENT_VALUE_CHANGED) thenprint("Option:", lvgl.dropdown_get_symbol(obj)…

稀疏数组的实现

文章目录 目录 文章目录 前言 一 什么是稀疏数组? 二 稀疏数组怎么存储数据? 三 稀疏数组的实现 总结 前言 大家好,好久不见了,这篇博客是数据结构的第一篇文章,望大家多多支持! 一 什么是稀疏数组? 稀疏数组&#xff08;Sparse Array&#xff09;是一种数据结构&a…

Elastic-job分布式调度系统

一、定时任务实现方式 1、Thread方式 final int timeInterval 1000;Thread thread new Thread(new Runnable() {Overridepublic void run() {while (true){try {//每一秒执行一次Thread.sleep(timeInterval);System.out.println("run...");} catch (InterruptedE…

数据结构和算法(1):开始

算法概述 所谓算法&#xff0c;即特定计算模型下&#xff0c;旨在解决特定问题的指令序列 输入 待处理的信息&#xff08;问题&#xff09; 输出 经处理的信息&#xff08;答案&#xff09; 正确性 的确可以解决指定的问题 确定性 任一算法都可以描述为一个由基本操作组成的序…

SpringBoot核心原理与实践

第一章、SpringBoot简介 1、入门案例 2、官网创建压缩包程序 注意使用的版本pom文件中java --> 1.8、 springboot --> 2.5.0 3、SpringBoot快速启动 运行程序--找引导类 换技术、加技术--加starter 第二章、基础配置 1、配置文件格式 《1、端口号配置》 《2、将目录文…

React原理 - React Hooks

目录 扩展学习资料 React Hooks 编写函数组件 Hooks使命 Hooks解决了什么问题 Hooks原理 useState源码解析 mountState源码解析 Hooks应用 Hooks 实践 倒计时组件 练习 扩展学习资料 名称 链接 React Hooks 官方文档 Introducing Hooks – React useEffect 完整…

PYTHON知识点学习-列表和元组

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由 Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

把一般数据转换成因子数据格式,做单因子、债券对历史数据回测+获取curl命令+垃圾数据转换成标准行情数据(bardata)

下载curl软件&#xff0c;地址&#xff1a; curl for Windows for 64-bit下载好后解压到文件夹&#xff0c;将里面的bin文件添加到环境变量中&#xff0c;bon文件地址为&#xff1a;C:\Users\59980\curl-8.2.1_7-win64-mingw\bin 打开cmd&#xff0c;输入curl --help,出现下…

软考:中级软件设计师:程序语言基础:表达式,标准分类,法律法规,程序语言特点,函数传值传址

软考&#xff1a;中级软件设计师:程序语言基础&#xff1a;表达式 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都…

ssm民宿管理系统源码和论文

ssm民宿管理系统源码和论文110 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&…

SSM整合~

构建并配置项目&#xff1a; 第一步&#xff1a;创建maven项目 第二步&#xff1a;配置pom.xml文件 设置打包方式&#xff1a; <packaging>war</packaging>设置版本号为自定义属性&#xff1a; <properties><!--将版本号通过自定义属性配置--><…

跨站请求伪造(CSRF)攻击与防御原理

跨站请求伪造&#xff08;CSRF&#xff09; 1.1 CSRF原理 1.1.1 基本概念 跨站请求伪造&#xff08;Cross Site Request Forgery&#xff0c;CSRF&#xff09;是一种攻击&#xff0c;它强制浏览器客户端用户在当前对其进行身份验证后的Web 应用程序上执行非本意操作的攻击&a…

差异化竞争阵地的所在【周技术进阶】-从BS 项目C#最基础截取字符串方法开始

效果 代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConsoleAppNumberOneHelloWorld {class Program{static void Main(string[] args){Console.WriteLine("hello world&#xf…

TCP机制之确认应答及超时重传

TCP因为其可靠传输的特性被广泛使用,这篇博客将详细介绍一下TCP协议是如何保证它的可靠性的呢?这得主要依赖于其确认应答及超时重传机制,同时三次握手四次挥手也起到了少部分不作用,但是主要还是由确认应答和超时重传来决定的;注意:这里的可靠传输并不是说100%能把数据发送给接…

JVM学习(五)--方法区

概念&#xff1a; 方法区就是存和类相关的东西&#xff0c;成员方法&#xff0c;方法参数&#xff0c;成员变量&#xff0c;构造方法&#xff0c;类加载器等&#xff0c;逻辑上存在于堆中&#xff0c;但是不同的虚拟机对它的实现不同&#xff0c;oracle的hotsport vm在1.6的时…

事务(SQL)

事务概述 事务是一组操作的集合&#xff0c;他是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向西永提交或撤销操作请求。这组操作&#xff0c;要么全部执行成功&#xff0c;要么全部执行失败。 事务操作 查看/设置事务提交方式 -- 查看/设置事务…

9.1.tensorRT高级(4)封装系列-自动驾驶案例项目self-driving-道路分割分析

目录 前言1. 道路分割总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习 tensorRT 高级-自动驾驶案例项目self-driving-道路分…

Linux入门之多线程|线程|进程基本概念及库函数

目录 一、线程 1.线程的概 补充知识点&#xff1a;页表 2.线程的优点 3.线程的缺点 4.线程异常 5.线程用途 二、线程与进程的区别与联系 三、关于进程线程的问题 0.posix线程库 1.创建线程 2.线程终止 3.取消线程 4.线程等待&#xff08;等待线程结束&#xff09;…

02|李沐动手学深度学习v2(笔记)

基础优化算法 导航 基础优化算法梯度下降1.1 小批量随机梯度下降1.2 小结 线性回归实现1. 处理数据1.3 生成大小为batch_size的小批量 2. 处理模型3. 模型评估4. 训练过程 梯度下降 针对我们的模型没有显示解。&#xff08;生活中很少能有完全符合的线性模型&#xff0c;大多数…