作者介紹:??大廠全棧碼農(nóng)|畢設(shè)實戰(zhàn)開發(fā),專注于大學(xué)生項目實戰(zhàn)開發(fā)、講解和畢業(yè)答疑輔導(dǎo)。
??獲取源碼聯(lián)系方式請查看文末??
?推薦訂閱精彩專欄 ???? 避免錯過下次更新
Springboot項目精選實戰(zhàn)案例
更多項目:CSDN主頁YAML墨韻
學(xué)如逆水行舟,不進則退。學(xué)習(xí)如趕路,不能慢一步。
目錄
一、項目簡介
二、開發(fā)技術(shù)與環(huán)境配置
2.1 SpringBoot框架
2.2 Java語言簡介
2.3 Vue的介紹
2.4 mysql數(shù)據(jù)庫介紹
2.5 B/S架構(gòu)
三、系統(tǒng)功能實現(xiàn)
四、系統(tǒng)項目截圖
登錄頁面
后臺管理頁面
用戶信息
景點信息
訂票信息
用戶評價
五、核心代碼
5.1、文件上傳
5.2、數(shù)據(jù)庫配置
5.3、登錄功能實現(xiàn)
5.4、業(yè)務(wù)層(Service)
5.5、數(shù)據(jù)訪問層(Dao)
一、項目簡介
? 在旅游網(wǎng)站的初期開發(fā)階段,我國許多網(wǎng)站存在一些普遍問題。其中之一是缺乏對旅游行業(yè)和網(wǎng)絡(luò)運營的全面了解,這導(dǎo)致他們無法準確找到自己的切入點,這種情況導(dǎo)致了一系列問題。首先,設(shè)計相似、內(nèi)容雷同,缺乏創(chuàng)新和差異化,無法吸引用戶的興趣和留存。因此,在開發(fā)旅游網(wǎng)站時,我們需要深入了解旅游行業(yè)和網(wǎng)絡(luò)運營,以全面了解市場需求和用戶喜好。此外,我們還應(yīng)重視建立規(guī)?;慕?jīng)營模式,通過有效的網(wǎng)上促銷和預(yù)訂機制提高成功率,以實現(xiàn)更可觀的旅游電子商務(wù)銷售額。
??旅游網(wǎng)站面臨著旅游產(chǎn)品交易安全性的瓶頸。然而,大多數(shù)國內(nèi)旅游網(wǎng)站的在線支付手段不完善,缺乏統(tǒng)一的標(biāo)準體系,交易安全性令人擔(dān)憂。惡意訂購和交易錯誤頻繁發(fā)生,導(dǎo)致消費者對在線交易的信任度不高。解決這個問題的關(guān)鍵是建立健全的支付體系,加強身份驗證和數(shù)據(jù)加密,以及建立完善的客服和投訴處理機制,提高交易的安全性和用戶的信任度。因此,交易不安全問題成為旅游網(wǎng)站發(fā)展中最大的障礙之一。
??為了改善這種情況,旅游網(wǎng)站應(yīng)采取以下措施:首先,加強自身的知名度和美譽度,通過積極的網(wǎng)絡(luò)營銷活動提高曝光率。其次,建立可靠的信譽體系,確保網(wǎng)站的信譽度、安全性和可信度,從而增加用戶對網(wǎng)站的信任。同時,制定科學(xué)的管理和運營標(biāo)準,規(guī)范網(wǎng)站的運作,并引導(dǎo)用戶在網(wǎng)站上進行安全、可靠的交易。此外,還應(yīng)加強對網(wǎng)站內(nèi)容的引導(dǎo)和規(guī)范,確保內(nèi)容的真實性和合法性。最后,積極推進運行制度的建設(shè),提高網(wǎng)站的質(zhì)量和安全性,并通過廣告宣傳擴大網(wǎng)站的影響力。通過這些措施,旅游網(wǎng)站能夠提升整體質(zhì)量和安全性,增強用戶對網(wǎng)站的信任,進而促進業(yè)務(wù)發(fā)展。
二、開發(fā)技術(shù)與環(huán)境配置
以Java語言為開發(fā)工具,利用了當(dāng)前先進的springboot框架,以IDEA為系統(tǒng)開發(fā)工具,MySQL為后臺數(shù)據(jù)庫,vue為后臺管理頁面開發(fā)的一個旅游管理系統(tǒng)。
2.1 SpringBoot框架
SpringBoot是一個全新開源的輕量級框架?;赟pring4.0設(shè)計,其不僅繼承了Spring框架原來有的優(yōu)秀特性,而且還通過簡化配置文件來進一步簡化了Spring應(yīng)用的整個搭建以及開發(fā)過程。另外在原本的Spring中由于隨著項目的擴大導(dǎo)入的jar包數(shù)量越來越大,隨之出現(xiàn)了jar包版本之間的兼容性問題,而此時SpringBoot通過集成大量的框架使得依賴包的版本沖突,以及引用的不穩(wěn)定性問題得到了很好的解決。
SpringBoot可以看做是Spring的加強版本,但實質(zhì)上都是Spring的相關(guān)技術(shù),有了這些優(yōu)秀的開源框架,程序員在開發(fā)過程中將事半功倍。
2.2 Java語言簡介
Java是由SUN公司推出,該公司于2010年被oracle公司收購。Java本是印度尼西亞的一個叫做爪洼島的英文名稱,也因此得來java是一杯正冒著熱氣咖啡的標(biāo)識。Java語言在移動互聯(lián)網(wǎng)的大背景下具備了顯著的優(yōu)勢和廣闊的前景,它是面向?qū)ο蟮模植际降?,動態(tài)的,具有平臺無關(guān)性、安全性、健壯性。Java語言的基本語句語法和C++一樣,但是它面向?qū)ο蟮募夹g(shù)更加徹底,因為Java要求將所有的內(nèi)容都必須封裝成類,把類作為程序的基本單位。由于不允許類外有變量、方法。 Java語言的分布式體現(xiàn)在數(shù)據(jù)分布和操作分布,它是面向網(wǎng)絡(luò)的語言,可以處理TCP/IP協(xié)議,它也支持客戶機/服務(wù)器的計算模式。Java語言的動態(tài)性是指類在運行時是動態(tài)安裝的,使得Java可以動態(tài)的維護程序。Java不支持指針,對內(nèi)存訪問的所有操作都是通過對象實例化實現(xiàn)的,這樣就避免了指針操作中易產(chǎn)生的錯誤,同時也預(yù)防了病毒對系統(tǒng)的破壞和威脅。
Java語言的編程風(fēng)格與C語言非常接近,它繼承了C++面向?qū)ο蠹夹g(shù)的核心,它面世之后發(fā)展迅速,非常流行,對高級C語言形成了很大的沖擊。業(yè)內(nèi)人士稱之為“一次編譯、到處執(zhí)行”。當(dāng)然java也有缺點,在每次執(zhí)行編譯后,字節(jié)碼都需要消耗一定的時間,在某些程度上降低了性能。但是這并不影響java成為此次設(shè)計語言的選擇。Java語言簡單易學(xué),使用它的編程時間短,功能性強,開發(fā)者學(xué)習(xí)起來更簡便、更快。Java的主要特性有以下幾個:
面向?qū)ο?br> 面向?qū)ο笥兴膫€特點:封裝、繼承、多態(tài)、抽象。抽象是指忽略一個問題中的次要部分,關(guān)注主要部分。多態(tài)是指對同一種消息做出的不同反應(yīng)。繼承是指在原有的父類方法基礎(chǔ)上增加自己獨有的方法,而不改變原來父類。
平臺無關(guān)性、
Java編譯出來的是字節(jié)碼,直接由虛擬機執(zhí)行。在任何平臺上,只要有Java虛擬機,Java代碼都能運行。
可靠性和安全性
Java對內(nèi)存的訪問都必須通過對象的實例變量來實現(xiàn),避免了指針中出現(xiàn)的錯誤。
多線程
Java提供了多線程功能,利用編程實現(xiàn)同一時間同時工作的功能。
2.3 Vue的介紹
Vue.js致力于構(gòu)建數(shù)據(jù)驅(qū)動的web應(yīng)用開發(fā)框架,以簡潔化,輕量級,數(shù)據(jù)驅(qū)動,模塊友好等優(yōu)勢深受企業(yè)以及前端開發(fā)者的喜愛,成為前端開發(fā)人員必備的技能。Vue3.0的出現(xiàn),又帶動周邊生態(tài)的發(fā)展,奠定了vue在企業(yè)級開發(fā)的重要地位。
Vue是一套用于構(gòu)建用戶界面的漸進式框架。與其它大型框架不同的是,Vue 被設(shè)計為可以自底向上逐層應(yīng)用。Vue 的核心庫只關(guān)注視圖層,不僅易于上手,還便于與第三方庫或既有項目整合。另一方面,當(dāng)與現(xiàn)代化的工具鏈以及各種支持類庫結(jié)合使用時,Vue 也完全能夠為復(fù)雜的單頁應(yīng)用提供驅(qū)動。
漸進式框架做分層設(shè)計,每層都可選,不同層可以靈活接入其他方案。而當(dāng)你都想用官方的實現(xiàn)時,會發(fā)現(xiàn)也早已準備好,各層之間包括配套工具都能比接入其他方案更便捷地協(xié)同工作。 一個個放入,放多少就做多少。
2.4 mysql數(shù)據(jù)庫介紹
利用MYSQL的數(shù)據(jù)獨立性、安全性等特點,在軟件項目中對數(shù)據(jù)進行操作,可以保證數(shù)據(jù)準確無誤,并降低了程序員的應(yīng)用開發(fā)時間。
MYSQL的特點是支持多線程,能方便的對系統(tǒng)資源充分利用,有效提高速度,還提供多種方式途徑來對數(shù)據(jù)庫進行連接;MYSQL的功能相對弱小、規(guī)模也小,但本系統(tǒng)要求不高,MYSQL完全可以滿足本系統(tǒng)使用。
利用MYSQL建立系統(tǒng)數(shù)據(jù)庫,不僅有利于數(shù)據(jù)處理業(yè)務(wù)的早期整合,還能利于發(fā)展后兩種數(shù)據(jù)擴展的操作。
2.5 B/S架構(gòu)
B/S結(jié)構(gòu)是目前使用最多的結(jié)構(gòu)模式,它可以使得系統(tǒng)的開發(fā)更加的簡單,好操作,而且還可以對其進行維護。使用該結(jié)構(gòu)時只需要在計算機中安裝數(shù)據(jù)庫,和一些很常用的瀏覽器就可以了。瀏覽器就會與數(shù)據(jù)庫進行信息的連接,可以實現(xiàn)很多的功能,B/S結(jié)構(gòu)是可以直接進行使用的,而且B/S結(jié)構(gòu)在使用中極大的減少了工作的維護?;贐/S的軟件,所有的數(shù)據(jù)庫之間都是相互獨立的,因此是非常安全的。因為基于B/S結(jié)構(gòu)可以清楚的看到系統(tǒng)正在處理的業(yè)務(wù),并且能夠及時的讓管理人員做出決策,這樣就可以避免企業(yè)的損失。B/S結(jié)構(gòu)的基本特點是集中式的管理模式,用戶使用系統(tǒng)生成數(shù)據(jù)后,這些數(shù)據(jù)就可以存儲到系統(tǒng)的數(shù)據(jù)庫中,方便日后能夠用到,這樣就可以滿足人們的所有的需求。
三、系統(tǒng)功能實現(xiàn)
?旅游系統(tǒng)提供一個全面、便捷、安全和個性化的旅游信息和服務(wù)平臺。
? ? ? ? 首先,旅游系統(tǒng)旨在滿足用戶對旅游信息的需求。通過整合和展示各類旅游景點、酒店、交通等相關(guān)信息,用戶可以方便地獲取目的地的詳細介紹、景點特色、酒店預(yù)訂等信息,以幫助他們做出明智的旅游決策。
? ? ? ? 其次,旅游系統(tǒng)旨在提供方便的服務(wù)。用戶可以通過系統(tǒng)直接在線預(yù)訂景點門票等,省去了繁瑣的線下操作和排隊等待,提高了預(yù)訂效率和便利性。此外,旅游系統(tǒng)還注重用戶個性化的需求和體驗。通過用戶個人中心和管理功能,用戶可以自定義旅游偏好、收藏喜歡的景點、撰寫游記和分享經(jīng)驗,實現(xiàn)個性化的旅游體驗和社交互動。
? ? ? ?總的來說,旅游系統(tǒng)的編寫目的是為了構(gòu)建一個全面、便捷、安全和個性化的旅游信息平臺,為用戶提供優(yōu)質(zhì)的旅游服務(wù),促進旅游行業(yè)的發(fā)展和提升用戶的旅游體驗
四、系統(tǒng)項目截圖
登錄頁面
后臺管理頁面
用戶信息
景點信息
訂票信息
文章來源:http://www.zghlxwxcb.cn/news/detail-861072.html
用戶評價
文章來源地址http://www.zghlxwxcb.cn/news/detail-861072.html
五、核心代碼
5.1、文件上傳
/**
* 上傳文件映射表
*/
@RestController
@RequestMapping("file")
@SuppressWarnings({"unchecked","rawtypes"})
public class FileController{
@Autowired
private ConfigService configService;
/**
* 上傳文件
*/
@RequestMapping("/upload")
public R upload(@RequestParam("file") MultipartFile file,String type) throws Exception {
if (file.isEmpty()) {
throw new EIException("上傳文件不能為空");
}
String fileExt = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")+1);
File path = new File(ResourceUtils.getURL("classpath:static").getPath());
if(!path.exists()) {
path = new File("");
}
File upload = new File(path.getAbsolutePath(),"/upload/");
if(!upload.exists()) {
upload.mkdirs();
}
String fileName = new Date().getTime()+"."+fileExt;
File dest = new File(upload.getAbsolutePath()+"/"+fileName);
file.transferTo(dest);
/**
* 如果使用idea或者eclipse重啟項目,發(fā)現(xiàn)之前上傳的圖片或者文件丟失,將下面一行代碼注釋打開
* 請將以下的"D:\\springbootq33sd\\src\\main\\resources\\static\\upload"替換成你本地項目的upload路徑,
* 并且項目路徑不能存在中文、空格等特殊字符
*/
// FileUtils.copyFile(dest, new File("D:\\springbootq33sd\\src\\main\\resources\\static\\upload"+"/"+fileName)); /**修改了路徑以后請將該行最前面的//注釋去掉**/
if(StringUtils.isNotBlank(type) && type.equals("1")) {
ConfigEntity configEntity = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "faceFile"));
if(configEntity==null) {
configEntity = new ConfigEntity();
configEntity.setName("faceFile");
configEntity.setValue(fileName);
} else {
configEntity.setValue(fileName);
}
configService.insertOrUpdate(configEntity);
}
return R.ok().put("file", fileName);
}
/**
* 下載文件
*/
@IgnoreAuth
@RequestMapping("/download")
public ResponseEntity<byte[]> download(@RequestParam String fileName) {
try {
File path = new File(ResourceUtils.getURL("classpath:static").getPath());
if(!path.exists()) {
path = new File("");
}
File upload = new File(path.getAbsolutePath(),"/upload/");
if(!upload.exists()) {
upload.mkdirs();
}
File file = new File(upload.getAbsolutePath()+"/"+fileName);
if(file.exists()){
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment", fileName);
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);
}
} catch (IOException e) {
e.printStackTrace();
}
return new ResponseEntity<byte[]>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
5.2、數(shù)據(jù)庫配置
server:
tomcat:
uri-encoding: UTF-8
port: 8080
servlet:
context-path: /springbootr1tjf
spring:
datasource:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/springbootr1tjf?useUnicode=true&characterEncoding=utf-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8
username: root
password: 123456
# driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=springbootr1tjf
# username: sa
# password: 123456
servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB
resources:
static-locations: classpath:static/,file:static/
#mybatis
mybatis-plus:
mapper-locations: classpath*:mapper/*.xml
#實體掃描,多個package用逗號或者分號分隔
typeAliasesPackage: com.entity
global-config:
#主鍵類型 0:"數(shù)據(jù)庫ID自增", 1:"用戶輸入ID",2:"全局唯一ID (數(shù)字類型唯一ID)", 3:"全局唯一ID UUID";
id-type: 1
#字段策略 0:"忽略判斷",1:"非 NULL 判斷"),2:"非空判斷"
field-strategy: 2
#駝峰下劃線轉(zhuǎn)換
db-column-underline: true
#刷新mapper 調(diào)試神器
refresh-mapper: true
#邏輯刪除配置
logic-delete-value: -1
logic-not-delete-value: 0
#自定義SQL注入器
sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector
configuration:
map-underscore-to-camel-case: true
cache-enabled: false
call-setters-on-nulls: true
#springboot 項目mybatis plus 設(shè)置 jdbcTypeForNull (oracle數(shù)據(jù)庫需配置JdbcType.NULL, 默認是Other)
jdbc-type-for-null: 'null'
5.3、登錄功能實現(xiàn)
package com.controller;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
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.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.annotation.IgnoreAuth;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.entity.TokenEntity;
import com.entity.UserEntity;
import com.service.TokenService;
import com.service.UserService;
import com.utils.CommonUtil;
import com.utils.MPUtil;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.ValidatorUtils;
/**
* 登錄相關(guān)
*/
@RequestMapping("users")
@RestController
public class UserController{
@Autowired
private UserService userService;
@Autowired
private TokenService tokenService;
/**
* 登錄
*/
@IgnoreAuth
@PostMapping(value = "/login")
public R login(String username, String password, String captcha, HttpServletRequest request) {
UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
if(user==null || !user.getPassword().equals(password)) {
return R.error("賬號或密碼不正確");
}
String token = tokenService.generateToken(user.getId(),username, "users", user.getRole());
return R.ok().put("token", token);
}
/**
* 注冊
*/
@IgnoreAuth
@PostMapping(value = "/register")
public R register(@RequestBody UserEntity user){
if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username",
user.getUsername())) !=null) {
return R.error("用戶已存在");
}
userService.insert(user);
return R.ok();
}
/**
* 退出
*/
@GetMapping(value = "logout")
public R logout(HttpServletRequest request) {
request.getSession().invalidate();
return R.ok("退出成功");
}
/**
* 密碼重置
*/
@IgnoreAuth
@RequestMapping(value = "/resetPass")
public R resetPass(String username, HttpServletRequest request){
UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>
().eq("username", username));
if(user==null) {
return R.error("賬號不存在");
}
user.setPassword("123456");
userService.update(user,null);
return R.ok("密碼已重置為:123456");
}
/**
* 列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params,UserEntity user){
EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();
PageUtils page = userService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.allLike(ew, user), params), params));
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/list")
public R list( UserEntity user){
EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();
ew.allEq(MPUtil.allEQMapPre( user, "user"));
return R.ok().put("data", userService.selectListView(ew));
}
/**
* 信息
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") String id){
UserEntity user = userService.selectById(id);
return R.ok().put("data", user);
}
/**
* 獲取用戶的session用戶信息
*/
@RequestMapping("/session")
public R getCurrUser(HttpServletRequest request){
Long id = (Long)request.getSession().getAttribute("userId");
UserEntity user = userService.selectById(id);
return R.ok().put("data", user);
}
/**
* 保存
*/
@PostMapping("/save")
public R save(@RequestBody UserEntity user){
if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username",
user.getUsername())) !=null) {
return R.error("用戶已存在");
}
userService.insert(user);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
public R update(@RequestBody UserEntity user){
userService.updateById(user);//全部更新
return R.ok();
}
/**
* 刪除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
userService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
}
5.4、業(yè)務(wù)層(Service)
package com.service;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.service.IService;
import com.entity.UserEntity;
import com.utils.PageUtils;
/**
* 系統(tǒng)用戶
*/
public interface UserService extends IService<UserEntity> {
PageUtils queryPage(Map<String, Object> params);
List<UserEntity> selectListView(Wrapper<UserEntity> wrapper);
PageUtils queryPage(Map<String, Object> params,Wrapper<UserEntity> wrapper);
}
5.5、數(shù)據(jù)訪問層(Dao)
package com.dao;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.pagination.Pagination;
import com.entity.UserEntity;
/**
* 用戶
*/
public interface UserDao extends BaseMapper<UserEntity> {
List<UserEntity> selectListView(@Param("ew") Wrapper<UserEntity> wrapper);
List<UserEntity> selectListView(Pagination page,@Param("ew") Wrapper<UserEntity> wrapper);
}
到了這里,關(guān)于Spring Boot后端與Vue前端融合:構(gòu)建高效旅游管理系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!