前言
??博主介紹:?CSDN特邀作者、985計(jì)算機(jī)專(zhuān)業(yè)畢業(yè)、某互聯(lián)網(wǎng)大廠高級(jí)全棧開(kāi)發(fā)程序員、碼云/掘金/華為云/阿里云/InfoQ/StackOverflow/github等平臺(tái)優(yōu)質(zhì)作者、專(zhuān)注于Java、小程序、前端、python等技術(shù)領(lǐng)域和畢業(yè)項(xiàng)目實(shí)戰(zhàn),以及程序定制化開(kāi)發(fā)、全棧講解、就業(yè)輔導(dǎo)、面試輔導(dǎo)、簡(jiǎn)歷修改。???
???? 精彩專(zhuān)欄 推薦訂閱????
2023-2024年最值得選的微信小程序畢業(yè)設(shè)計(jì)選題大全:100個(gè)熱門(mén)選題推薦?2023-2024年最值得選的Java畢業(yè)設(shè)計(jì)選題大全:500個(gè)熱門(mén)選題推薦?
Java精品實(shí)戰(zhàn)案例《500套》文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-853423.html
微信小程序項(xiàng)目精品案例《500套》
Java核心技術(shù)精選
Java框架精選
??文末獲取源碼+數(shù)據(jù)庫(kù)??
感興趣的可以先收藏起來(lái),還有大家在畢設(shè)選題,項(xiàng)目以及論文編寫(xiě)等相關(guān)問(wèn)題都可以給我留言咨詢,希望幫助更多的人
詳細(xì)視頻演示
請(qǐng)聯(lián)系我獲取更詳細(xì)的演示視頻
具體實(shí)現(xiàn)截圖
技術(shù)棧
后端框架SSM
SSM框架是一種基于Spring、Spring MVC和MyBatis的開(kāi)發(fā)框架,它們分別負(fù)責(zé)不同的功能模塊,共同構(gòu)建了一個(gè)完整的Java Web應(yīng)用程序。下面是對(duì)SSM框架的三個(gè)組成部分的簡(jiǎn)要介紹:
-
Spring框架:Spring是一個(gè)輕量級(jí)的Java開(kāi)發(fā)框架,提供了廣泛的功能,包括依賴注入、面向切面編程(AOP)、事務(wù)管理等。Spring的核心容器管理了應(yīng)用程序中的對(duì)象,使得對(duì)象之間的依賴關(guān)系更加清晰,并且降低了耦合度。
-
Spring MVC框架:Spring MVC是Spring框架的一部分,用于構(gòu)建Web應(yīng)用程序。它基于MVC(Model-View-Controller)設(shè)計(jì)模式,將應(yīng)用程序分為模型(Model)、視圖(View)和控制器(Controller)三層。模型負(fù)責(zé)處理業(yè)務(wù)邏輯,視圖負(fù)責(zé)展示數(shù)據(jù),控制器負(fù)責(zé)處理用戶請(qǐng)求和調(diào)度邏輯。
-
MyBatis框架:MyBatis是一個(gè)持久層框架,它簡(jiǎn)化了與數(shù)據(jù)庫(kù)的交互過(guò)程。通過(guò)配置映射文件,開(kāi)發(fā)人員可以將Java對(duì)象映射到數(shù)據(jù)庫(kù)表中,并且可以通過(guò)SQL語(yǔ)句進(jìn)行數(shù)據(jù)庫(kù)操作。MyBatis提供了一種優(yōu)雅的方式來(lái)管理數(shù)據(jù)庫(kù)訪問(wèn)代碼,并且能夠很好地與Spring集成。
SSM框架的優(yōu)點(diǎn)包括靈活性高、配置簡(jiǎn)單、易于學(xué)習(xí)和使用等。它們的結(jié)合使得開(kāi)發(fā)人員可以快速搭建起一個(gè)穩(wěn)定、高效的Java Web應(yīng)用程序。
下面是核心代碼的示例:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class HelloWorldApplication {
public static void main(String[] args) {
SpringApplication.run(HelloWorldApplication.class, args);
}
@GetMapping("/hello")
public String helloWorld() {
return "Hello, World!";
}
}
這段代碼定義了一個(gè)Spring Boot應(yīng)用程序的入口類(lèi)HelloWorldApplication
,使用@SpringBootApplication
注解標(biāo)記為一個(gè)Spring Boot應(yīng)用程序,并使用@RestController
注解將該類(lèi)標(biāo)記為一個(gè)RESTful控制器。
在控制器中,我們定義了一個(gè)helloWorld
方法,并使用@GetMapping
注解將該方法映射到"/hello"路徑,當(dāng)訪問(wèn)該路徑時(shí),該方法會(huì)返回一個(gè)簡(jiǎn)單的字符串"Hello, World!"作為響應(yīng)。
通過(guò)SpringApplication.run
方法啟動(dòng)應(yīng)用程序后,Spring Boot會(huì)自動(dòng)配置并啟動(dòng)內(nèi)嵌的服務(wù)器,我們可以通過(guò)訪問(wèn)"http://localhost:8080/hello"來(lái)調(diào)用helloWorld
方法,并得到"Hello, World!"作為響應(yīng)。
這個(gè)示例展示了一個(gè)最簡(jiǎn)單的Spring Boot應(yīng)用程序,你可以根據(jù)自己的需求進(jìn)一步擴(kuò)展和定制代碼。希望這個(gè)示例能幫助你更好地理解Spring Boot的核心代碼。
前端框架Vue
Vue.js是一種流行的JavaScript框架,它具有許多優(yōu)勢(shì)。其中,Vue.js的核心優(yōu)勢(shì)之一是虛擬DOM技術(shù)。虛擬DOM是一個(gè)內(nèi)存中的數(shù)據(jù)結(jié)構(gòu),它在實(shí)現(xiàn)高效的DOM操作方面發(fā)揮了重要作用。
Vue.js采用了響應(yīng)式數(shù)據(jù)綁定、虛擬DOM、組件化等現(xiàn)代化技術(shù),為開(kāi)發(fā)者提供了一種靈活、高效、易于維護(hù)的開(kāi)發(fā)模式。當(dāng)數(shù)據(jù)發(fā)生變化時(shí),Vue.js能夠自動(dòng)更新UI,開(kāi)發(fā)者無(wú)需手動(dòng)更新UI,從而能夠更加專(zhuān)注于數(shù)據(jù)處理。
下面是一個(gè)示例代碼,演示了Vue.js的核心功能:
<!DOCTYPE html>
<html>
<head>
<title>Vue.js Demo</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<h2>{{ message }}</h2>
<button @click="changeMessage">Change Message</button>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
message: 'Hello, Vue.js!'
},
methods: {
changeMessage: function() {
this.message = 'Vue.js is awesome!';
}
}
});
</script>
</body>
</html>
在這個(gè)示例中,我們創(chuàng)建了一個(gè)Vue實(shí)例,并將其綁定到頁(yè)面上的一個(gè)元素(id為"app")。通過(guò)data
屬性,我們定義了一個(gè)名為message
的變量,并將其初始值設(shè)為"Hello, Vue.js!"。在頁(yè)面上,我們使用雙花括號(hào)語(yǔ)法({{ message }}
)將message
的值顯示出來(lái)。通過(guò)methods
屬性,我們定義了一個(gè)名為changeMessage
的方法,當(dāng)點(diǎn)擊按鈕時(shí),該方法會(huì)修改message
的值。由于Vue.js的響應(yīng)式數(shù)據(jù)綁定機(jī)制,一旦message
的值發(fā)生變化,頁(yè)面上顯示的內(nèi)容也會(huì)自動(dòng)更新。
通過(guò)這個(gè)示例,我們可以看到Vue.js的簡(jiǎn)潔、靈活和高效的特點(diǎn)。它使得開(kāi)發(fā)者能夠更加輕松地處理數(shù)據(jù)和UI之間的關(guān)系,提高開(kāi)發(fā)效率。無(wú)論是構(gòu)建小型應(yīng)用還是大型復(fù)雜的單頁(yè)應(yīng)用,Vue.js都是一個(gè)值得考慮的選擇。
持久層框架MyBaits
MyBatis是一個(gè)開(kāi)源的持久層框架,它可以幫助開(kāi)發(fā)者簡(jiǎn)化數(shù)據(jù)庫(kù)操作的編寫(xiě)和管理。MyBatis的核心思想是將SQL語(yǔ)句和Java代碼分離,通過(guò)XML或注解的方式來(lái)描述數(shù)據(jù)庫(kù)操作,從而實(shí)現(xiàn)了數(shù)據(jù)訪問(wèn)層的解耦和靈活性。
MyBatis的優(yōu)勢(shì)主要包括以下幾點(diǎn):
-
簡(jiǎn)化數(shù)據(jù)庫(kù)操作:MyBatis通過(guò)提供強(qiáng)大的SQL映射功能,可以將Java對(duì)象與數(shù)據(jù)庫(kù)表進(jìn)行映射,開(kāi)發(fā)者無(wú)需手動(dòng)編寫(xiě)繁瑣的SQL語(yǔ)句,大大簡(jiǎn)化了數(shù)據(jù)庫(kù)操作的編寫(xiě)和維護(hù)。
-
靈活的SQL控制:MyBatis支持動(dòng)態(tài)SQL,可以根據(jù)不同的條件和邏輯來(lái)動(dòng)態(tài)生成SQL語(yǔ)句,使得查詢、更新等操作更加靈活和可控。
-
緩存支持:MyBatis提供了一級(jí)緩存和二級(jí)緩存的支持,可以有效減少數(shù)據(jù)庫(kù)的訪問(wèn)次數(shù),提高系統(tǒng)性能。
-
可擴(kuò)展性強(qiáng):MyBatis采用插件機(jī)制,可以方便地?cái)U(kuò)展和定制自己的功能,滿足各種不同的業(yè)務(wù)需求。
系統(tǒng)測(cè)試
為了確保我們的系統(tǒng)達(dá)到最高的質(zhì)量標(biāo)準(zhǔn),本系統(tǒng)進(jìn)行了全方位的測(cè)試。我們的目標(biāo)是從多個(gè)角度發(fā)現(xiàn)系統(tǒng)中存在的問(wèn)題,并及時(shí)進(jìn)行改進(jìn),以確保系統(tǒng)的完整性和可靠性。
通過(guò)功能測(cè)試,能夠找出系統(tǒng)中的潛在缺陷,并對(duì)其進(jìn)行修復(fù)。這樣可以確保我們的系統(tǒng)能夠無(wú)缺陷地運(yùn)行,滿足客戶的需求。我們積極尋找問(wèn)題和不足之處,并及時(shí)采取措施進(jìn)行改進(jìn)。
在測(cè)試過(guò)程中,我們不僅僅關(guān)注系統(tǒng)的功能性,還注重系統(tǒng)是否滿足用戶的需求。通過(guò)這些測(cè)試,我們能夠準(zhǔn)確地評(píng)估系統(tǒng)的性能,并得出測(cè)試結(jié)論。我們的目標(biāo)是確保系統(tǒng)的質(zhì)量和穩(wěn)定性,為用戶提供優(yōu)質(zhì)的體驗(yàn)。
我們不斷努力,持續(xù)優(yōu)化我們的系統(tǒng),以滿足用戶的期望和需求。我們將繼續(xù)進(jìn)行測(cè)試和改進(jìn),以確保我們的系統(tǒng)始終處于最佳狀態(tài)。
系統(tǒng)測(cè)試目的
在管理系統(tǒng)的開(kāi)發(fā)周期中,系統(tǒng)測(cè)試是至關(guān)重要的環(huán)節(jié)。它是確保系統(tǒng)質(zhì)量和可靠性的最后一道關(guān)卡,也是整個(gè)開(kāi)發(fā)過(guò)程的最后一次檢查。
系統(tǒng)測(cè)試的主要目的是避免用戶在使用過(guò)程中遇到問(wèn)題,提升用戶體驗(yàn)。我們需要從多個(gè)角度和思路出發(fā),考慮系統(tǒng)可能遇到的問(wèn)題,并通過(guò)模擬不同的場(chǎng)景來(lái)發(fā)現(xiàn)缺陷并解決問(wèn)題。測(cè)試過(guò)程中,我們也可以評(píng)估系統(tǒng)的質(zhì)量情況,檢查系統(tǒng)功能是否完備,邏輯是否順暢。一次成功的系統(tǒng)測(cè)試將極大地提升系統(tǒng)的質(zhì)量和用戶體驗(yàn)。
測(cè)試的目標(biāo)是驗(yàn)證系統(tǒng)是否符合需求規(guī)格說(shuō)明書(shū)的定義,并找出與需求規(guī)格說(shuō)明書(shū)不符或沖突的內(nèi)容。在測(cè)試過(guò)程中,我們始終站在用戶的角度考慮問(wèn)題,避免浪費(fèi)時(shí)間在一些不切實(shí)際的場(chǎng)景上,以確保預(yù)期結(jié)果與實(shí)際結(jié)果一致。
本系統(tǒng)致力于保障系統(tǒng)的質(zhì)量和穩(wěn)定性,優(yōu)化用戶的使用體驗(yàn)。通過(guò)系統(tǒng)測(cè)試,能夠及時(shí)發(fā)現(xiàn)并解決問(wèn)題,確保系統(tǒng)符合用戶需求,并提供最佳的服務(wù)。我們將持續(xù)努力,提高系統(tǒng)的可靠性和用戶滿意度。
系統(tǒng)功能測(cè)試
系統(tǒng)功能測(cè)試是對(duì)系統(tǒng)功能模塊進(jìn)行的測(cè)試過(guò)程。通過(guò)點(diǎn)擊、輸入邊界值、驗(yàn)證必填項(xiàng)和非必填項(xiàng)等方法進(jìn)行黑盒測(cè)試。編寫(xiě)測(cè)試用例,根據(jù)測(cè)試用例執(zhí)行測(cè)試,并得出測(cè)試結(jié)論。
以登錄功能為例,本系統(tǒng)進(jìn)行登錄功能測(cè)試。當(dāng)用戶需要登錄系統(tǒng)時(shí),本系統(tǒng)通過(guò)賬戶密碼等功能點(diǎn)進(jìn)行驗(yàn)證。用戶在輸入時(shí)需要與數(shù)據(jù)庫(kù)存儲(chǔ)的數(shù)據(jù)匹配。如果其中某項(xiàng)輸入錯(cuò)誤,系統(tǒng)將提示輸入錯(cuò)誤。該界面還對(duì)角色權(quán)限進(jìn)行校驗(yàn),當(dāng)用戶選擇管理員角色登錄時(shí),系統(tǒng)會(huì)報(bào)錯(cuò)。下表是登錄功能的測(cè)試用例示例:
輸入數(shù)據(jù) | 預(yù)期結(jié)果 | 實(shí)際結(jié)果 | 結(jié)果分析 |
---|---|---|---|
用戶名:guanliyuan 密碼:123456 驗(yàn)證碼:正確輸入 | 登錄系統(tǒng) | 成功登錄系統(tǒng) | 結(jié)果一致 |
用戶名:guanliyuan 密碼:111111 驗(yàn)證碼:正確輸入 | 密碼錯(cuò)誤 | 密碼錯(cuò)誤,請(qǐng)重新輸入密碼 | 結(jié)果一致 |
用戶名:guanliyuan 密碼:123456 驗(yàn)證碼:錯(cuò)誤輸入 | 驗(yàn)證碼錯(cuò)誤 | 驗(yàn)證碼信息錯(cuò)誤 | 結(jié)果一致 |
用戶名:空 密碼:123456 驗(yàn)證碼:正確輸入 | 用戶名必填 | 請(qǐng)輸入用戶名 | 結(jié)果一致 |
用戶名:guanliyuan 密碼:空 驗(yàn)證碼:正確輸入 | 密碼錯(cuò)誤 | 密碼錯(cuò)誤,請(qǐng)重新輸入密碼 | 結(jié)果一致 |
另外,本系統(tǒng)還進(jìn)行了用戶管理功能的測(cè)試。用戶管理包括添加、編輯、刪除和查找用戶等功能。本系統(tǒng)測(cè)試了以下各項(xiàng)功能的測(cè)試用例:
- 添加用戶功能測(cè)試用例:
輸入數(shù)據(jù) | 預(yù)期結(jié)果 | 實(shí)際結(jié)果 | 結(jié)果分析 |
---|---|---|---|
用戶名:user1 密碼:123456 角色:普通用戶 | 添加成功,并在用戶列表中顯示 | 用戶列表中出現(xiàn)用戶1 | 結(jié)果一致 |
用戶名:user2 密碼:111111 角色:普通用戶 | 添加成功,并在用戶列表中顯示 | 用戶列表中出現(xiàn)用戶2 | 結(jié)果一致 |
用戶名:user1 密碼:123456 角色:普通用戶 | 添加失敗,提示用戶名已存在 | 添加失敗,提示用戶名已存在 | 結(jié)果一致 |
用戶名:空 密碼:123456 角色:普通用戶 | 添加失敗,提示用戶名不能為空 | 添加失敗,提示用戶名不能為空 | 結(jié)果一致 |
- 編輯用戶功能測(cè)試用例:
輸入數(shù)據(jù) | 預(yù)期結(jié)果 | 實(shí)際結(jié)果 | 結(jié)果分析 |
---|---|---|---|
選擇用戶1,修改密碼為654321 | 編輯成功,密碼修改成功 | 用戶1密碼已修改為654321 | 結(jié)果一致 |
選擇用戶2,修改角色為管理員 | 編輯成功,角色修改成功 | 用戶2角色已修改為管理員 | 結(jié)果一致 |
選擇用戶1,清空用戶名 | 編輯失敗,提示用戶名不能為空 | 編輯失敗,提示用戶名不能為空 | 結(jié)果一致 |
- 刪除用戶功能測(cè)試用例:
輸入數(shù)據(jù) | 預(yù)期結(jié)果 | 實(shí)際結(jié)果 | 結(jié)果分析 |
---|---|---|---|
選擇用戶1進(jìn)行刪除操作 | 系統(tǒng)詢問(wèn)是否刪除用戶,確認(rèn)后用戶被刪除 | 用戶1已成功刪除 | 結(jié)果一致 |
選擇用戶2進(jìn)行刪除操作 | 系統(tǒng)詢問(wèn)是否刪除用戶,取消刪除操作 | 用戶2未被刪除 | 結(jié)果一致 |
通過(guò)系統(tǒng)功能測(cè)試,確保系統(tǒng)的功能完備性,系統(tǒng)能夠按照需求規(guī)格說(shuō)明書(shū)的定義正常運(yùn)行。我們將繼續(xù)進(jìn)行測(cè)試工作,發(fā)現(xiàn)并修復(fù)潛在問(wèn)題,為用戶提供功能完善的系統(tǒng)體驗(yàn)。
系統(tǒng)測(cè)試結(jié)論
本系統(tǒng)主要使用黑盒測(cè)試,通過(guò)模擬用戶使用系統(tǒng)實(shí)現(xiàn)各個(gè)功能編寫(xiě)測(cè)試用例,并進(jìn)行測(cè)試。以確保系統(tǒng)流程的正確性。系統(tǒng)測(cè)試必不可少,可以使系統(tǒng)更加完善,該系統(tǒng)的可使用性也會(huì)更高。
測(cè)試該系統(tǒng)主要為了驗(yàn)證系統(tǒng)的功能模塊是否滿足我們最初的設(shè)計(jì)理念,驗(yàn)證各個(gè)功能模塊邏輯是否正確,此系統(tǒng)不需要過(guò)于復(fù)雜的邏輯處理,以便于使用者操作。測(cè)試的最終目的也是圍繞著用戶使用展開(kāi)。測(cè)試過(guò)程中所有場(chǎng)景都應(yīng)符合用戶需求,不可偏離需求目標(biāo),遇到問(wèn)題時(shí)要站在用戶的角度進(jìn)行思考。經(jīng)過(guò)一系列的測(cè)試過(guò)程后得到最終的測(cè)試結(jié)果,從測(cè)試結(jié)果可以看出,實(shí)現(xiàn)的系統(tǒng)在功能和性能方面滿足設(shè)計(jì)要求。
為什么選擇我
博主提供的項(xiàng)目均為博主自己收集和開(kāi)發(fā)的!所有的源碼都經(jīng)由博主檢驗(yàn)過(guò),能過(guò)正常啟動(dòng)并且功能都沒(méi)有問(wèn)題!同學(xué)們拿到后就能使用!
多個(gè)成功系統(tǒng)案例:
代碼參考
// 忽略權(quán)限驗(yàn)證的注解
@IgnoreAuth
@PostMapping(value = "/login")
public R login(String username, String password, String captcha, HttpServletRequest request) {
// 查詢用戶信息
UsersEntity user = userService.selectOne(new EntityWrapper<UsersEntity>().eq("username", username));
// 判斷用戶是否存在或密碼是否正確
if(user==null || !user.getPassword().equals(password)) {
return R.error("賬號(hào)或密碼不正確");
}
// 生成token
String token = tokenService.generateToken(user.getId(),username, "users", user.getRole());
return R.ok().put("token", token);
}
// 生成token
@Override
public String generateToken(Long userid,String username, String tableName, String role) {
// 查詢是否存在已有token
TokenEntity tokenEntity = this.selectOne(new EntityWrapper<TokenEntity>().eq("userid", userid).eq("role", role));
// 生成隨機(jī)token字符串
String token = CommonUtil.getRandomString(32);
// 設(shè)置token過(guò)期時(shí)間為1小時(shí)后
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
cal.add(Calendar.HOUR_OF_DAY, 1);
if(tokenEntity!=null) {
// 更新token信息
tokenEntity.setToken(token);
tokenEntity.setExpiratedtime(cal.getTime());
this.updateById(tokenEntity);
} else {
// 新建token記錄
this.insert(new TokenEntity(userid,username, tableName, role, token, cal.getTime()));
}
return token;
}
/**
* 權(quán)限(Token)驗(yàn)證攔截器
*/
@Component
public class AuthorizationInterceptor implements HandlerInterceptor {
// 定義Token在請(qǐng)求Header中的鍵名
public static final String LOGIN_TOKEN_KEY = "Token";
@Autowired
private TokenService tokenService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 支持跨域請(qǐng)求
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with,request-source,Token, Origin,imgType, Content-Type, cache-control,postman-token,Cookie, Accept,authorization");
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
// 跨域時(shí)會(huì)首先發(fā)送一個(gè)OPTIONS請(qǐng)求,這里我們給OPTIONS請(qǐng)求直接返回正常狀態(tài)
if (request.getMethod().equals(RequestMethod.OPTIONS.name())) {
response.setStatus(HttpStatus.OK.value());
return false;
}
// 獲取HandlerMethod注解
IgnoreAuth annotation;
if (handler instanceof HandlerMethod) {
annotation = ((HandlerMethod) handler).getMethodAnnotation(IgnoreAuth.class);
} else {
return true;
}
// 從header中獲取token
String token = request.getHeader(LOGIN_TOKEN_KEY);
/**
* 不需要驗(yàn)證權(quán)限的方法直接放過(guò)
*/
if(annotation!=null) {
return true;
}
// 根據(jù)token獲取token實(shí)體
TokenEntity tokenEntity = null;
if(StringUtils.isNotBlank(token)) {
tokenEntity = tokenService.getTokenEntity(token);
}
if(tokenEntity != null) {
// 將用戶信息存入session
request.getSession().setAttribute("userId", tokenEntity.getUserid());
request.getSession().setAttribute("role", tokenEntity.getRole());
request.getSession().setAttribute("tableName", tokenEntity.getTablename());
request.getSession().setAttribute("username", tokenEntity.getUsername());
return true;
}
// 驗(yàn)證失敗,返回401錯(cuò)誤和提示信息
PrintWriter writer = null;
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=utf-8");
try {
writer = response.getWriter();
writer.print(JSONObject.toJSONString(R.error(401, "請(qǐng)先登錄")));
} finally {
if(writer != null){
writer.close();
}
}
return false;
}
}
這段Java代碼主要是一個(gè)登錄功能的實(shí)現(xiàn),涉及到生成Token和權(quán)限驗(yàn)證的攔截器。
-
@IgnoreAuth
注解:這是一個(gè)自定義的注解,用于標(biāo)識(shí)不需要進(jìn)行權(quán)限驗(yàn)證的方法。 -
@PostMapping(value = "/login")
:這是一個(gè)使用POST請(qǐng)求方式的登錄接口。 -
login
方法:該方法接收用戶名、密碼和驗(yàn)證碼作為參數(shù),并返回一個(gè)包含生成的Token的響應(yīng)對(duì)象。首先通過(guò)用戶名查詢用戶信息,然后判斷用戶是否存在并驗(yàn)證密碼是否正確。如果驗(yàn)證失敗,則返回錯(cuò)誤提示;如果驗(yàn)證成功,則調(diào)用generateToken
方法生成Token,并將其添加到響應(yīng)對(duì)象中返回。 -
generateToken
方法:該方法用于生成Token。首先查詢是否存在已有的Token實(shí)體,然后生成一個(gè)隨機(jī)的Token字符串。接下來(lái),設(shè)置Token的過(guò)期時(shí)間為當(dāng)前時(shí)間加上1小時(shí),并根據(jù)情況進(jìn)行更新或插入Token記錄。最后返回生成的Token字符串。 -
AuthorizationInterceptor
類(lèi):這是一個(gè)權(quán)限驗(yàn)證攔截器實(shí)現(xiàn)類(lèi)。它實(shí)現(xiàn)了HandlerInterceptor
接口,用于在請(qǐng)求處理之前進(jìn)行權(quán)限驗(yàn)證。在preHandle
方法中,首先設(shè)置支持跨域請(qǐng)求的相關(guān)頭信息,并處理跨域時(shí)的 OPTIONS 請(qǐng)求。然后,通過(guò)反射獲取請(qǐng)求處理方法上的@IgnoreAuth
注解,如果存在該注解,則直接放過(guò)。接著,從請(qǐng)求頭中獲取 Token,并根據(jù) Token 獲取對(duì)應(yīng)的 Token 實(shí)體。如果 Token 實(shí)體存在,則將用戶信息存入 session,并放行請(qǐng)求。如果驗(yàn)證失敗,則返回401錯(cuò)誤和相應(yīng)的提示信息。
總結(jié),這段代碼實(shí)現(xiàn)了一個(gè)基本的登錄功能,并加入了對(duì)權(quán)限的驗(yàn)證攔截,確保只有擁有有效 Token 的用戶才能訪問(wèn)受限資源。
數(shù)據(jù)庫(kù)參考
根據(jù)給出的數(shù)據(jù)庫(kù)SQL語(yǔ)句,設(shè)計(jì)一個(gè)商品表的示例:
-- ----------------------------
-- Table structure for product
-- ----------------------------
DROP TABLE IF EXISTS `product`;
CREATE TABLE `product` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`name` varchar(100) NOT NULL COMMENT '商品名稱(chēng)',
`price` decimal(10, 2) NOT NULL COMMENT '商品價(jià)格',
`description` varchar(200) DEFAULT NULL COMMENT '商品描述',
`stock` int(11) NOT NULL COMMENT '商品庫(kù)存',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時(shí)間',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='商品表';
該商品表包括以下字段:
-
id
:商品的主鍵,自增長(zhǎng)。 -
name
:商品的名稱(chēng),不能為空。 -
price
:商品的價(jià)格,采用10位整數(shù)和2位小數(shù)的形式存儲(chǔ)。 -
description
:商品的描述,最多200個(gè)字符。 -
stock
:商品的庫(kù)存數(shù)量。 -
create_time
:商品的創(chuàng)建時(shí)間,記錄商品被添加的時(shí)間。 -
update_time
:商品的更新時(shí)間,記錄商品信息最近一次被修改的時(shí)間。
– 向商品表插入數(shù)據(jù)示例
INSERT INTO `product` (`name`, `price`, `description`, `stock`)
VALUES ('iPhone 13', 999.99, 'A powerful and advanced smartphone', 100);
INSERT INTO `product` (`name`, `price`, `description`, `stock`)
VALUES ('Samsung Galaxy S21', 899.99, 'A flagship Android smartphone', 150);
INSERT INTO `product` (`name`, `price`, `description`, `stock`)
VALUES ('Sony PlayStation 5', 499.99, 'Next-gen gaming console', 50);
源碼獲取
私信聯(lián)系我即可~
大家點(diǎn)贊、收藏、關(guān)注、評(píng)論啦 、查看????獲取聯(lián)系方式????
精彩專(zhuān)欄推薦訂閱:在下方專(zhuān)欄????
Java精品實(shí)戰(zhàn)案例《500套》
微信小程序項(xiàng)目精品案例《500套》
Java核心技術(shù)精選
Java框架精選文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-853423.html
到了這里,關(guān)于基于ssm+vue.js+uniapp小程序的校園一卡通系統(tǒng)附帶文章和源代碼部署視頻講解等的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!