1.Maven 創建 Spring Boot 項目:
主要使用 Maven 創建 Spring Boot 項目、配置 MySQL 數據庫、回顧 Spring Boot 分層架構、使用 MyBatis 逆向工程生成代碼及整合測試項目等內容,具體如下:
- Maven 創建 Spring Boot 項目
- 可通過 IDEA 直接創建,高版本 IDEA 若想使用低版本 JDK,也可借助阿里云國服地址(https://start.aliyun.com/)間接創建,創建時可預先選擇如 MySQL 驅動、Spring Web 等必要依賴。
- 項目創建成功后,運行時若出現數據庫連接錯誤,可先注釋屏蔽 pom.xml 中的 Mybatis 依賴。當控制臺顯示 Tomcat 在 8080 端口啟動且項目啟動時間等信息時,表明項目創建成功。
- MySQL 數據庫配置
- 可通過導入 example.sql 文件,或手動新建數據庫及用戶表(包含 name、pwd、userimg 等字段)來準備數據庫。
- Spring Boot 2.0 以后默認使用 Hikari 連接池,在 application.properties 中需配置數據源信息,包括驅動類、數據庫 URL(高版本 MySQL 需設置時區參數)、用戶名、密碼及連接池相關參數(如最小空閑連接數、最大連接數等)。配置完成后,可恢復之前屏蔽的 Mybatis 依賴。
- Spring Boot 分層架構回顧
- pojo 層:定義與數據庫對應的屬性,提供 get/set 方法、構造方法等。
- dao 層:通過接口訪問數據庫,具體實現寫在 mapper.xml 中。
- service 層:調用 dao 層接口,先設計接口再實現,完成業務邏輯。
- controller 層:負責前后端交互,接收前端請求并調用 service 層,返回響應數據。
- MyBatis 逆向工程
- 在 pom.xml 中配置 mybatis-generator 插件及 MySQL 驅動依賴,指定 generatorConfig.xml 文件位置。
- 在 generatorConfig.xml 中配置 pojo 類、mapper.xml 映射文件、持久層接口的生成路徑,以及數據庫連接信息和表名。執行插件后自動生成相關文件,需注意避免反復執行導致 sql 語句重復報錯。
- 整合測試項目
- 創建 service 和 controller 文件,在 application.properties 中配置 mybatis mapper 文件路徑。
- 在啟動類中添加 @MapperScan 注解掃描 dao 層包,在 dao 接口和 mapper.xml 中定義并實現查詢方法,service 層實現接口調用 dao 層,controller 層通過 service 層處理請求。啟動項目后,通過訪問指定 URL(如http://localhost:8081/admin/find)測試功能。
2.登錄、MD5 加密及攔截器:
?Spring Boot 項目中登錄功能實現、MD5 加密及攔截器配置,具體內容如下:
- 熱部署配置
- 在
application.properties
中添加配置spring.thymeleaf.cache=false
,實現修改 HTML 頁面后無需重啟項目,刷新即可生效。 - 同時需在 IDEA 設置中開啟相關編譯選項,確保熱部署功能正常使用。
- 在
- 前端 UI 框架與頁面結構
- 采用 LayUI 作為前端框架,在
resources/static
目錄下組織 CSS、JS、圖片等靜態資源,登錄頁面和后臺主頁分別為login.html
和index.html
,存放于templates/admin
目錄。
- 采用 LayUI 作為前端框架,在
- Controller 層處理登錄邏輯
- 通過
@GetMapping
映射/userlogin
、/
等路徑,返回登錄頁面;映射/sys_index
返回后臺主頁。 @PostMapping("/userlogin")
接收前端提交的用戶名和密碼,校驗非空后調用auserService.login()
方法,并根據返回結果跳轉頁面或提示錯誤。
- 通過
- Dao 層與 Service 層實現登錄驗證
- Dao 層:在
AuserMapper.java
中定義login
方法,接收用戶名和密碼參數;AuserMapper.xml
中編寫 SQL 語句,根據用戶名和密碼查詢用戶信息。 - Service 層:
AuserService.java
定義userlogin
接口,AuserServiceImpl.java
實現時對密碼進行 MD5 加密(調用MD5Util.MD5Encode
),再調用 Dao 層方法查詢用戶。
- Dao 層:在
- 攔截器實現登錄狀態校驗
- 攔截器類:
AdminLoginInterceptor
實現HandlerInterceptor
,在preHandle
方法中檢查請求路徑是否以/admin
開頭且 session 中無用戶信息,若未登錄則重定向到登錄頁面并提示錯誤。 - 配置類:
MyWebMvcConfigurer
通過@Configuration
標記,注冊攔截器并指定攔截路徑(/admin/**
),排除登錄接口/admin/userlogin
,確保未登錄用戶無法訪問后臺頁面。
- 攔截器類:
3.退出功能、驗證碼登錄及用戶信息修改:
?Spring Boot 項目中退出功能、驗證碼登錄及用戶信息(含密碼)修改的實現,具體內容如下:
- 退出系統實現
- 在
AuserController
中通過@GetMapping("/logout")
映射退出路徑,調用session.invalidate()
銷毀會話,并重定向到登錄頁面。
- 在
- 驗證碼登錄功能
- 依賴配置:引入 Hutool 工具庫的驗證碼模塊
hutool-captcha
(版本 5.8.7),用于生成和驗證圖片驗證碼。 - 驗證碼生成:創建
VerifyCodeController
,通過CaptchaUtil.createShearCaptcha
生成驗證碼圖片,將驗證碼存入 Session 并輸出圖片流,響應頭設置禁止緩存。 - 前端集成:在
login.html
中添加驗證碼輸入框和圖片組件,點擊圖片可刷新驗證碼,引入 LayUI 組件進行表單驗證。 - 后端驗證:修改登錄接口
@PostMapping("/userlogin")
,增加驗證碼參數校驗,從 Session 中獲取驗證碼并調用verify
方法驗證,驗證失敗則返回錯誤提示。
- 依賴配置:引入 Hutool 工具庫的驗證碼模塊
- 用戶信息修改
- 基礎信息展示:在用戶登錄成功后,將用戶名、密碼、頭像地址存入 Session,
index.html
通過th:src
獲取頭像地址并顯示,默認頭像存放在static/images/user.jpg
,數據庫auser
表userimg
字段默認值設為該路徑。 - 密碼修改邏輯:
- 舊密碼驗證:通過
@GetMapping("/password")
接口接收舊密碼,從 Session 獲取系統存儲的 MD5 密碼,加密輸入的舊密碼后進行比對,返回驗證結果。 - 信息更新:Service 層定義
updateUser
方法,調用 MyBatis 自動生成的updateByPrimaryKeySelective
接口更新用戶信息;Controller 層接收新密碼,加密后調用 Service 層方法完成更新。
- 舊密碼驗證:通過
- 頁面跳轉:通過
@GetMapping("/userInfo")
映射用戶信息編輯頁面userInfo-edit.html
,提供修改入口。
- 基礎信息展示:在用戶登錄成功后,將用戶名、密碼、頭像地址存入 Session,
4.修改頭像:
?Spring Boot 項目中修改頭像的文件上傳功能實現、靜態資源配置、上傳驗證及部門管理增刪改查示例,具體內容如下:
- 文件上傳工具類
- 定義
UploadFileUtils.java
,包含三個方法:getSuffixName
獲取文件后綴、getNewFileName
生成 “當前時間 + 隨機數 + 后綴” 的新文件名、getHost
獲取服務器主機名,用于處理文件上傳的基礎操作。
- 定義
- 文件上傳邏輯實現
- 控制器處理:
AuserController
的@PostMapping("/upload/userImg")
接收文件,調用工具類生成新文件名,在本地或服務器創建upload
文件夾,通過file.transferTo
保存文件,并生成可訪問的 URL(如http://localhost:8081/upload/xxx.jpg
)存入數據庫,同時更新 Session 中的頭像地址。
- 控制器處理:
- 靜態資源映射配置
- 在
MyWebMvcConfigurer
中通過addResourceHandlers
配置,將/upload/**
路徑映射到本地存儲位置(file:upload/
),確保前端可通過 URL 訪問上傳的圖片資源。
- 在
- 上傳功能驗證與配置
- 打包運行:項目打包為 JAR 文件(如
example-1.0.jar
)后,通過命令行java -jar
運行,脫離 IDEA 驗證圖片上傳和顯示效果。 - 文件大小限制:在
application.properties
中配置單個文件最大 10MB、總文件最大 30MB,避免大文件上傳導致性能問題。
- 打包運行:項目打包為 JAR 文件(如
- 部門管理增刪改查示例
- 數據庫表:新建
department
部門表,包含id
、dname
、dtel
等字段,用于演示業務操作。 - 逆向工程:重新配置 Mybatis-generator,根據
department
表自動生成對應的 pojo、dao、mapper.xml 文件,注意確保數據庫中無同名表以免沖突。
- 數據庫表:新建
5.分頁查詢:
Spring Boot 項目中基于 Layui 實現部門管理的分頁查詢功能,具體內容如下:
- 分頁基礎配置
- 前端與控制器:創建部門列表頁面
department-list.html
,通過DepartmentController
的@GetMapping("/department")
映射訪問該頁面。 - Layui 參數:Layui 表格默認請求
page
(當前頁)和limit
(每頁記錄數)參數,點擊分頁按鈕時以 GET 方式傳遞這兩個參數。
- 前端與控制器:創建部門列表頁面
- SQL 分頁邏輯
- 查詢語句:使用
LIMIT
實現分頁,公式為LIMIT limit*(page-1), limit
,例如查詢從第 3 條開始的 10 條記錄為LIMIT 2, 10
。
- 查詢語句:使用
- 后端處理流程
- 控制器:
@GetMapping("/department/listall")
接收包含page
和limit
的參數 Map,計算起始索引start=(page-1)*limit
,調用 Service 層方法處理分頁請求。 - 返回格式:遵循 Layui 表格的異步返回格式,定義
Result
類包含code
(狀態碼)、msg
(提示信息)、count
(總記錄數)、data
(當前頁數據)。
- 控制器:
- Mapper 與 Service 層實現
- Mapper 接口:
findDepartmentList
方法執行分頁查詢,getTotalDepartments
方法統計總記錄數。 - Mapper XML:編寫 SQL 語句,
findDepartmentList
使用LIMIT #{start},#{limit}
分頁,getTotalDepartments
使用COUNT(*)
統計總數。 - Service 實現:
getDepartmentsList
方法調用 Mapper 獲取分頁數據和總記錄數,組裝成Result
對象返回,滿足 Layui 表格的數據格式要求。
- Mapper 接口:
- 時間格式處理
- 在實體類
Department.java
的時間字段establishmentdate
上添加@JsonFormat
注解,設置格式為yyyy-MM-dd HH:mm:ss
,時區為GMT+8
,確保前端正確顯示時間格式。
- 在實體類
6.模糊查詢:
Spring Boot 項目中基于部門名稱的模糊查詢功能實現,結合分頁邏輯與 SQL 注入安全說明,具體內容如下:
- Mapper 層 SQL 配置
- 模糊查詢語句:在
DepartmentMapper.xml
中定義findDepartmentListByName
方法,使用like '%${dname}%'
實現部門名稱(dname)的模糊查詢,按創建時間倒序排列并添加分頁參數limit #{start},#{limit}
;同時定義getTotalDepartmentsByName
方法統計符合條件的總記錄數。 - SQL 注入風險:對比
${}
與#{}
的安全性,${}
直接拼接參數易導致 SQL 注入(如用戶輸入惡意字符),而#{}
通過預編譯防止攻擊,但此處因模糊查詢需動態拼接百分號,故使用${}
并強調其安全風險。
- 模糊查詢語句:在
- 接口與方法定義
- Mapper 接口:
DepartmentMapper.java
中聲明findDepartmentListByName
(接收 dname、start、limit 參數)和getTotalDepartmentsByName
(接收 dname 參數)方法。 - Service 層:
DepartmentService.java
定義getDepartmentsListByName
接口,DepartmentServiceImpl.java
實現時調用 Mapper 獲取模糊查詢結果和總記錄數,組裝成 Layui 表格所需的Result
對象格式。
- Mapper 接口:
- 控制器處理
DepartmentController.java
的listByName
方法通過@GetMapping("/department/listbyname")
接收包含page
、limit
(分頁參數)和dname
(查詢關鍵詞)的參數 Map,計算起始索引后調用 Service 層方法處理請求并返回結果。
7.添加:
Spring Boot 項目中部門管理模塊的添加功能實現,包括刷新頁面校驗、唯一性約束設置、各層代碼實現及參數接收方式,具體內容如下:
- 刷新頁面校驗
- 在
AuserController
中通過@GetMapping("/reload")
定義刷新接口,檢查 Session 中是否存在用戶名name
,存在則返回true
,用于驗證用戶登錄狀態。
- 在
- 唯一性約束設置
- 為避免部門名稱重復,對數據庫
department
表的dname
字段添加唯一性索引(UNIQUE),確保數據完整性。
- 為避免部門名稱重復,對數據庫
- 添加功能各層實現
- 控制器層:
@GetMapping("/department/add")
跳轉至部門添加頁面department-add.html
。@PostMapping("/department/add")
支持三種參數接收方式:通過@RequestParam
逐個獲取參數、接收Map
鍵值對、使用@RequestBody
接收 JSON 格式數據(需前端調整提交格式為 JSON)。
- 服務層:
DepartmentService
定義addDepartment
接口,實現類中調用DepartmentMapper
的insertSelective
方法插入數據,根據插入結果返回操作成功或失敗的Result
對象。 - 持久層:利用 MyBatis 逆向工程生成的
insertSelective
方法,支持選擇性插入部門數據(非空字段才插入)。
- 控制器層:
- 前端參數提交調整
- 當使用
@RequestBody
接收 JSON 數據時,前端頁面需將表單數據通過JSON.stringify
轉換為 JSON 格式,并設置請求頭contentType
為application/json
。
- 當使用
8.刪除和修改:
Spring Boot 項目中部門管理模塊的刪除和修改功能實現,具體內容如下:
- 刪除功能實現
- 持久層(Mapper):使用 MyBatis 逆向工程生成的
deleteByPrimaryKey
方法,修改返回類型為boolean
,通過主鍵 ID 刪除部門記錄。 - 服務層(Service):
DepartmentService
定義deleteById
接口,實現類中調用deleteByPrimaryKey
,根據刪除結果返回包含狀態碼和提示信息的Result
對象。 - 控制器層(Controller):
@PostMapping("/department/delete")
接收前端傳遞的部門 ID,調用服務層刪除方法并返回結果。
- 持久層(Mapper):使用 MyBatis 逆向工程生成的
- 修改功能實現
- 顯示待修改部門信息:
- 控制器:
@GetMapping("/department/edit")
通過 ID 獲取部門信息,若 ID 存在則將數據存入Model
,傳遞到編輯頁面department-edit.html
。 - 服務層:
getDepartmentById
方法調用 MyBatis 的selectByPrimaryKey
,根據 ID 查詢部門詳情。
- 控制器:
- 提交修改信息:
- 持久層:使用
updateByPrimaryKeySelective
方法,支持選擇性更新部門字段(僅更新非空屬性)。 - 服務層:
saveDepartment
接口接收修改后的部門對象,調用updateByPrimaryKeySelective
并返回操作結果。 - 控制器層:
@PostMapping("/department/edit")
接收前端參數,更新部門對象的名稱、電話、描述等信息,調用服務層完成修改。
- 持久層:使用
- 顯示待修改部門信息:
以上功能通過各層協作,實現了基于主鍵的部門刪除和動態字段修改,確保數據操作的準確性和完整性。
9.崗位管理:
Spring Boot 項目中崗位管理模塊的增刪改查功能實現,基于 MyBatis 逆向工程生成基礎代碼,結合分頁、模糊查詢等邏輯,具體內容如下:
1.?數據庫表與逆向工程
- 崗位表結構:新建
post
表,包含id
(主鍵)、pname
(崗位名稱)、ptype
(崗位類型)、organization
(所屬機構)等字段,其中pname
設置唯一性約束避免重復。 - 逆向工程配置:重新配置 MyBatis-Generator,自動生成
post
表對應的pojo
、dao
、mapper.xml
文件,簡化基礎代碼開發。
2.?分頁查詢
- 前端與控制器:創建崗位列表頁面
post-list.html
,PostController
通過@GetMapping("/post")
跳轉頁面,@GetMapping("/post/listall")
接收page
(當前頁)和limit
(每頁記錄數)參數,計算起始索引start=(page-1)*limit
,調用 Service 層處理分頁邏輯。 - Mapper 與 Service:
PostMapper
定義findPostList
(分頁查詢)和getTotalPosts
(統計總數)方法,XML 中使用LIMIT #{start},#{limit}
和COUNT(*)
實現分頁和計數;Service 層組裝符合 Layui 表格格式的Result
對象(包含code
、msg
、count
、data
)返回前端。
3.?模糊查詢
- 按崗位名稱查詢:
PostMapper.xml
中使用like '%${pname}%'
實現模糊查詢,PostMapper
聲明findPostListByName
和getTotalPostsByName
方法;Service 層和 Controller 層接收查詢關鍵詞pname
,結合分頁參數完成模糊查詢并返回結果。
4.?刪除功能
- 主鍵刪除:利用 MyBatis 生成的
deleteByPrimaryKey
方法,通過主鍵id
刪除崗位記錄;Service 層封裝刪除結果為Result
對象,Controller 層接收id
參數并調用 Service 層方法執行刪除。
5.?新增功能
- 唯一性校驗:數據庫對
pname
字段添加唯一索引(UNIQUE),避免重復崗位名稱。 - 數據插入:
PostController
跳轉添加頁面post-add.html
,接收前端參數創建Post
對象,調用 Service 層addPost
方法,通過insertSelective
選擇性插入非空字段數據。
6.?修改功能
- 顯示待修改信息:
PostController
通過@GetMapping("/post/edit")
獲取崗位id
,調用 Service 層getPostById
(基于selectByPrimaryKey
)查詢詳情,存入Model
傳遞到編輯頁面post-edit.html
。 - 提交修改:前端提交修改后,Controller 層更新
Post
對象的pname
、ptype
等字段,調用 Service 層savePost
方法,通過updateByPrimaryKeySelective
選擇性更新數據庫記錄。
核心邏輯總結
- 分層協作:各功能均遵循 “Controller 接收請求→Service 處理業務→Mapper 操作數據庫” 的分層架構,利用 MyBatis 逆向工程生成的基礎方法(如
selectByPrimaryKey
、insertSelective
)簡化開發。 - 參數處理:分頁、模糊查詢、增刪改操作均通過
@RequestParam
或Map
接收參數,確保前端與后端數據格式匹配,同時通過Result
類統一返回格式,滿足 Layui 組件的異步數據要求。
10.創建員工表后的崗位查詢:
Spring Boot 項目中創建員工表后,如何通過關聯查詢實現崗位編制人數(員工數量)的統計與顯示,具體內容如下:
- 數據庫表結構與外鍵設置
- 員工表(staff):創建或導入
staff
表,設置兩個外鍵索引,depart_id
關聯department
表的id
(部門外鍵),post_id
關聯post
表的id
(崗位外鍵),通過外鍵約束確保數據一致性。 - 崗位表(post):
organization
字段(編制人數)默認值為 0,需通過員工表中post_id
相同的記錄數重新賦值。
- 員工表(staff):創建或導入
- MyBatis 逆向工程與代碼生成
- 重新配置 MyBatis-Generator,自動生成
staff
表對應的pojo
、dao
、mapper.xml
文件,為后續數據操作提供基礎接口。
- 重新配置 MyBatis-Generator,自動生成
- 崗位編制人數統計邏輯
- 持久層(Mapper):在
StaffMapper.xml
中定義getSamePostTotal
方法,通過SELECT COUNT(*)
統計staff
表中特定post_id
的員工數量;PostMapper
使用updateByPrimaryKeySelective
方法更新崗位表的organization
字段。 - 服務層(Service):修改
PostServiceImpl
的getPostsList
方法,遍歷崗位列表,調用staffMapper.getSamePostTotal(post.getId())
獲取每個崗位的員工數,存入post
對象的organization
屬性,并更新崗位信息到數據庫。
- 持久層(Mapper):在
- 數據關聯與更新流程
- 通過崗位表與員工表的
post_id
外鍵關聯,實現 “崗位編制人數 = 該崗位員工總數” 的統計邏輯,確保崗位列表顯示的編制人數實時反映員工表中的關聯數據。
- 通過崗位表與員工表的
11.員工管理:
?
Spring Boot 項目中員工管理模塊的實現,包括分頁查詢、詳情查看、信息修改等功能,通過關聯部門和崗位表實現數據整合與顯示,具體內容如下:
1.?分頁查詢與數據關聯
- 實體類擴展:在
Staff.java
中添加departname
(部門名)和postname
(崗位名)屬性(無數據庫對應字段,僅用于前端顯示),并提供get/set
方法。 - 控制器與服務層:
StaffController
通過@GetMapping("/staff/listall")
接收分頁參數page
和limit
,調用staffService.getStaffsList
處理分頁邏輯。StaffServiceImpl
中,先通過staffMapper.findStaffList
獲取分頁員工數據,再遍歷每個員工,根據departId
和postId
查詢對應的部門(departmentMapper.selectByPrimaryKey
)和崗位(postMapper.selectByPrimaryKey
)名稱,設置到員工對象中,并根據enddate
判斷員工狀態(“轉正” 或 “試用期”)。
- 持久層:
StaffMapper.xml
定義分頁查詢findStaffList
和總數統計getTotalStaffs
方法,使用LIMIT
和COUNT(*)
實現分頁邏輯。
2.?詳情頁顯示與時間格式處理
- 時間格式注解:在
Staff.java
中對birthday
、entrydate
等時間字段添加@JsonFormat
注解,指定格式為yyyy-MM-dd
,時區為GMT+8
,確保前端正確顯示日期。 - 詳情查詢邏輯:
StaffController
的staffView
方法通過員工id
查詢員工信息,關聯部門和崗位表獲取名稱,存入Model
后跳轉至詳情頁staff-view
。
3.?員工信息修改功能
- 編輯頁面數據準備:
StaffController
的gotostaffEdit
方法獲取員工信息后,查詢所有部門(departmentService.getDepartmentList
)和崗位(postService.getPostsList
),并準備性別、民族、學歷等下拉列表數據,傳遞到編輯頁面staff-edit
。- 部門和崗位列表通過
DepartmentService
和PostService
的getDepartmentList
、getPostsList
方法獲取,底層調用mapper
的全量查詢。
- 數據提交與更新:
- 前端以 JSON 格式提交修改數據,
StaffController
通過@PostMapping("/staff/edit")
接收參數,使用SimpleDateFormat
解析日期字段(如birthday
、entrydate
),轉換為java.sql.Date
后更新員工對象。 StaffServiceImpl
調用staffMapper.updateByPrimaryKeySelective
實現選擇性更新,返回操作結果。
- 前端以 JSON 格式提交修改數據,
核心邏輯與技術點
- 外鍵關聯查詢:通過員工表的
departId
和postId
外鍵,關聯部門表和崗位表,實現 “員工 - 部門 - 崗位” 三級數據聯動,確保前端顯示完整信息。 - 狀態動態判斷:根據員工試用期結束日期
enddate
與當前時間的對比,動態設置員工狀態(“轉正” 或 “試用期”),增強業務邏輯的自動化。 - 分層架構協作:遵循 “Controller(請求處理)→ Service(業務邏輯)→ Mapper(數據庫操作)” 分層模式,利用 MyBatis 的
selectByPrimaryKey
和updateByPrimaryKeySelective
等方法簡化數據操作。
通過以上實現,員工管理模塊實現了數據的分頁展示、詳情查看、動態狀態判斷及復雜表單編輯,確保了前端與后端的數據一致性和操作便捷性。