??博客x主頁:己不由心王道長(zhǎng)??!
??文章說明:SpringBoot項(xiàng)目-瑞吉外賣【day01】??
?系列專欄:SpringBoot項(xiàng)目
??本篇內(nèi)容:對(duì)黑馬的瑞吉外賣項(xiàng)目的day01進(jìn)行筆記和項(xiàng)目實(shí)現(xiàn)??
??每日一語:人有退路,就有些許安全感。等到哪一天,你真沒了退路,你就發(fā)現(xiàn)眼前哪條路都能走,也能通。??
?? 交流社區(qū):己不由心王道長(zhǎng)(優(yōu)質(zhì)編程社區(qū))
前言
從今天開始,正式進(jìn)入項(xiàng)目階段。本次的項(xiàng)目是跟著黑馬的瑞吉外賣項(xiàng)目走的,有借鑒和使用,也有自己的觀點(diǎn)和實(shí)現(xiàn)。由于本課程用到了很多前端知識(shí)(了解),所以關(guān)于前端分析的時(shí)候,我應(yīng)該會(huì)選擇跳過或者簡(jiǎn)略一看;大家學(xué)有余力或者對(duì)前端已經(jīng)輕車熟路的可以自己看看黑馬的視頻。本次的項(xiàng)目并沒有從前端到后臺(tái)都自己進(jìn)行搭建,雖然我也很向往這個(gè),但是還是在學(xué)精后端再去深入前端吧,我也沒有余力,只是后端的內(nèi)容就已經(jīng)讓我頭大了。還有就是,本次內(nèi)容只是對(duì)于黑馬視頻的day01,我一定會(huì)堅(jiān)持把整個(gè)項(xiàng)目都拿下的,感興趣的小伙伴可以點(diǎn)點(diǎn)訂閱,專欄已在頭部給出。
最后,博主水平實(shí)在有限,如果有錯(cuò)誤的地方還望各位大佬批評(píng)指正。萬分感謝。
軟件開發(fā)整體介紹
軟件開發(fā)流程
軟件開發(fā)整體流程如下:
角色分工:
角色分工我個(gè)人認(rèn)為挺有趣,難度應(yīng)該從下到上吧,我們后端的開發(fā)工程師應(yīng)該對(duì)應(yīng)軟件開發(fā)流程中的編碼、然后往下依次對(duì)應(yīng)。
軟件環(huán)境:
關(guān)于軟件環(huán)境,我們?cè)谝郧暗奈恼略?jīng)學(xué)過多環(huán)境開發(fā),如不嫌棄,可以移步SpringBoot專欄,這里就不贅述了。
瑞吉外賣項(xiàng)目介紹
項(xiàng)目介紹
原話:
本項(xiàng)目(瑞吉外賣)是專門為餐飲企業(yè)(餐廳、飯店)定制的一款軟件產(chǎn)品,包括系統(tǒng)管理后臺(tái)和移動(dòng)端應(yīng)用兩部分其中系統(tǒng)管理后臺(tái)主要提供給餐飲企業(yè)內(nèi)部員工使用,可以對(duì)餐廳的菜品、套餐、訂單等進(jìn)行管理維護(hù)。移動(dòng)端應(yīng)用主要提供給消費(fèi)者使用,可以在線瀏覽菜品、添加購(gòu)物車、下單等。
本項(xiàng)目共分為3期進(jìn)行開發(fā):
第一期主要實(shí)現(xiàn)基本需求,其中移動(dòng)端應(yīng)用通過H5實(shí)現(xiàn),用戶可以通過手機(jī)瀏覽器訪問。第二期主要針對(duì)移動(dòng)端應(yīng)用進(jìn)行改進(jìn),使用微信小程序?qū)崿F(xiàn),用戶使用起來更加方便。第三期主要針對(duì)系統(tǒng)進(jìn)行優(yōu)化升級(jí),提高系統(tǒng)的訪問性能。
理解:
其實(shí)沒什么好說的,就是在項(xiàng)目開始的時(shí)候,一定是先搭架子,把基本的跑通,然后再基礎(chǔ)之上做改進(jìn),最后進(jìn)行優(yōu)化,切不可圖快。不要把自己繞進(jìn)去。
下面是項(xiàng)目圖片:
產(chǎn)品原型展示
原話:
產(chǎn)品原型,就是一款產(chǎn)品成型之前的一個(gè)簡(jiǎn)單的框架,就是將頁面的排版布局展現(xiàn)出來,使產(chǎn)品的初步構(gòu)思有一個(gè)可視化的展示。通過原型展示,可以更加直觀的了解項(xiàng)目的需求和提供的功能。
理解:就是一個(gè)基本的架子,可以看到基本的效果,值得注意的是,產(chǎn)品原型可不等于完整的產(chǎn)品(不用說也知道)。
讓我們?nèi)タ纯串a(chǎn)品原型吧,原型資料在文章最后可以拿到,或者去黑馬視頻下領(lǐng)?。?/p>
可以看到,這里已經(jīng)有了產(chǎn)品的原型。產(chǎn)品原型一般不是開發(fā)工程師去完成的,這里我們了解。
可以看到產(chǎn)品原型分為管理端和用戶端,這是正常的軟件的開發(fā)格式,軟件肯定有管理者,有用戶;其實(shí)管理者也是用戶,但是管理者用的肯定跟用戶端的不同。
可以看到管理端和用戶端都有自己的界面等相關(guān)資料。
以上就是該項(xiàng)目的產(chǎn)品原型,非常的nice。
注意:產(chǎn)品原型主要用于展示項(xiàng)目的功能,并不是最終的頁面效果。
技術(shù)選型
技術(shù)選型是一個(gè)重要的過程,不同產(chǎn)品所用到的技術(shù)是不一樣的。有的追求高效率、高并發(fā);而有的要保證安全性。
那么我們這個(gè)項(xiàng)目的技術(shù)選項(xiàng)是什么呢?
這里面有的技術(shù)已經(jīng)學(xué)過,有的技術(shù)根本就沒見過,怎么辦呢?管它呢,這里先了解一下該項(xiàng)目用到的技術(shù),等做到那一步再看看也不遲,但是最基礎(chǔ)的你得會(huì)。
功能架構(gòu)
下面是整體功能架構(gòu)圖:
可以分為兩大部分,分別是移動(dòng)端前臺(tái)和系統(tǒng)管理后臺(tái);移動(dòng)端前臺(tái)又分為H5、微信小程序;即網(wǎng)頁版和微信小程序版。
角色
一般沒有后臺(tái)系統(tǒng)管理員,這個(gè)權(quán)力太大了。而后臺(tái)普通員工和C端用戶可以對(duì)上功能架構(gòu)圖。其實(shí)想想也知道,功能是給人用的,不同的功能可能就對(duì)應(yīng)不同的用戶類型。
開發(fā)環(huán)境搭建
數(shù)據(jù)庫環(huán)境搭建
這里的數(shù)據(jù)庫用的是官方給的數(shù)據(jù)庫,大概十幾張表,關(guān)系有點(diǎn)復(fù)雜。
所以導(dǎo)入已給的sql語句即可:
第一步:創(chuàng)建數(shù)據(jù)庫
這里直接用工具創(chuàng)建,不用cmd模式了。
第二步:導(dǎo)入sql腳本
右鍵選擇執(zhí)行SQL文件
找到SQL文件,注意路徑不要帶有中文,不然可能出錯(cuò)。點(diǎn)擊開始即可。
然后刷新表:
我們已經(jīng)把數(shù)據(jù)庫創(chuàng)建好了。里面已經(jīng)有了初始數(shù)據(jù)。
maven項(xiàng)目搭建
在把數(shù)據(jù)庫準(zhǔn)備好以后,我們要著手開始我們的項(xiàng)目的搭建。
注意看,我創(chuàng)建了一個(gè)SpringBoot類型的項(xiàng)目,而且保存在了SpringBoot project目錄中加以區(qū)分。
后面的什么技術(shù)也不要選,導(dǎo)入項(xiàng)目給的配置就行。
導(dǎo)入數(shù)據(jù):
首先把pom.xml文件替換掉
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.itheima</groupId>
<artifactId>reggie_take_out</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.23</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.4.5</version>
</plugin>
</plugins>
</build>
</project>
檢查倉庫和jdk及其他環(huán)境正不正確:
如上圖,在這里我的maven倉庫它并沒有給我配好,需要手動(dòng)更改一下,不然程序是運(yùn)行不了的。
運(yùn)行程序,檢查錯(cuò)誤:
更換application.yml:
server:
port: 8080
spring:
application:
#應(yīng)用的名稱,可選
name: reggie_take_out
datasource:
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/reggie?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: 775033
mybatis-plus:
configuration:
#在映射實(shí)體或者屬性時(shí),將數(shù)據(jù)庫中表名和字段名中的下劃線去掉,按照駝峰命名法映射
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
id-type: ASSIGN_ID
上面的application.name是設(shè)置當(dāng)前應(yīng)用的名字,不設(shè)置的話默認(rèn)用的是你創(chuàng)建項(xiàng)目的名稱。
map-underscore-to-camel-case 是設(shè)置實(shí)體和數(shù)據(jù)庫中屬性的關(guān)系,如果設(shè)置為true,則表示將數(shù)據(jù)庫中表名和字段名中的下劃線去掉,按照駝峰命名法映射:
如實(shí)體:username
數(shù)據(jù)庫屬性:user_name
當(dāng)設(shè)置為true并映射時(shí),會(huì)自動(dòng)把user_name描述為username。
建立三層架構(gòu)目錄:
創(chuàng)建實(shí)體類:
package com.example.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 員工實(shí)體
*/
@Data
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String username;
private String name;
private String password;
private String phone;
private String sex;
private String idNumber;//身份證號(hào)碼
private Integer status;
private LocalDateTime createTime;
private LocalDateTime updateTime;
@TableField(fill = FieldFill.INSERT)
private Long createUser;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateUser;
}
創(chuàng)建mapper層接口:EmployeeMapper集成BaseMapper使用Mybatisplus
package com.example.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.entity.Employee;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface EmployeeMapper extends BaseMapper<Employee>{
}
@Mapper是告訴sprigng框架此接口的實(shí)現(xiàn)類由Mybatis負(fù)責(zé)創(chuàng)建,并將其實(shí)現(xiàn)類對(duì)象存儲(chǔ)到spring容器中。這里由Mybatisplus創(chuàng)建。
創(chuàng)建service層接口:EmployeeService、Mybatis-plus同樣為service層也進(jìn)行了增強(qiáng),需要在接口去繼承IService接口。
package com.example.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.entity.Employee;
public interface EmployeeService extends IService<Employee> {
}
創(chuàng)建Service層接口的實(shí)現(xiàn)類:EmployeeServiceImpl、這個(gè)類除了實(shí)現(xiàn)它的父接口以外,還得去繼承一個(gè)ServiceImpl的方法,并且傳入實(shí)體類和mapper層的接口。
package com.example.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.entity.Employee;
import com.example.mapper.EmployeeMapper;
import com.example.service.EmployeeService;
import org.springframework.stereotype.Service;
@Service
public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper, Employee> implements EmployeeService {
}
至于為什么這樣,那是Mybatis-plus的內(nèi)容,可以回去復(fù)習(xí)復(fù)習(xí)。
導(dǎo)入前端靜態(tài)頁面資料:
設(shè)置靜態(tài)資源映射
在完成上面內(nèi)容之后,我們不著急編寫controller,現(xiàn)在還有一個(gè)棘手的問題,請(qǐng)看:
當(dāng)我去訪問靜態(tài)資源的時(shí)候,發(fā)現(xiàn)了錯(cuò)誤,狀態(tài)顯示404,沒有找到。當(dāng)然找不到,為什么呢?
還記得以前我們創(chuàng)建SpringBoot項(xiàng)目時(shí)有的static、Template目錄嗎?
靜態(tài)資源一般是存放在那里面的,而且SpringBoot默認(rèn)的靜態(tài)資源訪問路徑就是它們,而現(xiàn)在我們并沒有這兩個(gè)目錄,怎么辦呢?配置靜態(tài)資源映射。
我們創(chuàng)建一個(gè)config目錄:
因?yàn)橘Y源訪問在ssm的時(shí)候其實(shí)是屬于mvc框架管理的,所以創(chuàng)建一個(gè)WebMvcConfig類用以實(shí)現(xiàn)資源路徑,見名知意。并且實(shí)現(xiàn)WebMvcConfigurationSupport:
ctrl+h看類關(guān)系圖
看到該類是servlet.config包下的類,就是servlet的配置文件,我們以前在servlet里設(shè)置訪問路徑時(shí)是在web.xml文件中設(shè)置。
package com.example.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
/**
* @author 不止于夢(mèng)想
* @date 2022/11/12 18:54
*/
@Slf4j
@Configuration//表明這是一個(gè)配置類
public class WebMvcConfig extends WebMvcConfigurationSupport {
/**
* 設(shè)置靜態(tài)資源映射
* @param registry
*/
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
log.info("資源解析器啟動(dòng)");
registry.addResourceHandler("/backend/**").addResourceLocations("/backend");
registry.addResourceHandler("/front/**").addResourceLocations("/front");
}
}
驗(yàn)證:看到資源資源解析器啟動(dòng),
postman驗(yàn)證:
還是顯示沒找到,出錯(cuò)了?沒有,看看后臺(tái)
后臺(tái)已經(jīng)收到了請(qǐng)求。說明我們的資源解析器配置成功。
后臺(tái)登錄
需求分析
需求分析,我們先來看看登錄界面長(zhǎng)什么樣吧,拉出來溜溜。由于代碼十分多,且有點(diǎn)復(fù)雜,我就截出需要看的代碼,小伙伴們最好也自己上手代碼,不然可能不知道我這些是啥玩意:
登錄按鈕綁定了一個(gè)事件,事件是一個(gè)方法handleLogin,在下圖中我找到了這個(gè)方法,如圖:
最值得探究的是loginApi,我們跟進(jìn)去:
發(fā)現(xiàn)這其實(shí)是一個(gè)函數(shù),并且發(fā)送axios請(qǐng)求去尋找后臺(tái)的/employee/login
路徑,當(dāng)然它現(xiàn)在找不到,因?yàn)槲覀儾]有編寫controller,也就沒有請(qǐng)求路徑。還得注意的是,這是一個(gè)post請(qǐng)求:
到這就清楚了,原來這是一個(gè)點(diǎn)擊登錄,然后在前臺(tái)進(jìn)行數(shù)據(jù)格式校驗(yàn),校驗(yàn)通過則登錄標(biāo)簽span設(shè)為登錄中,然后調(diào)用loginApi發(fā)送axios請(qǐng)求,去/employee/login路徑下尋找登錄的controller,返回狀態(tài)進(jìn)行判斷,通過則在前端進(jìn)行頁面跳轉(zhuǎn)到歡迎界面,否則則把span標(biāo)簽設(shè)為false,即登錄。繼續(xù)留在登錄界面
分析完畢?。?/p>
代碼開發(fā)
在上面我們已經(jīng)分析了整個(gè)過程,現(xiàn)在應(yīng)該編寫相應(yīng)的controller,提供路徑和方法供其訪問。
編寫一個(gè)EmployeeController,專門為Employee服務(wù)的控制層
在開始注入service層的服務(wù)對(duì)象:
新建一個(gè)方法Login方法,這里我們前后端整合的時(shí)候一般都會(huì)統(tǒng)一返回格式,比如狀態(tài)碼、msg信息,對(duì)象信息。
package com.example.commons;
/**
* @author 不止于夢(mèng)想
* @date 2022/11/13 15:52
*/
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
/**
* 通用返回結(jié)果,服務(wù)端響應(yīng)的數(shù)據(jù)最終都會(huì)封裝成此對(duì)象
* @param <T>
*/
@Data
public class R<T> {
private Integer code; //編碼:1成功,0和其它數(shù)字為失敗
private String msg; //錯(cuò)誤信息
private T data; //數(shù)據(jù)
private Map map = new HashMap(); //動(dòng)態(tài)數(shù)據(jù)
public static <T> R<T> success(T object) {
R<T> r = new R<T>();
r.data = object;
r.code = 1;
return r;
}
public static <T> R<T> error(String msg) {
R r = new R();
r.msg = msg;
r.code = 0;
return r;
}
public R<T> add(String key, Object value) {
this.map.put(key, value);
return this;
}
}
狀態(tài)碼表示成功與否,一目了然,msg用來存儲(chǔ)錯(cuò)誤信息。data是數(shù)據(jù),而且用了泛型,就是你想查詢什么數(shù)據(jù),就查什么,泛型會(huì)給你轉(zhuǎn)換的。
這時(shí)候就可以編寫實(shí)際的方法了,返回值類型也是用到了泛型,類型是Employee。
該方法會(huì)保存session信息,以供后面檢查登錄的過濾器或者攔截器使用,所以參數(shù)應(yīng)該有HttpServletRequest,并且是驗(yàn)證客戶是否存在,參數(shù)應(yīng)該有客戶對(duì)象,使用@RequestBody在參數(shù)中會(huì)自動(dòng)把前端傳入的參數(shù)注入到被注釋的形參中并轉(zhuǎn)換為json格式。
這里都不在后端進(jìn)行頁面跳轉(zhuǎn),而是統(tǒng)一格式后把數(shù)據(jù)傳給前端,由前端拿到數(shù)據(jù)并進(jìn)行判斷,在加以視圖的切換。
@PostMapping("/login")
public R<Employee> login(HttpServletRequest request, @RequestBody Employee employee){
//1、將頁面提交的密碼password進(jìn)行md5加密處理
String password = employee.getPassword();
password = DigestUtils.md5DigestAsHex(password.getBytes());
//2、根據(jù)頁面提交的用戶名username查詢數(shù)據(jù)庫
LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Employee::getUsername,employee.getUsername());
Employee emp = employeeService.getOne(queryWrapper);
//3、如果沒有查詢到則返回登錄失敗結(jié)果
if(emp == null){
return R.error("登錄失敗");
}
//4、密碼比對(duì),如果不一致則返回登錄失敗結(jié)果
if(!emp.getPassword().equals(password)){
return R.error("登錄失敗");
}
//5、查看員工狀態(tài),如果為已禁用狀態(tài),則返回員工已禁用結(jié)果
if(emp.getStatus() == 0){
return R.error("賬號(hào)已禁用");
}
//6、登錄成功,將員工id存入Session并返回登錄成功結(jié)果
request.getSession().setAttribute("employee",emp.getId());
return R.success(emp);
}
上面的語句中用了都是Mybatis-plus的工具,看起來有些吃力,建議大家把mybatisplus學(xué)完之后再來完成這個(gè)項(xiàng)目。
功能測(cè)試
在功能測(cè)試這里,建議大家手動(dòng)的在地址欄上敲出登錄的地址,如果直接在IEDA中進(jìn)入登錄界面,那么就會(huì)出現(xiàn)以下問題:
這上面其實(shí)不是axios.min.js的錯(cuò)誤,這是IDEA的錯(cuò)誤,太傻了,浪費(fèi)我很多時(shí)間。這個(gè)錯(cuò)誤在chore也不完整,我們?cè)谄渌麨g覽器打開:
看到?jīng)]有,直接從IEDA里面進(jìn)入,會(huì)默認(rèn)把你的端口號(hào)都改了。但是你手動(dòng)的在地址欄上輸入登錄的地址,然后再輸入賬號(hào)和密碼,則不會(huì)出錯(cuò)。
因?yàn)樵陧撁嫔弦呀?jīng)給出了賬號(hào)和密碼,所以點(diǎn)擊就進(jìn)入了管理界面,說明前后端已經(jīng)跑通了。
后臺(tái)退出
需求分析
做好了登錄功能,我們來完成以下退出功能,由于都是Employee的用戶,所以代碼寫在一個(gè)controller中。
由于我們是先登錄,然后才有的退出選項(xiàng),所以退出功能應(yīng)該在index.html界面:
可以看到,在一張圖片上,就是一個(gè)退出的功能,并且這個(gè)功能綁定了一個(gè)單擊事件,我們還是一樣,跟進(jìn)去看看。
無非就是這幾個(gè),我們現(xiàn)在關(guān)注的是退出Api,即logoutApi。
可以看到,這個(gè)方法同樣是調(diào)用axios方式異步請(qǐng)求,細(xì)節(jié)如圖。
現(xiàn)在可以了解到了,只要我們點(diǎn)擊退出那個(gè)圖片,就會(huì)觸發(fā)一個(gè)事件,這個(gè)事件綁定的函數(shù)就會(huì)向/employee/logout這個(gè)路徑發(fā)送post請(qǐng)求。
代碼開發(fā)
在上面我們已經(jīng)完成了代碼的分析,現(xiàn)在就是編寫controller,應(yīng)為這都employee一類對(duì)象,所以直接在EmployeeController里面編寫一個(gè)退出方法即可。
@PostMapping("/logout")
public R<String> logout(HttpServletRequest request){
//清理Session中保存的當(dāng)前登錄員工的id
request.getSession().removeAttribute("employee");
return R.success("退出成功");
}
代碼十分簡(jiǎn)介,還是需要HttpServletRequest對(duì)象,然后把請(qǐng)求對(duì)象保存的session移除即可,移除之后調(diào)用一個(gè)統(tǒng)一返回格式的success方法,
返回一個(gè)退出成功的信息。并把code賦值為1,return回前端進(jìn)行比較,比較成功,則跳轉(zhuǎn)視圖到登錄頁面文章來源:http://www.zghlxwxcb.cn/news/detail-400429.html
功能測(cè)試
在上面已經(jīng)編寫好了退出的方法,現(xiàn)在我們只需要去點(diǎn)擊退出按鈕即可,
管理員旁邊的圖片就是退出按鈕,我在退出的時(shí)候在后臺(tái)打印一句話,如果退出成功則輸出。
我們現(xiàn)在完成了項(xiàng)目的第一步,登錄和退出功能。文章來源地址http://www.zghlxwxcb.cn/news/detail-400429.html
到了這里,關(guān)于【SpringBoot項(xiàng)目】SpringBoot項(xiàng)目-瑞吉外賣【day01】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!