1.蒼穹外賣-day01

蒼穹外賣-day01

課程內容

  • 軟件開發整體介紹

  • 蒼穹外賣項目介紹

  • 開發環境搭建

  • 導入接口文檔

  • Swagger

項目整體效果展示:

管理端-外賣商家使用

用戶端-點餐用戶使用

當我們完成該項目的學習,可以培養以下能力:

1. 軟件開發整體介紹

作為一名軟件開發工程師,我們需要了解在軟件開發過程中的開發流程, 以及軟件開發過程中涉及到的崗位角色,角色的分工、職責, 并了解軟件開發中涉及到的三種軟件環境。那么這一小節,我們將從 軟件開發流程、角色分工、軟件環境 三個方面整體介紹一下軟件開發。

1.1 軟件開發流程

1). 第1階段: 需求分析

完成需求規格說明書、產品原型編寫。

需求規格說明書, 一般來說就是使用 Word 文檔來描述當前項目的各個組成部分,如:系統定義、應用環境、功能規格、性能需求等,都會在文檔中描述。例如:

產品原型,一般是通過網頁(html)的形式展示當前的頁面展示什么樣的數據, 頁面的布局是什么樣子的,點擊某個菜單,打開什么頁面,點擊某個按鈕,出現什么效果,都可以通過產品原型看到。 例如:

2). 第2階段: 設計

設計的內容包含 UI設計、數據庫設計、接口設計。

UI設計:用戶界面的設計,主要設計項目的頁面效果,小到一個按鈕,大到一個頁面布局,還有人機交互邏輯的體現。例如:

數據庫設計:需要設計當前項目中涉及到哪些數據庫,每一個數據庫里面包含哪些表,這些表結構之間的關系是什么樣的,表結構中包含哪些字段。例如:

接口設計:通過分析原型圖,首先,粗粒度地分析每個頁面有多少接口,然后,再細粒度地分析每個接口的傳入參數,返回值參數,同時明確接口路徑及請求方式。例如:

3). 第3階段: 編碼

編寫項目代碼、并完成單元測試。

項目代碼編寫:作為軟件開發工程師,我們需要對項目的模塊功能分析后,進行編碼實現。

單元測試:編碼實現完畢后,進行單元測試,單元測試通過后再進入到下一階段。例如:

4). 第4階段: 測試

在該階段中主要由測試人員, 對部署在測試環境的項目進行功能測試, 并出具測試報告。

5). 第5階段: 上線運維

在項目上線之前, 會由運維人員準備服務器上的軟件環境安裝、配置, 配置完畢后, 再將我們開發好的項目,部署在服務器上運行。

1.2 角色分工

在對整個軟件開發流程熟悉后, 我們還有必要了解一下在整個軟件開發流程中涉及到的崗位角色,以及各個角色的職責分工。

崗位/角色對應階段職責/分工
項目經理全階段對整個項目負責,任務分配、把控進度
產品經理需求分析進行需求調研,輸出需求調研文檔、產品原型等
UI設計師設計根據產品原型輸出界面效果圖
架構師設計項目整體架構設計、技術選型等
開發工程師編碼功能代碼實現
測試工程師測試編寫測試用例,輸出測試報告
運維工程師上線運維軟件環境搭建、項目上線

上述我們講解的角色分工, 是在一個項目組中比較標準的角色分工, 但是在實際的項目中, 有一些項目組由于人員配置緊張, 可能并沒有專門的架構師或測試人員, 這個時候可能需要有項目經理或者程序員兼任。

1.3 軟件環境

作為軟件開發工程師,在編碼的過程中就不可避免地會接觸多種軟件環境,我們主要來分析在工作中經常遇到的三套環境, 分別是: 開發環境、測試環境、生產環境。 接下來,我們分別介紹一下這三套環境的作用和特點。

1). 開發環境(development)

我們作為軟件開發人員,在開發階段使用的環境,就是開發環境,一般外部用戶無法訪問。

比如,我們在開發中使用的MySQL數據庫和其他的一些常用軟件,我們可以安裝在本地, 也可以安裝在一臺專門的服務器中, 這些應用軟件僅僅在軟件開發過程中使用, 項目測試、上線時,我們不會使用這套環境了,這個環境就是開發環境。

2). 測試環境(testing)

當軟件開發工程師,將項目的功能模塊開發完畢,并且單元測試通過后,就需要將項目部署到測試服務器上,讓測試人員對項目進行測試。那這臺測試服務器就是專門給測試人員使用的環境, 也就是測試環境,用于項目測試,一般外部用戶無法訪問。

3). 生產環境(production)

當項目開發完畢,并且由測試人員測試通過之后,就可以上線項目,將項目部署到線上環境,并正式對外提供服務,這個線上環境也稱之為生產環境。

? ? ? ? ? ?開發環境? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??測試環境? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?生產環境

首先,會在開發環境中進行項目開發,往往開發環境大多數都是本地的電腦環境和局域網內的環境,當開發完畢后,然后會把項目部署到測試環境,測試環境一般是一臺獨立測試服務器的環境,項目測試通過后,最終把項目部署到生產環境,生產環境可以是機房或者云服務器等線上環境。

2. 蒼穹外賣項目介紹

在開發蒼穹外賣這個項目之前,我們需要全方位的來介紹一下當前我們學習的這個項目。接下來,我們將從項目簡介、產品原型、技術選型三個方面來介紹蒼穹外賣這個項目。

2.1 項目介紹

本項目(蒼穹外賣)是專門為餐飲企業(餐廳、飯店)定制的一款軟件產品,包括 系統管理后臺 和 小程序端應用 兩部分。其中系統管理后臺主要提供給餐飲企業內部員工使用,可以對餐廳的分類、菜品、套餐、訂單、員工等進行管理維護,對餐廳的各類數據進行統計,同時也可進行來單語音播報功能。小程序端主要提供給消費者使用,可以在線瀏覽菜品、添加購物車、下單、支付、催單等。

接下來,通過功能架構圖來展示管理端用戶端的具體業務功能模塊。

1). 管理端功能

員工登錄/退出 , 員工信息管理 , 分類管理 , 菜品管理 , 套餐管理 , 菜品口味管理 , 訂單管理 ,數據統計,來單提醒。

2). 用戶端功能

微信登錄 , 收件人地址管理 , 用戶歷史訂單查詢 , 菜品規格查詢 , 購物車功能 , 下單 , 支付、分類及菜品瀏覽。

2.2 產品原型

產品原型,用于展示項目的業務功能,一般由產品經理進行設計。

注意事項: 產品原型主要用于展示項目的功能,并不是最終的頁面效果。

在課程資料的產品原型文件夾下,提供了兩份產品原型。

管理端原型圖:

用戶端原型圖:

1). 管理端

餐飲企業內部員工使用。 主要功能有:

模塊描述
登錄/退出內部員工必須登錄后,才可以訪問系統管理后臺
員工管理管理員可以在系統后臺對員工信息進行管理,包含查詢、新增、編輯、禁用等功能
分類管理主要對當前餐廳經營的 菜品分類 或 套餐分類 進行管理維護, 包含查詢、新增、修改、刪除等功能
菜品管理主要維護各個分類下的菜品信息,包含查詢、新增、修改、刪除、啟售、停售等功能
套餐管理主要維護當前餐廳中的套餐信息,包含查詢、新增、修改、刪除、啟售、停售等功能
訂單管理主要維護用戶在移動端下的訂單信息,包含查詢、取消、派送、完成,以及訂單報表下載等功能
數據統計主要完成對餐廳的各類數據統計,如營業額、用戶數量、訂單等

2). 用戶端

移動端應用主要提供給消費者使用。主要功能有:

模塊描述
登錄/退出用戶需要通過微信授權后登錄使用小程序進行點餐
點餐-菜單在點餐界面需要展示出菜品分類/套餐分類, 并根據當前選擇的分類加載其中的菜品信息, 供用戶查詢選擇
點餐-購物車用戶選中的菜品就會加入用戶的購物車, 主要包含 查詢購物車、加入購物車、刪除購物車、清空購物車等功能
訂單支付用戶選完菜品/套餐后, 可以對購物車菜品進行結算支付, 這時就需要進行訂單的支付
個人信息在個人中心頁面中會展示當前用戶的基本信息, 用戶可以管理收貨地址, 也可以查詢歷史訂單數據

2.3 技術選型

關于本項目的技術選型, 我們將會從 用戶層、網關層、應用層、數據層 這幾個方面進行介紹,主要用于展示項目中使用到的技術框架和中間件等。

1). 用戶層

本項目中在構建系統管理后臺的前端頁面,我們會用到H5、Vue.js、ElementUI、apache echarts(展示圖表)等技術。而在構建移動端應用時,我們會使用到微信小程序。

2). 網關層

Nginx是一個服務器,主要用來作為Http服務器,部署靜態資源,訪問性能高。在Nginx中還有兩個比較重要的作用: 反向代理和負載均衡, 在進行項目部署時,要實現Tomcat的負載均衡,就可以通過Nginx來實現。

3). 應用層

SpringBoot: 快速構建Spring項目, 采用 "約定優于配置" 的思想, 簡化Spring項目的配置開發。

SpringMVC:SpringMVC是spring框架的一個模塊,springmvc和spring無需通過中間整合層進行整合,可以無縫集成。

Spring Task: 由Spring提供的定時任務框架。

httpclient: 主要實現了對http請求的發送。

Spring Cache: 由Spring提供的數據緩存框架

JWT: 用于對應用程序上的用戶進行身份驗證的標記。

阿里云OSS: 對象存儲服務,在項目中主要存儲文件,如圖片等。

Swagger: 可以自動的幫助開發人員生成接口文檔,并對接口進行測試。

POI: 封裝了對Excel表格的常用操作。

WebSocket: 一種通信網絡協議,使客戶端和服務器之間的數據交換更加簡單,用于項目的來單、催單功能實現。

4). 數據層

MySQL: 關系型數據庫, 本項目的核心業務數據都會采用MySQL進行存儲。

Redis: 基于key-value格式存儲的內存數據庫, 訪問速度快, 經常使用它做緩存。

Mybatis: 本項目持久層將會使用Mybatis開發。

pagehelper: 分頁插件。

spring data redis: 簡化java代碼操作Redis的API。

5). 工具

git: 版本控制工具, 在團隊協作中, 使用該工具對項目中的代碼進行管理。

maven: 項目構建工具。

junit:單元測試工具,開發人員功能實現完畢后,需要通過junit對功能進行單元測試。

postman: 接口測工具,模擬用戶發起的各類HTTP請求,獲取對應的響應結果。

3. 開發環境搭建

開發環境搭建主要包含前端環境后端環境兩部分。作為服務端開發工程師, 我們課程學習的重心應該放在后端的業務代碼上, 前端的頁面我們只需要導入資料中的nginx, 前端頁面的代碼我們只需要能看懂即可。

3.1 前端環境搭建

1). 前端工程基于 nginx

從資料中找到前端運行環境的nginx,移動到非中文目錄下。

sky目錄中存放了管理端的前端資源,具體如下:

2). 啟動nginx,訪問測試

雙擊 nginx.exe 即可啟動 nginx 服務,訪問端口號為 80

http://localhost:80

3.2 后端環境搭建

3.2.1 熟悉項目結構

后端工程基于 maven 進行項目構建,并且進行分模塊開發。

1). 從當天資料中找到后端初始工程:

2). 用 IDEA 打開初始工程,了解項目的整體結構:

對工程的每個模塊作用說明:

序號名稱說明
1sky-take-outmaven父工程,統一管理依賴版本,聚合其他子模塊
2sky-common子模塊,存放公共類,例如:工具類、常量類、異常類等
3sky-pojo子模塊,存放實體類、VO、DTO等
4sky-server子模塊,后端服務,存放配置文件、Controller、Service、Mapper等

對項目整體結構了解后,接下來我們詳細分析上述的每個子模塊:

  • sky-common: 模塊中存放的是一些公共類,可以供其他模塊使用

    分析sky-common模塊的每個包的作用:

    名稱說明
    constant存放相關常量類
    context存放上下文類
    enumeration項目的枚舉類存儲
    exception存放自定義異常類
    json處理json轉換的類
    properties存放SpringBoot相關的配置屬性類
    result返回結果類的封裝
    utils常用工具類

  • sky-pojo: 模塊中存放的是一些 entity、DTO、VO

    分析sky-pojo模塊的每個包的作用:

    名稱說明
    Entity實體,通常和數據庫中的表對應
    DTO數據傳輸對象,通常用于程序中各層之間傳遞數據
    VO視圖對象,為前端展示數據提供的對象
    POJO普通Java對象,只有屬性和對應的getter和setter

  • sky-server: 模塊中存放的是 配置文件、配置類、攔截器、controller、service、mapper、啟動類等

    分析sky-server模塊的每個包的作用:

    名稱說明
    config存放配置類
    controller存放controller類
    interceptor存放攔截器類
    mapper存放mapper接口
    service存放service類
    SkyApplication啟動類

3.2.2 Git版本控制

使用Git進行項目代碼的版本控制,具體操作:

1). 創建Git本地倉庫

當Idea中出現:

說明本地倉庫創建成功。

2). 創建Git遠程倉庫

訪問Gitee - 基于 Git 的代碼托管和研發協作平臺,新建倉庫

點擊 創建

3). 將本地文件推送到Git遠程倉庫

  1. 提交文件至本地倉庫

    忽略以下類型文件

    開始提交

    中間出現:點擊commit

  2. 添加Git遠程倉庫地址

    復制遠程地址:

    添加地址:

  3. 推送

成功推送至遠程倉庫

3.2.3 數據庫環境搭建
  1. 從資料中找到sky.sql

直接打開sky.sql文件

通過該sql文件直接可創建數據庫,所以不需要提前創建數據庫,直接導入該文件執行即可。

  1. 執行sky.sql文件

執行完成后,共創建出11張表

每張表的說明:

序號表名中文名
1employee員工表
2category分類表
3dish菜品表
4dish_flavor菜品口味表
5setmeal套餐表
6setmeal_dish套餐菜品關系表
7user用戶表
8address_book地址表
9shopping_cart購物車表
10orders訂單表
11order_detail訂單明細表

我們目前先簡單了解大概有哪些表, 每張表存儲什么數據, 有一個印象。對于具體的表結構, 以及表結構中的字段, 可以參考資料中的《數據庫設計文檔》,同時在講解具體的功能開發時, 我們也會再詳細介紹。

3.2.4 前后端聯調

后端的初始工程中已經實現了登錄功能,直接進行前后端聯調測試即可

實現思路:

1.Controller層

在sky-server模塊中,com.sky.controller.admin.EmployeeController

/*** 登錄** @param employeeLoginDTO* @return*/@PostMapping("/login")public Result<EmployeeLoginVO> login(@RequestBody EmployeeLoginDTO employeeLoginDTO) {log.info("員工登錄:{}", employeeLoginDTO);//調用service方法查詢數據庫Employee employee = employeeService.login(employeeLoginDTO);//登錄成功后,生成jwt令牌Map<String, Object> claims = new HashMap<>();claims.put(JwtClaimsConstant.EMP_ID, employee.getId());String token = JwtUtil.createJWT(jwtProperties.getAdminSecretKey(),jwtProperties.getAdminTtl(),claims);EmployeeLoginVO employeeLoginVO = EmployeeLoginVO.builder().id(employee.getId()).userName(employee.getUsername()).name(employee.getName()).token(token).build();return Result.success(employeeLoginVO);}

需要導入lombok的Builder注解才能這樣使用。

mployeeLoginVO.builder().id(employee.getId()).userN。。。。這樣方式

2.Service層

在sky-server模塊中,com.sky.service.impl.EmployeeServiceImpl

/*** 員工登錄** @param employeeLoginDTO* @return*/public Employee login(EmployeeLoginDTO employeeLoginDTO) {String username = employeeLoginDTO.getUsername();String password = employeeLoginDTO.getPassword();//1、根據用戶名查詢數據庫中的數據Employee employee = employeeMapper.getByUsername(username);//2、處理各種異常情況(用戶名不存在、密碼不對、賬號被鎖定)if (employee == null) {//賬號不存在throw new AccountNotFoundException(MessageConstant.ACCOUNT_NOT_FOUND);}//密碼比對if (!password.equals(employee.getPassword())) {//密碼錯誤throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);}if (employee.getStatus() == StatusConstant.DISABLE) {//賬號被鎖定throw new AccountLockedException(MessageConstant.ACCOUNT_LOCKED);}//3、返回實體對象return employee;}

3.Mapper層

在sky-server模塊中,com.sky.mapper.EmployeeMapper

package com.sky.mapper;import com.sky.entity.Employee;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;@Mapper
public interface EmployeeMapper {/*** 根據用戶名查詢員工* @param username* @return*/@Select("select * from employee where username = #{username}")Employee getByUsername(String username);}

注:可以通過斷點調試跟蹤后端程序的執行過程

3.2.5 nginx反向代理和負載均衡

對登錄功能測試完畢后,接下來,我們思考一個問題:前端發送的請求,是如何請求到后端服務的?

前端請求地址:http://localhost/api/employee/login

后端接口地址:http://localhost:8080/admin/employee/login

前端請求地址?后端接口地址

很明顯,兩個地址不一致,那是如何請求到后端服務的呢?

1). nginx反向代理

nginx 反向代理,就是將前端發送的動態請求由 nginx 轉發到后端服務器

那為什么不直接通過瀏覽器直接請求后臺服務端,需要通過nginx反向代理呢?

nginx 反向代理的好處:

  • 提高訪問速度

    因為nginx本身可以進行緩存,如果訪問的同一接口,并且做了數據緩存,nginx就直接可把數據返回,不需要真正地訪問服務端,從而提高訪問速度。

  • 進行負載均衡

    所謂負載均衡,就是把大量的請求按照我們指定的方式均衡的分配給集群中的每臺服務器。

  • 保證后端服務安全

    因為一般后臺服務地址不會暴露,所以使用瀏覽器不能直接訪問,可以把nginx作為請求訪問的入口,請求到達nginx后轉發到具體的服務中,從而保證后端服務的安全。

nginx 反向代理的配置方式:

server{listen 80;server_name localhost;location /api/{proxy_pass http://localhost:8080/admin/; #反向代理}
}

proxy_pass:該指令是用來設置代理服務器的地址,可以是主機名稱,IP地址加端口號等形式。

如上代碼的含義是:監聽80端口號, 然后當我們訪問 http://localhost:80/api/../..這樣的接口的時候,它會通過 location /api/ {} 這樣的反向代理到 http://localhost:8080/admin/上來。

接下來,進到nginx-1.20.2\conf,打開nginx配置

# 反向代理,處理管理端發送的請求
location /api/ {proxy_pass   http://localhost:8080/admin/;#proxy_pass   http://webservers/admin/;
}

當在訪問http://localhost/api/employee/login,nginx接收到請求后轉到http://localhost:8080/admin/,故最終的請求地址為http://localhost:8080/admin/employee/login,和后臺服務的訪問地址一致。

2). nginx 負載均衡

當如果服務以集群的方式進行部署時,那nginx在轉發請求到服務器時就需要做相應的負載均衡。其實,負載均衡從本質上來說也是基于反向代理來實現的,最終都是轉發請求。

nginx 負載均衡的配置方式:

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;#負載均衡}
}

upstream:如果代理服務器是一組服務器的話,我們可以使用upstream指令配置后端服務器組。

如上代碼的含義是:監聽80端口號, 然后當我們訪問 http://localhost:80/api/../..這樣的接口的時候,它會通過 location /api/ {} 這樣的反向代理到 http://webservers/admin,根據webservers名稱找到一組服務器,根據設置的負載均衡策略(默認是輪詢)轉發到具體的服務器。

注:upstream后面的名稱可自定義,但要上下保持一致。

nginx 負載均衡策略:

名稱說明
輪詢默認方式
weight權重方式,默認為1,權重越高,被分配的客戶端請求就越多
ip_hash依據ip分配方式,這樣每個訪客可以固定訪問一個后端服務
least_conn依據最少連接方式,把請求優先分配給連接數少的后端服務
url_hash依據url分配方式,這樣相同的url會被分配到同一個后端服務
fair依據響應時間方式,響應時間短的服務將會被優先分配

具體配置方式:

輪詢:

upstream webservers{server 192.168.100.128:8080;server 192.168.100.129:8080;
}

weight:

upstream webservers{server 192.168.100.128:8080 weight=90;server 192.168.100.129:8080 weight=10;
}

ip_hash:

upstream webservers{ip_hash;server 192.168.100.128:8080;server 192.168.100.129:8080;
}

least_conn:

upstream webservers{least_conn;server 192.168.100.128:8080;server 192.168.100.129:8080;
}

url_hash:

upstream webservers{hash &request_uri;server 192.168.100.128:8080;server 192.168.100.129:8080;
}

fair:

upstream webservers{server 192.168.100.128:8080;server 192.168.100.129:8080;fair;
}

3.3 完善登錄功能(使用MD5將密碼加密)

問題:員工表中的密碼是明文存儲,安全性太低。

解決思路:

  1. 將密碼加密后存儲,提高安全性

  2. 使用MD5加密方式對明文密碼加密

實現步驟:

  1. 修改數據庫中明文密碼,改為MD5加密后的密文

    打開employee表,修改密碼

  2. 修改Java代碼,前端提交的密碼進行MD5加密后再跟數據庫中密碼比對

    打開EmployeeServiceImpl.java,修改比對密碼

    /*** 員工登錄** @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;}

4. 導入接口文檔

接下來,就要進入到項目的業務開發了,而我們的開發方式就是基本當前企業主流的前后端分離開發方式,那么這種方式就要求我們之前需要先將接口定義好,這樣前后端人員才能并行開發,所以,這個章節就需要將接口文檔導入到管理平臺,為我們后面業務開發做好準備。其實,在真實的企業開發中,接口設計過程其實是一個非常漫長的過程,可能需要多次開會討論調整,甚至在開發的過程中才會發現某些接口定義還需要再調整,這種情況其實是非常常見的,但是由于項目時間原因,所以選擇一次性導入所有的接口,在開發業務功能過程當中,也會帶著大家一起來分析一下對應的接口是怎么確定下來的,為什么要這樣定義,從而培養同學們的接口設計能力。

4.1 前后端分離開發流程

第一步:定義接口,確定接口的路徑、請求方式、傳入參數、返回參數。

第二步:前端開發人員和后端開發人員并行開發,同時,也可自測。

第三步:前后端人員進行連調測試。

第四步:提交給測試人員進行最終測試。

4.2 操作步驟

將課程資料中提供的項目接口導入YApi。訪問地址:http://yapi.smart-xwork.cn/

1). 從資料中找到項目接口文件

2). 導入到YApi平臺

在YApi平臺創建出兩個項目

選擇蒼穹外賣-管理端接口.json導入

導入成功

另一個用戶端json文件也執行相同操作。

5. Swagger

5.1 介紹

Swagger 是一個規范和完整的框架,用于生成、描述、調用和可視化 RESTful 風格的 Web 服務(API Documentation & Design Tools for Teams | Swagger)。 它的主要作用是:

  1. 使得前后端分離開發更加方便,有利于團隊協作

  2. 接口的文檔在線自動生成,降低后端開發人員編寫接口文檔的負擔

  3. 功能測試

    Spring已經將Swagger納入自身的標準,建立了Spring-swagger項目,現在叫Springfox。通過在項目中引入Springfox ,即可非常簡單快捷的使用Swagger。

knife4j是為Java MVC框架集成Swagger生成Api文檔的增強解決方案,前身是swagger-bootstrap-ui,取名kni4j是希望它能像一把匕首一樣小巧,輕量,并且功能強悍!

目前,一般都使用knife4j框架。

5.2 使用步驟

  1. 導入 knife4j 的maven坐標

    在pom.xml中添加依賴

    <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId>
    </dependency>
  2. 在配置類中加入 knife4j 相關配置

    WebMvcConfiguration.java

    ```java
    /*** 通過knife4j生成接口文檔* @return
    */@Beanpublic 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;}
    ```

  3. 設置靜態資源映射,否則接口文檔頁面無法訪問

    WebMvcConfiguration.java

    /*** 設置靜態資源映射* @param registry
    */
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
  4. 訪問測試

    接口文檔訪問路徑為 http://ip:port/doc.html ---> http://localhost:8080/doc.html

    接口測試:測試登錄功能

思考:通過 Swagger 就可以生成接口文檔,那么我們就不需要 Yapi 了?

1、Yapi 是設計階段使用的工具,管理和維護接口

2、Swagger 在開發階段使用的框架,幫助后端開發人員做后端的接口測試

5.3 常用注解

通過注解可以控制生成的接口文檔,使接口文檔擁有更好的可讀性,常用注解如下:

注解說明
@Api用在類上,例如Controller,表示對類的說明
@ApiModel用在類上,例如entity、DTO、VO
@ApiModelProperty用在屬性上,描述屬性信息
@ApiOperation用在方法上,例如Controller的方法,說明方法的用途、作用

接下來,使用上述注解,生成可讀性更好的接口文檔

在sky-pojo模塊中

EmployeeLoginDTO.java

package com.sky.dto;import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import java.io.Serializable;@Data
@ApiModel(description = "員工登錄時傳遞的數據模型")
public class EmployeeLoginDTO implements Serializable {@ApiModelProperty("用戶名")private String username;@ApiModelProperty("密碼")private String password;}

EmployeeLoginVo.java

package com.sky.vo;import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "員工登錄返回的數據格式")
public class EmployeeLoginVO implements Serializable {@ApiModelProperty("主鍵值")private Long id;@ApiModelProperty("用戶名")private String userName;@ApiModelProperty("姓名")private String name;@ApiModelProperty("jwt令牌")private String token;}

在sky-server模塊中

EmployeeController.java

package com.sky.controller.admin;import com.sky.constant.JwtClaimsConstant;
import com.sky.dto.EmployeeLoginDTO;
import com.sky.entity.Employee;
import com.sky.properties.JwtProperties;
import com.sky.result.Result;
import com.sky.service.EmployeeService;
import com.sky.utils.JwtUtil;
import com.sky.vo.EmployeeLoginVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Map;/*** 員工管理*/
@RestController
@RequestMapping("/admin/employee")
@Slf4j
@Api(tags = "員工相關接口")
public class EmployeeController {@Autowiredprivate EmployeeService employeeService;@Autowiredprivate JwtProperties jwtProperties;/*** 登錄** @param employeeLoginDTO* @return*/@PostMapping("/login")@ApiOperation(value = "員工登錄")public Result<EmployeeLoginVO> login(@RequestBody EmployeeLoginDTO employeeLoginDTO) 	{//..............}/*** 退出** @return*/@PostMapping("/logout")@ApiOperation("員工退出")public Result<String> logout() {return Result.success();}}

啟動服務:訪問http://localhost:8080/doc.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387295.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387295.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387295.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

7 用戶和用戶組

7.1 用戶配置文件 7.1.1 用戶信息文件 /etc/passwd man 5 passwd 查看配置文件功能 第1字段&#xff1a; 用戶名稱 第2字段&#xff1a; 密碼標志 X代表有密碼 如果用戶沒有密碼&#xff0c;則只允許本地登錄 第3字段&#xff1a; UID&#xff08;用戶ID&#xff09; 0…

C#調用Python模塊

編程&#xff1a;C#調用Python模塊 當下&#xff0c;C#與Python都是比較熱門的計算機編程語言&#xff0c;他們各有優缺點&#xff0c;如果能讓他們互相配合工作&#xff0c;那是多么美好的事情&#xff0c;今天我來講解一下如何利用C#來調用Python。 如果讓C#支持調用Python模…

面試簡單整理之克隆

61.為什么要使用克隆&#xff1f; 克隆獲取對象的副本&#xff0c;直接用復制還是一個引用。 62.如何實現對象克隆&#xff1f; 1.被clone的類實現cloneable接口&#xff0c;重寫object類的clone&#xff08;&#xff09;方法 2.如果深克隆則克隆對象的引用對象也要實現接口、重…

8 權限管理

8.1 ACL權限 8.1.1 簡介與開啟 用于解決身份不夠用的問題 ACL(access control list) 訪問控制表 ACL是存在于計算機中的一張表&#xff0c;它使操作系統明白每個用戶對特定系統對象&#xff0c;例如文件目錄或單個文件的存取權限。 這張表對于每個系統用戶有擁有一個訪問…

windows下GitHub的SSH Key 配置

https://www.jianshu.com/p/9317a927e844轉載于:https://www.cnblogs.com/lishidefengchen/p/10481889.html

PyCharm調試錯誤

JetBrains PyCharm 2017.3.2 這就說明python.exe的環境沒有配&#xff0c;點擊藍色的configure Python Interpreter&#xff0c;然后選擇對應的路徑就可以了

Java06集合

13 集合 實現方法時&#xff0c;不同的數據結構會導致性能有很大差異。 13.1 集合接口 Java集合類庫將接口&#xff08;interface&#xff09;與實現&#xff08;implementation&#xff09;分離。 可以使用接口類型存放集合的應用&#xff0c;一旦改變了想法&#xff0c;可…

Tensorflow驗證碼識別應用

簡單的Tensorflow驗證碼識別應用&#xff0c;供大家參考&#xff0c;具體內容如下 1.Tensorflow的安裝方式簡單,在此就不贅述了. 2.訓練集訓練集以及測試及如下(純手工打造,所以數量不多): 3.實現代碼部分(參考了網上的一些實現來完成的) main.py(主要的神經網絡代碼) ?123456…

9 文件系統管理

9.1 回顧分區和文件系統 分區類型 主分區&#xff1a;總共最多只能分四個 擴展分區&#xff1a;只能有一個&#xff0c;主分區加擴展分區最多有四個&#xff0c;必須再劃分成邏輯分區才能使用。 邏輯分區&#xff1a;在擴展分區中劃分的 IDE硬盤最多支持59個邏輯分區 SCSI…

Linux 桌面玩家指南:09. X Window 的奧秘

Linux 桌面玩家指南&#xff1a;09. X Window 的奧秘 原文:Linux 桌面玩家指南&#xff1a;09. X Window 的奧秘特別說明&#xff1a;要在我的隨筆后寫評論的小伙伴們請注意了&#xff0c;我的博客開啟了 MathJax 數學公式支持&#xff0c;MathJax 使用$標記數學公式的開始和結…

Storm教程1理論介紹

流式計算的歷史: 早在7、8年前諸如UC伯克利、斯坦福等大學就開始了對流式數據處理的研究&#xff0c;但是由于更多的關注于金融行業的業務場景或者互聯網流量監控的業務場景&#xff0c;以及當時互聯網數據場景的限制&#xff0c;造成了研究多是基于對傳統數據庫處理的流式化&…

梯度下降原理及Python實現

梯度下降算法是一個很基本的算法&#xff0c;在機器學習和優化中有著非常重要的作用&#xff0c;本文首先介紹了梯度下降的基本概念&#xff0c;然后使用python實現了一個基本的梯度下降算法。梯度下降有很多的變種&#xff0c;本文只介紹最基礎的梯度下降&#xff0c;也就是批…

dagger2的初次使用

一、使用前準備 1、打開app的build.gradle文件&#xff1a; 頂部停用apt插件&#xff1a; //添加如下代碼&#xff0c;應用apt插件 apply plugin: com.neenbedankt.android-apt dependencies中添加依賴&#xff1a; //Dagger2compile com.google.dagger:dagger:2.4apt com.goog…

Storm教程2安裝部署

Storm 安裝部署 部署Storm集群需要依次完成的安裝步驟&#xff1a; 1.安裝jdk6及以上版本;   2. 搭建Zookeeper集群&#xff1b;   3. 安裝Storm依賴庫&#xff1b;   4. 下載并解壓Storm發布版本&#xff1b;   5. 修改storm.yaml配置文件&#xff1b;   6…

matplotlib一些常用知識點的整理,

本文作為學習過程中對matplotlib一些常用知識點的整理&#xff0c;方便查找。 強烈推薦ipython 無論你工作在什么項目上&#xff0c;IPython都是值得推薦的。利用ipython --pylab&#xff0c;可以進入PyLab模式&#xff0c;已經導入了matplotlib庫與相關軟件包&#xff08;例如…

JAVA課程09

package 月份輸出;import java.util.*;public class 月份輸出 {public static void main(String[] args) {// TODO Auto-generated method stubScanner sc new Scanner(System.in);int s sc.nextInt();String a[] {"January","February","March&q…

Storm教程3編程接口

Spouts Spout是Stream的消息產生源&#xff0c;Spout組件的實現可以通過繼承BaseRichSpout類或者其他Spout類來完成&#xff0c;也可以通過實現IRichSpout接口來實現。 需要根據情況實現Spout類中重要的幾個方法有&#xff1a; open方法 當一個Task被初始化的時候會調用此…

梳理操作系統概論

1、用一張圖總結操作系統的結構、功能特征、采用的技術和提供服務方式等。 2、用一張圖描述CPU的工作原理。 3、用一張圖描述系統程序與應用程序、特權指令與非特權指令、CPU狀態、PSW及中斷是如何協同工作的&#xff1f; 轉載于:https://www.cnblogs.com/ljgljg/p/10503190.ht…

機器學習01簡介

Machine Learning 是人工智能的核心&#xff0c;主要使用歸納、綜合而不是演繹。 讓計算機模擬人類行為&#xff0c;以獲取新的知識或技能 重新組織已有的知識結構使之不斷改善自身性能 一個程序能從經驗 E 中學習&#xff0c;解決任務 T&#xff0c;達到性能度量值P&#xf…

位置指紋法的實現(KNN)

基本原理 位置指紋法可以看作是分類或回歸問題&#xff08;特征是RSS向量&#xff0c;標簽是位置&#xff09;&#xff0c;監督式機器學習方法可以從數據中訓練出一個從特征到標簽的映射關系模型。kNN是一種很簡單的監督式機器學習算法&#xff0c;可以用來做分類或回歸。 對于…