站畢設(shè)全攻略:源碼、論文與答辯PPT詳解)
簡介在Java Web開發(fā)領(lǐng)域SpringBoot憑借約定大于配置、內(nèi)嵌容器等特性大幅降低了項目搭建門檻已成為企業(yè)級應(yīng)用和畢業(yè)設(shè)計的主流選擇。結(jié)合MyBatis與MySQL開發(fā)者可以高效實現(xiàn)數(shù)據(jù)持久化與業(yè)務(wù)邏輯分離。權(quán)限控制、文件上傳、分頁搜索等經(jīng)典功能模塊則是理解Web系統(tǒng)設(shè)計的關(guān)鍵實踐場景。對于準(zhǔn)備畢業(yè)設(shè)計的學(xué)生而言選擇一個功能完整、技術(shù)棧穩(wěn)定的項目至關(guān)重要。校園新聞網(wǎng)站恰好覆蓋前后端交互、數(shù)據(jù)庫設(shè)計、角色權(quán)限管理等核心知識點(diǎn)既能鍛煉工程能力又便于論文撰寫與答辯展示。本文圍繞SpringBoot校園新聞網(wǎng)站的完整開發(fā)流程從技術(shù)選型、數(shù)據(jù)庫設(shè)計到核心功能實現(xiàn)再到論文編寫與答辯PPT制作系統(tǒng)梳理實踐要點(diǎn)與避坑經(jīng)驗為同類畢設(shè)任務(wù)提供可直接參考的完整方案。 畢設(shè)避坑指南我從零做完一個SpringBoot校園新聞網(wǎng)站源碼、論文和答辯PPT一次講透如果你正在為畢業(yè)設(shè)計發(fā)愁或者想找一個既能應(yīng)付答辯、又能真正學(xué)到東西的Java Web項目SpringBoot校園新聞網(wǎng)站絕對是一個經(jīng)典到不能再經(jīng)典的選題。它不復(fù)雜但五臟俱全前端展示、后臺管理、數(shù)據(jù)庫設(shè)計、權(quán)限控制、文件上傳……這些畢業(yè)設(shè)計答辯時老師最愛問的點(diǎn)一個不落。我自己當(dāng)初就是選了這么一個項目從搭環(huán)境到最后答辯通過前后折騰了將近兩個月踩了不少坑也積累了不少經(jīng)驗。這篇文章就把整個項目的設(shè)計與實現(xiàn)思路、核心代碼邏輯、論文編寫要點(diǎn)和答辯PPT的制作思路一次講清楚源碼和配套文檔的思路也會一并拆解希望能給正在做同類項目的你提供一份“抄作業(yè)”級別的參考。1. 項目整體設(shè)計與技術(shù)選型解析1.1 為什么選SpringBoot而不是SSH或SSM很多學(xué)校其實還在教SSHStruts2 Spring Hibernate或者SSMSpring SpringMVC MyBatis但如果你問我畢設(shè)選什么我強(qiáng)烈建議直接用SpringBoot。原因很簡單省去大量XML配置項目能在幾分鐘內(nèi)跑起來。在畢設(shè)答辯現(xiàn)場老師要看的是你能不能把項目啟動、演示功能而不是聽你解釋web.xml里配了多少個監(jiān)聽器。SpringBoot的核心優(yōu)勢在于“約定大于配置”。內(nèi)嵌Tomcat打包成jar直接java -jar就能跑不需要單獨(dú)裝Tomcat、不需要手動部署war包。對于畢設(shè)這種需要快速演示的場景來說這個優(yōu)勢特別大。另外SpringBoot的生態(tài)非常成熟集成MyBatis、Spring Security、Thymeleaf、Spring Data JPA都是幾行配置的事方便我們在論文里寫“本系統(tǒng)基于SpringBoot框架實現(xiàn)了快速開發(fā)與模塊化設(shè)計”。但要注意一個點(diǎn)SpringBoot版本不要追新。我見過很多同學(xué)一上來就裝Spring Boot 3.x結(jié)果MyBatis、druid這些老牌依賴兼容性出問題光調(diào)依賴就調(diào)了一周。做畢設(shè)最穩(wěn)妥的版本是Spring Boot 2.x系列比如2.5.4、2.7.xJDK用1.8或者11就夠了。不是越新越好穩(wěn)定能跑才是第一位的。1.2 技術(shù)棧選擇與前后端方案權(quán)衡校園新聞網(wǎng)站的整體技術(shù)棧市面上主流有兩種組合方案ASpringBoot Thymeleaf模板引擎 MyBatis MySQL。前后端不分離頁面由服務(wù)端渲染。方案BSpringBoot Vue Axios MyBatis MySQL。前后端分離前端工程化。我個人的建議除非你對Vue已經(jīng)非常熟否則選方案A。原因很現(xiàn)實畢設(shè)的評分重點(diǎn)在“功能完整度 論文邏輯 答辯表述”而不是技術(shù)棧的新舊。Thymeleaf的語法和HTML差不多學(xué)習(xí)成本極低而且不用處理跨域問題CORS不用單獨(dú)啟動Node服務(wù)部署時一個jar包就搞定。方案B雖然看上去更“高大上”但你要多維護(hù)一套前端工程答辯時也會被追問“你是怎么解決跨域的”“Nginx你配過嗎”這類問題回答不上來反而減分。如果學(xué)校明確要求前后端分離那就另當(dāng)別論但純做后端渲染的校園新聞網(wǎng)站完全夠用而且能省下大量時間打磨論文和答辯PPT。1.3 項目目錄結(jié)構(gòu)與核心依賴配置先列一個我使用下來的項目目錄結(jié)構(gòu)大家可以直接參考src/main/java/com/example/news/ ├── controller/ // Control層接收請求 │ ├── AdminController.java │ ├── NewsController.java │ ├── CategoryController.java │ └── UserController.java ├── service/ // Service層業(yè)務(wù)邏輯 │ ├── NewsService.java │ ├── CategoryService.java │ ├── UserService.java │ └── CommentService.java ├── mapper/ // MyBatis的Mapper接口 │ ├── NewsMapper.java │ ├── CategoryMapper.java │ └── UserMapper.java ├── entity/ // 數(shù)據(jù)庫實體類 │ ├── News.java │ ├── Category.java │ ├── User.java │ └── Comment.java ├── common/ // 通用工具類 │ ├── Result.java // 統(tǒng)一返回結(jié)果 │ └── PageResult.java // 分頁結(jié)果封裝 └── NewsApplication.java // SpringBoot啟動類Maven的pom.xml里核心依賴就這幾個!-- 核心框架 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- 模板引擎 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-thymeleaf/artifactId /dependency !-- MyBatis集成 -- dependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter/artifactId version2.2.2/version /dependency !-- MySQL驅(qū)動 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope /dependency !-- 權(quán)限控制可選但建議加 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-security/artifactId /dependency注意如果用了Security務(wù)必記得寫配置類否則默認(rèn)會攔截所有請求并彈出登錄框。很多同學(xué)第一次啟動項目發(fā)現(xiàn)頁面打不開就是這個原因。application.yml里的核心配置server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/campus_news?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.example.news.entity configuration: map-underscore-to-camel-case: true file: upload-path: /usr/local/upload/ # 圖片上傳路徑Windows下改成 D:/upload/注意一個細(xì)節(jié)serverTimezoneAsia/Shanghai必須加否則JDBC連接MySQL 8.x時會報時區(qū)錯誤。這個坑幾乎每個人都會踩。2. 系統(tǒng)需求分析與數(shù)據(jù)庫設(shè)計2.1 用戶角色與核心功能拆解校園新聞網(wǎng)站的核心用戶角色有三個普通訪客游客、管理員、新聞發(fā)布員。如果擴(kuò)展開還可以有新聞審核員但畢設(shè)做到三種角色已經(jīng)足夠了。普通訪客能干什么瀏覽首頁新聞列表、按分類查看新聞、搜索新聞、查看新聞詳情、注冊登錄后發(fā)表評論。管理員能干什么除訪客權(quán)限外還能進(jìn)入后臺管理界面維護(hù)新聞分類、管理用戶賬號禁用/啟用、審核新聞內(nèi)容可選、管理評論刪除違規(guī)評論。新聞發(fā)布員能干什么登錄后可以發(fā)布新聞、編輯自己發(fā)布的新聞、刪除自己的新聞。這個角色實際上就是管理員的一個細(xì)分在權(quán)限控制上可以復(fù)用同一套邏輯也可以通過角色標(biāo)識區(qū)分。很多同學(xué)做出來的網(wǎng)站看上去功能很全但實際上只是一個“新聞?wù)故? 增刪改查”的堆砌。我建議在論文里一定要用用例圖把這三個角色的權(quán)限邊界畫清楚這不僅是軟件工程課程的硬性要求也是答辯老師評估你“系統(tǒng)分析能力”的重要標(biāo)準(zhǔn)。2.2 新聞系統(tǒng)和數(shù)據(jù)庫表設(shè)計數(shù)據(jù)庫設(shè)計是整個項目的根基。設(shè)計得好后期寫代碼非常順暢設(shè)計亂了后期各種SQL關(guān)聯(lián)查詢會讓你懷疑人生。我當(dāng)時把項目翻了一次盤就是因為第一版設(shè)計少了一張評論表導(dǎo)致后面硬編碼字符串存評論內(nèi)容極其痛苦。核心表我建議至少設(shè)計這五張分類表category字段名類型說明idint主鍵自增namevarchar(50)分類名稱比如“校園通知”“學(xué)術(shù)活動”sortint排序字段數(shù)值越小越靠前create_timedatetime創(chuàng)建時間新聞表news字段名類型說明idint主鍵自增category_idint分類ID外鍵titlevarchar(200)新聞標(biāo)題summaryvarchar(500)摘要列表頁展示contenttext正文內(nèi)容富文本cover_imagevarchar(255)封面圖URLauthor_idint發(fā)布人IDview_countint瀏覽量statustinyint0草稿1已發(fā)布2已下架create_timedatetime發(fā)布時間用戶表user字段名類型說明idint主鍵自增usernamevarchar(50)用戶名唯一passwordvarchar(255)密碼MD5或BCrypt加密nicknamevarchar(50)昵稱roletinyint角色1管理員2發(fā)布員3普通用戶avatarvarchar(255)頭像URLstatustinyint0禁用1正常create_timedatetime注冊時間評論表comment字段名類型說明idint主鍵自增news_idint新聞IDuser_idint評論用戶IDcontentvarchar(500)評論內(nèi)容create_timedatetime評論時間新聞圖片表news_image可選很多校園新聞會有多圖展示需求如果只存一個封面圖不夠建議加一張子表存儲正文中的圖片路徑。不過如果對功能要求不高也可以直接把圖片以img標(biāo)簽的形式嵌入富文本內(nèi)容中省一張表。SQL的建表語句里注意幾點(diǎn)字符集用utf8mb4不要用utf8。因為utf8在MySQL里最多存3字節(jié)而一些生僻字和Emoji表情是4字節(jié)編碼一旦用戶輸入了這些內(nèi)容直接報錯。這個坑非常隱蔽我當(dāng)初排查了很久才發(fā)現(xiàn)是字符集問題。2.3 核心流程設(shè)計發(fā)布、審核與展示的邏輯很多畢設(shè)項目做出來功能是通的但流程是亂的。比如用戶發(fā)布的新聞直接出現(xiàn)在首頁沒有任何審核機(jī)制這在答辯時是比較容易被質(zhì)疑的點(diǎn)如果這是“校園新聞網(wǎng)站”那惡意用戶發(fā)垃圾新聞怎么辦所以我在設(shè)計時加了一個狀態(tài)機(jī)新聞從“草稿 - 待審核 - 已發(fā)布 - 下架”。發(fā)布員提交新聞后狀態(tài)為“待審核”管理員在后臺能看到待審核列表點(diǎn)擊通過后新聞才會出現(xiàn)在前臺首頁。如果管理員駁回可以填寫駁回原因可選。這個設(shè)計本身邏輯不難但在論文里可以寫出一小節(jié)“系統(tǒng)核心業(yè)務(wù)流程設(shè)計”配上流程圖B格直接拉滿。而且在答辯時如果老師問“你怎么避免垃圾內(nèi)容被公開展示”你就可以理直氣壯地回答“我設(shè)計了審核機(jī)制”。這比“我的系統(tǒng)功能都有只是沒做審核”要有說服力得多。3. 核心功能實現(xiàn)與難點(diǎn)攻克3.1 登錄鑒權(quán)與權(quán)限控制的兩種實現(xiàn)方式用戶登錄和權(quán)限控制是每個Web項目的核心也是答辯老師必問的內(nèi)容。校園新聞網(wǎng)站的權(quán)限控制有兩種常見實現(xiàn)方式第一種是使用Spring Security JWT或Session。優(yōu)點(diǎn)是安全性高、擴(kuò)展性好缺點(diǎn)是配置復(fù)雜對初學(xué)者不太友好。如果你對Security不熟光一個SecurityConfig就能卡你一星期。第二種是使用攔截器HandlerInterceptor Session自己寫一套簡單的權(quán)限校驗邏輯。優(yōu)點(diǎn)是代碼透明、容易理解論文里也好解釋缺點(diǎn)是安全性不如Security全面。我的建議如果只是為了畢設(shè)用第二種完全足夠。寫一個LoginInterceptor在preHandle方法里判斷Session中是否存在登錄用戶再判斷訪問路徑是否以/admin開頭且用戶角色是否為管理員。核心代碼只有十幾行。Component public class LoginInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String uri request.getRequestURI(); // 如果是后臺路徑必須登錄且為管理員 if (uri.startsWith(/admin)) { User user (User) request.getSession().getAttribute(loginUser); if (user null) { response.sendRedirect(/login); return false; } if (user.getRole() ! 1) { response.setContentType(text/html;charsetutf-8); response.getWriter().write(scriptalert(無權(quán)限訪問);location.href/;/script); return false; } } return true; } }上面的代碼里role字段1表示管理員2表示發(fā)布員3表示普通用戶。這里我特別留意了“路徑前綴匹配”的方式后臺所有頁面統(tǒng)一放在/admin/**下面管理起來非常方便。配置一下WebMvcConfigurer把攔截器注冊進(jìn)去就行Configuration public class WebConfig implements WebMvcConfigurer { Resource private LoginInterceptor loginInterceptor; Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(loginInterceptor) .addPathPatterns(/**) .excludePathPatterns(/login, /register, /css/**, /js/**, /images/**, /news/**); } }關(guān)于密碼加密別用MD5了容易被問倒?,F(xiàn)在主流是BCrypt加密Spring Security里就自帶BCryptPasswordEncoder。你不需要引入整個Spring Security單獨(dú)引入spring-security-crypto這個依賴也可以使用BCryptPasswordEncoder。在注冊時對密碼加密登錄時用matches方法校驗。// 注冊時加密 String encodedPwd new BCryptPasswordEncoder().encode(user.getPassword()); user.setPassword(encodedPwd); // 登錄時校驗 boolean match new BCryptPasswordEncoder().matches(rawPassword, user.getPassword());這個加密方式在論文“系統(tǒng)安全設(shè)計”那一小節(jié)里寫出來會顯得比較專業(yè)。3.2 新聞發(fā)布中的圖片上傳與富文本處理圖片上傳是校園新聞網(wǎng)站里最容易出Bug的功能。核心難點(diǎn)有兩個一是文件存儲路徑。開發(fā)環(huán)境下的D:/upload和生產(chǎn)環(huán)境下的/usr/local/upload不一樣如果硬編碼在代碼里換環(huán)境就掛。我的做法是在application.yml里配置一個變量然后在Controller中通過Value注入。二是靜態(tài)資源映射。SpringBoot的默認(rèn)靜態(tài)資源路徑是classpath:/static/你把圖片傳到磁盤上默認(rèn)是訪問不到的。需要在WebConfig里配置虛擬路徑映射Override public void addResourceHandlers(ResourceHandlerRegistry registry) { String uploadPath fileUploadPath /; registry.addResourceHandler(/upload/**) .addResourceLocations(file: uploadPath); }Controller層接收上傳文件的代碼大致是PostMapping(/admin/news/uploadImage) ResponseBody public Result uploadImage(RequestParam(file) MultipartFile file) { if (file.isEmpty()) { return Result.error(文件不能為空); } String originalFilename file.getOriginalFilename(); String ext originalFilename.substring(originalFilename.lastIndexOf(.)); // 校驗文件類型防止上傳jsp等危險文件 ListString allowTypes Arrays.asList(.jpg, .jpeg, .png, .gif); if (!allowTypes.contains(ext.toLowerCase())) { return Result.error(圖片格式不支持); } String newName UUID.randomUUID().toString().replace(-, ) ext; File dest new File(uploadPath newName); try { file.transferTo(dest); return Result.success(/upload/ newName); } catch (IOException e) { e.printStackTrace(); return Result.error(上傳失敗); } }提示文件名必須用UUID重命名不能用用戶上傳的原始文件名。一是防止文件名重復(fù)覆蓋二是避免中文文件名在Linux環(huán)境下亂碼三是能避免路徑穿越攻擊。富文本編輯器推薦用UEditor或者WangEditor。WangEditor更輕量而且MIT協(xié)議用在畢設(shè)里沒有版權(quán)問題。前端引入JS后通過editor.getHtml()把富文本內(nèi)容提交到后端。后端直接存content字段就行不需要額外處理展示時用th:utext而不是th:text來渲染否則HTML標(biāo)簽會原樣顯示。關(guān)于XSS攻擊直接用th:utext是存在安全隱患的用戶如果提交了script標(biāo)簽會被瀏覽器執(zhí)行。有的項目選擇用Jsoup來做HTML白名單過濾去掉script、iframe等標(biāo)簽是很穩(wěn)妥的做法。論文中把這一點(diǎn)作為“系統(tǒng)安全防護(hù)措施”寫進(jìn)去很加分。3.3 首頁數(shù)據(jù)展示、分頁與搜索的實現(xiàn)細(xì)節(jié)校園新聞網(wǎng)站的門面就是首頁。我的首頁設(shè)計是頂部導(dǎo)航欄顯示新聞分類中間是輪播圖展示前5條置頂新聞下面按照分類展示最新新聞列表。分頁查詢建議用MyBatis的分頁插件PageHelper非常成熟用法也簡單// Service中 PageHelper.startPage(pageNum, pageSize); ListNews newsList newsMapper.selectByCategoryId(categoryId); PageInfoNews pageInfo new PageInfo(newsList);PageInfo里包含了總記錄數(shù)、總頁數(shù)、當(dāng)前頁等所有信息直接返回給前端使用即可。需要注意一點(diǎn)PageHelper.startPage只對接下來查詢到的第一條SQL生效所以在調(diào)用startPage之后必須緊跟Mapper查詢中間不要夾雜其他SQL。搜索功能的實現(xiàn)也很簡單在NewsMapper.xml里加一條動態(tài)SQLselect idsearchNews resultTypecom.example.news.entity.News SELECT * FROM news where if testkeyword ! null and keyword ! AND title LIKE CONCAT(%, #{keyword}, %) /if if testcategoryId ! null AND category_id #{categoryId} /if AND status 1 /where ORDER BY create_time DESC /select這里用where標(biāo)簽可以自動處理多個條件拼接時的AND問題是一個細(xì)節(jié)技巧。如果用trim標(biāo)簽也可以但新手更容易出錯建議直接用where。搜索這塊還有一個容易被忽視的點(diǎn)關(guān)鍵詞的防注入。MyBatis的#{}是預(yù)編譯方式天然防SQL注入所以上面這么寫是安全的。如果你用了${}那就非常危險了直接寫進(jìn)論文里會變成一個負(fù)面案例。3.4 三個容易翻車的細(xì)節(jié)時間格式化、事務(wù)回滾、日志輸出我在做這個項目時有幾個小細(xì)節(jié)反復(fù)折磨人這里一并分享出來。第一個是時間格式化。默認(rèn)情況下從MySQL查出來的datetime字段是java.util.Date類型直接用${news.createTime}輸出會是一長串英文格式比如Tue Aug 15 10:30:00 CST 2023非常不美觀。解決方案有兩個一是在實體類的字段上加JsonFormat注解如果是返回JSON二是直接在service層轉(zhuǎn)換成String類型并格式化為yyyy-MM-dd HH:mm:ss。更簡單的方案是在Thymeleaf模板中用#temporals工具類處理但語法稍微復(fù)雜一些。我當(dāng)時直接在實體里加了一個格式化方法public String getCreateTimeStr() { if (this.createTime null) { return ; } SimpleDateFormat sdf new SimpleDateFormat(yyyy-MM-dd HH:mm); return sdf.format(this.createTime); }然后在頁面上th:text${news.createTimeStr}即可簡單省事。第二個是事務(wù)問題。一個新聞發(fā)布流程可能涉及兩次數(shù)據(jù)庫操作插入新聞主記錄、更新分類下的新聞數(shù)量如果設(shè)計了冗余字段。第一次成功、第二次失敗的話就會造成數(shù)據(jù)不一致。加上Transactional注解是最基本的Transactional(rollbackFor Exception.class) public void addNews(News news) { newsMapper.insert(news); categoryMapper.increaseCount(news.getCategoryId()); }注意rollbackFor Exception.class必須寫因為Spring默認(rèn)只在拋出RuntimeException時才回滾。如果你在實際中拋出了一個受檢異常Exception不寫這個參數(shù)就不會回滾很容易踩坑。第三個是日志。很多同學(xué)在排查問題時全靠System.out.println()項目里到處是輸出語句答辯時演示頁面控制臺一片紅看起來很不專業(yè)。建議用SLF4J Logback的組合SpringBoot默認(rèn)已經(jīng)集成了只需在類上聲明Slf4j Service public class NewsServiceImpl implements NewsService { // 業(yè)務(wù)代碼 }Slf4j是Lombok提供的注解能自動生成log對象在關(guān)鍵節(jié)點(diǎn)打日志。論文里也可以寫“本系統(tǒng)采用SLF4J日志框架為系統(tǒng)運(yùn)維提供了可靠依據(jù)”之類的描述顯得系統(tǒng)更規(guī)范。4. 論文編寫與PPT答辯全流程這一部分其實很多人忽視但在實際評分中論文和答辯PPT的比重往往和代碼差不多甚至更高。見過不少項目功能做的很棒、論文寫得稀爛的最終成績并不理想。血的教訓(xùn)告訴我畢設(shè)不只是寫代碼更是“做材料”。4.1 論文結(jié)構(gòu)怎么搭才合理一份完整的畢業(yè)設(shè)計論文結(jié)構(gòu)一般是摘要中英文各一頁第一章 緒論背景與意義、國內(nèi)外研究現(xiàn)狀、主要工作第二章 相關(guān)技術(shù)介紹SpringBoot、MyBatis、MySQL、Thymeleaf第三章 系統(tǒng)分析需求分析、可行性分析、用例圖、功能模塊圖第四章 系統(tǒng)設(shè)計總體架構(gòu)、數(shù)據(jù)庫設(shè)計、核心類設(shè)計第五章 系統(tǒng)實現(xiàn)界面截圖 核心代碼 文字說明第六章 系統(tǒng)測試測試用例表格、測試結(jié)果分析最容易出現(xiàn)的問題技術(shù)介紹部分大段百度抄和后面系統(tǒng)設(shè)計脫節(jié)。我建議“相關(guān)技術(shù)介紹”這一章可以控制在4-6頁把SpringBoot的核心特性、MyBatis的工作流程寫清楚就行要給后面系統(tǒng)設(shè)計留足空間。核心的專業(yè)性體現(xiàn)在第四章和第五章。數(shù)據(jù)庫設(shè)計部分E-R圖一定要畫最好用Visio或者draw.io畫得干凈一點(diǎn)。每張表都要給出設(shè)計表格并描述每個字段的含義。系統(tǒng)實現(xiàn)部分每個功能模塊至少配一張界面截圖加一段核心代碼代碼不需要很長的完整類挑關(guān)鍵代碼片段即可。摘要這部分很容易被忽略但導(dǎo)師一定第一個看。摘要不要寫“本文研究了……”“本文介紹了……”而是要寫清楚“系統(tǒng)包含哪些功能模塊、采用什么技術(shù)方案、達(dá)到了什么效果”。三四句話把精華說清楚比套話強(qiáng)得多。4.2 答辯PPT的制作思路與內(nèi)容組織答辯PPT不用追求頁數(shù)多但每一頁都要有價值。我的PPT只有12頁但邏輯非常完整封面題目、姓名、學(xué)號、指導(dǎo)老師目錄研究背景與意義1頁簡要說明為什么做這個系統(tǒng)系統(tǒng)技術(shù)架構(gòu)1頁畫一個簡單的技術(shù)架構(gòu)圖功能模塊介紹1頁用系統(tǒng)功能結(jié)構(gòu)圖展示核心功能演示3-4頁放關(guān)鍵界面截圖配一兩個核心代碼或核心設(shè)計點(diǎn)數(shù)據(jù)庫設(shè)計展示1頁關(guān)鍵表結(jié)構(gòu)截圖即可系統(tǒng)測試結(jié)果1頁放關(guān)鍵測試用例和結(jié)果總結(jié)與展望1頁P(yáng)PT制作注意配色統(tǒng)一不要用花哨的模板。技術(shù)類答辯白色背景 深色文字是最穩(wěn)的。每頁文字不要多控制在5行以內(nèi)答辯時PPT只是輔助重點(diǎn)是你的口頭表達(dá)。功能演示部分建議錄制一段短視頻嵌入PPT這樣可以避免現(xiàn)場網(wǎng)絡(luò)、環(huán)境問題導(dǎo)致的演示失敗。如果現(xiàn)場允許用瀏覽器打開系統(tǒng)live演示效果更好但要確保提前把所有環(huán)境都跑通避免現(xiàn)場連不上數(shù)據(jù)庫。4.3 答辯現(xiàn)場的高頻問題與解答策略答辯時老師問的問題基本都是圍繞系統(tǒng)本身我根據(jù)自己的答辯經(jīng)驗和周圍同學(xué)的經(jīng)歷整理了下面幾個高頻問題及應(yīng)對策略問為什么選SpringBoot不用SSM答SpringBoot簡化了Spring的配置復(fù)雜度內(nèi)嵌服務(wù)器、自動配置等特性可以大幅提高開發(fā)效率。從工程實踐角度目前企業(yè)級項目使用SpringBoot的比例遠(yuǎn)高于傳統(tǒng)SSM學(xué)習(xí)SpringBoot也更貼近行業(yè)技術(shù)趨勢。問登錄功能是怎么實現(xiàn)的密碼安全嗎答登錄采用Session實現(xiàn)會話保持密碼使用BCrypt加密存儲登錄校驗時會進(jìn)行加密密碼的匹配而不是明文比對。問系統(tǒng)是如何避免SQL注入的答MyBatis框架本身使用了預(yù)編譯機(jī)制#{}占位符會在發(fā)送SQL前進(jìn)行參數(shù)預(yù)編譯這樣用戶輸入的特殊字符就會被當(dāng)作普通字符串不能改變SQL語義。問如果用戶量很大頁面的性能如何優(yōu)化答可以從加Redis緩存熱點(diǎn)新聞緩存、數(shù)據(jù)庫索引優(yōu)化、靜態(tài)資源CDN加速幾個角度回答。最好還能結(jié)合自己常用的場景提出問題然后從上面的角度回答記住這個是加分項。問什么是事務(wù)在這個系統(tǒng)里哪里用到了答事務(wù)是一組不可分割的操作。比如在系統(tǒng)中發(fā)布新聞的同時更新分類下的新聞數(shù)量兩個操作必須同時成功或同時失敗這就是事務(wù)的應(yīng)用場景。核心策略答辯前把上述問題背熟結(jié)合自己的系統(tǒng)舉例子不要只背概念。5. 常見問題與排查技巧實錄5.1 啟動報錯排查速查表我把做項目過程中實際遇到過的高頻報錯整理成了一個表格方便你對照排查報錯現(xiàn)象可能原因解決方法java.sql.SQLException: The server time zone valueJDBC連接缺少時區(qū)參數(shù)url中添加serverTimezoneAsia/ShanghaiFailed to configure a DataSource沒有配置數(shù)據(jù)源或yml配置沒被識別檢查application.yml中spring.datasource配置啟動后訪問頁面顯示W(wǎng)hitelabel Error PageController路徑或者模板路徑錯誤檢查Controller和GetMapping注解路徑是否匹配Invalid bound statement (not found)Mapper接口和XML文件沒綁定檢查namespace是否和接口全限定名一致檢查mapper-locations配置Bean named xxx is not foundService或Mapper沒加注解或者缺MapperScanController注入的Service加Service注解啟動類加MapperScan(xxx.mapper)上傳圖片后訪問404靜態(tài)資源映射沒配置檢查addResourceHandlers配置是否正確5.2 頁面顯示正常但CSS樣式丟失這個問題一般出現(xiàn)在部署到Linux服務(wù)器時。原因基本上是兩個一是路徑問題。模板頁面中引用的CSS路徑如果是絕對路徑/css/style.css而且部署時項目名帶上下文路徑那就會找不到樣式。最穩(wěn)妥的做法是用Thymeleaf的URL表達(dá)式th:href{/css/style.css}它會自動拼接上下文路徑。二是文件編碼問題。Windows下開發(fā)默認(rèn)使用GBK編碼而Linux下默認(rèn)是UTF-8如果頁面中的中文亂碼了八成是編碼問題。建議所有文件統(tǒng)一使用UTF-8編碼并在application.yml中配置spring: thymeleaf: encoding: UTF-85.3 修改了數(shù)據(jù)庫表結(jié)構(gòu)但代碼報字段不存在這個問題的根源是MyBatis的二級緩存。默認(rèn)情況下MyBatis開啟了本地緩存如果你改了表結(jié)構(gòu)但實體類沒有同步更新MyBatis會緩存上一次的映射結(jié)果導(dǎo)致SQL查詢的字段和實體屬性對不上。排查思路清掉Maven的target目錄重新mvn clean同時檢查實體類字段和數(shù)據(jù)庫字段是否一致另外檢查map-underscore-to-camel-case配置它決定了create_time能否自動映射到createTime。我遇到過最奇葩的一個情況是數(shù)據(jù)庫里加了summary字段實體類也加了但查詢結(jié)果一直是null。最后排查發(fā)現(xiàn)是XML文件里的resultMap沒有同步加這個字段的映射。所以如果你的實體類有字段但查出來為null記得檢查resultMap。5.4 論文查重與降重技巧最后聊一個非技術(shù)但非常重要的話題論文查重。SpringBoot校園新聞網(wǎng)站的論文網(wǎng)上模板非常多很容易查重率超標(biāo)。我的降重經(jīng)驗有三個一是把技術(shù)介紹部分用自己的話重寫。比如“SpringBoot是由Pivotal團(tuán)隊提供的全新框架其設(shè)計目的是用來簡化Spring應(yīng)用的初始搭建以及開發(fā)過程”改成“SpringBoot是Spring生態(tài)體系的延伸它在Spring框架的基礎(chǔ)上實現(xiàn)了自動化配置讓開發(fā)者能夠以更少的配置完成項目的搭建”。意思一樣但表達(dá)方式變了。二是多用圖表。圖表中的內(nèi)容是不參與查重的把一些流程性、框架性的內(nèi)容用流程圖和架構(gòu)圖表示既能降低查重率又顯得論文更專業(yè)。三是核心代碼部分適當(dāng)精簡不要整段粘貼大段源碼只保留關(guān)鍵代碼段并用文字說明邏輯一樣能起到解釋作用但有效避免了代碼重復(fù)問題。最后的心里話做完這個SpringBoot校園新聞網(wǎng)站畢業(yè)設(shè)計我最大的體會是畢設(shè)項目不需要多么高深的技術(shù)但一定要是一個“完整的故事”。從需求分析到數(shù)據(jù)庫設(shè)計從編碼實現(xiàn)到測試部署每一步都能自圓其說答辯時能講清楚“為什么這么做”這比炫耀技術(shù)棧更有用。SpringBoot校園新聞網(wǎng)站雖然看起來只是簡單的增刪改查但當(dāng)你認(rèn)真做完每一個模塊、踩完每一個坑你會發(fā)現(xiàn)SpringBoot的自動配置原理、MyBatis的映射機(jī)制、MySQL表設(shè)計的基本原則都在這個項目里得到了最直觀的驗證。如果你也在做這個項目希望這篇文章能幫你少走一些彎路。遇到具體問題卡住了別硬扛先看日志再查配置最后帶著報錯信息去搜索引擎找答案絕大多數(shù)坑都有人替你踩過了。本文還有配套的精品資源點(diǎn)擊獲取