查系統(tǒng)從開發(fā)到論文全流程解析)
簡介這是一套完整的基于SpringBoot與Vue的在線問卷調(diào)查系統(tǒng)畢業(yè)設(shè)計資源面向計算機專業(yè)本科生及Java全棧初學(xué)者解決課程設(shè)計、畢設(shè)選題與前后端協(xié)同開發(fā)實踐需求。資源包含755個文件涵蓋101個Java后端邏輯文件、50個Vue前端組件、160個JS交互腳本、53個CSS樣式文件、79個GIF動效資源及1個SQL數(shù)據(jù)庫腳本完整支撐系統(tǒng)部署與二次開發(fā)壓縮包大小23.59MB結(jié)構(gòu)清晰含build/run/install三類批處理腳本便于快速啟動。已有86人學(xué)習(xí)下載資源附帶可直接運行的源碼、MySQL建庫建表腳本、管理員與用戶雙角色功能模塊含問卷管理、題目統(tǒng)計、新聞資訊、輪播圖等后臺功能以及配套畢業(yè)論文框架開箱即用顯著降低畢設(shè)開發(fā)門檻與調(diào)試成本。基于SpringBootVue的在線問卷調(diào)查系統(tǒng)從選題到跑通再到寫論文的全過程記錄最近幫一個學(xué)弟把關(guān)他的畢業(yè)設(shè)計題目就是在線問卷調(diào)查系統(tǒng)技術(shù)棧是SpringBootMySQLMavenVue附帶源碼、數(shù)據(jù)庫腳本和畢業(yè)論文。這個組合在計算機畢業(yè)設(shè)計里可以說非常經(jīng)典了但正因為經(jīng)典很多人只是在Gitee上找個項目下載下來跑起來就以為完事了——結(jié)果答辯的時候連自己項目里的表結(jié)構(gòu)都說不清楚更別提被老師問幾句就卡殼。這篇文章我打算從實際做項目的角度把這個問卷系統(tǒng)從選題邏輯、技術(shù)選型、數(shù)據(jù)庫設(shè)計、前后端核心流程到畢業(yè)論文寫作、常見坑排查完整地過一遍。如果你正好也在做類似題目或者手頭已經(jīng)有了這份源碼但還沒完全吃透這篇文章應(yīng)該能幫你省下不少時間。1. 這個選題為什么值得做問卷系統(tǒng)背后的業(yè)務(wù)邏輯遠比你想的復(fù)雜很多同學(xué)選畢業(yè)設(shè)計題目時有兩個極端要么選一個網(wǎng)上教程滿天飛的圖書管理系統(tǒng)做出來千篇一律答辯時老師看一眼就pass要么選一個偏算法或底層框架的方向結(jié)果半年都沒能落地。問卷調(diào)查系統(tǒng)屬于典型的看起來簡單、做起來有內(nèi)容的題目。表面上看問卷系統(tǒng)無非就是管理員創(chuàng)建問卷、用戶填寫問卷、查看統(tǒng)計結(jié)果這三件事。但如果你真正去梳理需求會發(fā)現(xiàn)這里面藏著好幾層業(yè)務(wù)邏輯。第一層是問卷本身的生命周期。一份問卷從創(chuàng)建到真正投放要經(jīng)歷草稿態(tài)、發(fā)布態(tài)、關(guān)閉態(tài)。草稿態(tài)的問卷可以隨意編輯一旦發(fā)布就不能再改題目了否則之前填過的數(shù)據(jù)就對不上。這個狀態(tài)流轉(zhuǎn)的設(shè)計是最容易體現(xiàn)一個開發(fā)者對業(yè)務(wù)理解深度的地方。第二層是題型維度的差異。常見題型有單選題、多選題、填空題、下拉選擇題、評分題有些系統(tǒng)還需要矩陣題即一組題目共用一組選項。不同題型的數(shù)據(jù)存儲方式不一樣單選題存一個選項ID就行多選題可能要存逗號分隔的多個選項ID填空題就是純文本。如果一開始表結(jié)構(gòu)設(shè)計得不夠靈活后面兼容新題型會非常痛苦。第三層是數(shù)據(jù)統(tǒng)計的需求。用戶填完問卷只是第一步管理員真正關(guān)心的是每個選項被選了多少次參與總?cè)藬?shù)是多少各題目的回收率如何這些統(tǒng)計結(jié)果需要從答卷表里實時聚合出來。如果只是用group by硬查數(shù)據(jù)量一上來就會出現(xiàn)明顯的性能瓶頸這時候就需要考慮緩存或者預(yù)聚合。第四層是權(quán)限控制。普通用戶和管理員看到的東西完全不一樣用戶能看到已發(fā)布的問卷、填寫問卷、查看自己的填寫記錄管理員能管理所有問卷、查看詳情、導(dǎo)出數(shù)據(jù)。沒有SSO和RBAC那一套復(fù)雜體系但至少要保證基本的越權(quán)防護不能讓普通用戶通過改URL參數(shù)就刪掉別人的問卷。所以你看這個題目雖然入門容易但要做到能答辯、能講清楚、能扛住追問其實需要你把CRUD背后的業(yè)務(wù)規(guī)則理解透徹。這也正是老師希望通過這個題目考察你的東西能不能把一個真實場景的問題抽象成合理的數(shù)據(jù)模型和代碼結(jié)構(gòu)。2. 技術(shù)棧選型為什么偏偏是SpringBootMySQLMavenVue而不是別的組合選技術(shù)棧這件事很多同學(xué)的思路是學(xué)長用啥我用啥或者推薦系統(tǒng)里有啥我用啥。但實際上這個組合能成為畢業(yè)設(shè)計的主流選擇是有它內(nèi)在邏輯的。SpringBoot解決的是后端開發(fā)效率問題。如果你的項目用的是SSHSpringMVCSpringHibernate那套老古董光是各種XML配置就能寫掉你一個月的時間而且你寫的大部分配置跟你做的業(yè)務(wù)沒有任何關(guān)系。SpringBoot通過自動配置和起步依賴把搭建一個能跑起來的Web項目這件事壓縮到了幾分鐘。對于畢設(shè)來講你省下的時間可以用來打磨業(yè)務(wù)代碼和寫論文而不是跟配置死磕。MySQL的選擇幾乎沒有懸念。因為無論你以后進哪家公司關(guān)系型數(shù)據(jù)庫的基本功都是必須要過的關(guān)卡。MySQL的JDBC驅(qū)動、連接池比如Druid或HikariCP、ORM框架MyBatis或JPA這些在SpringBoot生態(tài)里都有非常成熟的整合方案你只要學(xué)會基本的SQL寫法就能完成絕大多數(shù)功能。相比之下如果一上來就用MongoDB或者Elasticsearch這種偏門數(shù)據(jù)庫不僅學(xué)習(xí)成本高答辯時老師也會質(zhì)疑你為什么要在這個場景下引入非關(guān)系型數(shù)據(jù)庫。Maven解決的是依賴管理和構(gòu)建問題。這個可能被很多同學(xué)忽視但它實際幫你省了大事。SpringBoot官方推薦使用Maven或Gradle來管理項目因為你的項目要依賴Controller、Service、Mapper、JWT、Lombok等十幾個甚至幾十個Jar包如果用最原始的方式手動把Jar包往lib目錄里拷版本沖突能把人逼瘋。Maven有了中央倉庫的機制后你在pom.xml里聲明坐標(biāo)它自動把依賴和傳遞依賴都拉到本地做畢業(yè)設(shè)計完全夠用。而且最終打包成Jar包交給老師跑比打WAR包部署到Tomcat省心得多。Vue解決的是前后端分離的問題。當(dāng)然你也可以用Thymeleaf做服務(wù)端渲染純后端也能把問卷系統(tǒng)做完。但既然題目明確說了基于Vue那就意味著你要做的是前后端分離架構(gòu)——前端通過AJAX調(diào)用后端提供的RESTful API拿到JSON數(shù)據(jù)之后渲染頁面。這個架構(gòu)的好處是前端開發(fā)和后端開發(fā)可以并行你不需要改一處前端代碼就重啟一次Java進程部署的時候前端打包后的靜態(tài)文件扔到Nginx或放到后端static目錄里都行。對于畢設(shè)來說前后端分離有一個很現(xiàn)實的好處就是你的論文里可以多寫一章系統(tǒng)架構(gòu)設(shè)計把前后端數(shù)據(jù)交互時序圖畫出來這也是老師比較喜歡看到的。這個組合沒有任何一個環(huán)節(jié)是為了炫技全部是沖著穩(wěn)定、可控、能講清楚去的。你自己去看真實的公司項目很多中小型項目就是這套組合的變體所以做這個題目對找實習(xí)和工作也有一定幫助。3. 拿到一份完整的問卷系統(tǒng)源碼后先花30分鐘摸清這套代碼的數(shù)據(jù)結(jié)構(gòu)不管是你自己從零寫的還是從網(wǎng)上拿到的配套源碼第一步都不建議急著跑起來而是先建庫、看表、摸清數(shù)據(jù)流轉(zhuǎn)。我見過太多人栽在項目跑不起來上結(jié)果發(fā)現(xiàn)不是代碼的問題而是表結(jié)構(gòu)和他本地數(shù)據(jù)庫版本不兼容或者初始化數(shù)據(jù)沒導(dǎo)入全。以這份基于SpringBootMySQL的在線問卷調(diào)查系統(tǒng)為例它的數(shù)據(jù)庫設(shè)計可以分成三塊核心區(qū)域。第一塊是用戶與權(quán)限相關(guān)表。典型的設(shè)計是sys_user表存放用戶ID、用戶名、加密后的密碼通常是MD5加鹽或者BCrypt、用戶類型管理員還是普通用戶、創(chuàng)建時間等。有些項目會把角色單獨拆一張role表再用user_role關(guān)聯(lián)表做多對多但問卷調(diào)查系統(tǒng)通常只有管理員和普通用戶兩種角色很多項目直接用role字段區(qū)分這也是可以接受的。第二塊是問卷本身的結(jié)構(gòu)化數(shù)據(jù)。這里通常是三張表搭配使用問卷表questionnaire存儲問卷標(biāo)題、描述、狀態(tài)草稿/發(fā)布/關(guān)閉、創(chuàng)建人、創(chuàng)建時間、開始時間、結(jié)束時間。題目表question屬于某份問卷存儲題目內(nèi)容、題型radio/checkbox/text/score、是否必填、排序號。選項表option屬于某道題存儲選項內(nèi)容、排序號。這三張表通過外鍵層層關(guān)聯(lián)形成一個問卷的完整結(jié)構(gòu)。做設(shè)計的時候有個細節(jié)要注意盡量不要用物理外鍵。很多商業(yè)項目規(guī)范里明確要求禁用物理外鍵因為在高并發(fā)插入時外鍵約束會帶來額外的鎖開銷而且一旦分表分庫外鍵就完全失效。畢設(shè)項目里如果老師不強制要求建議在代碼層面維護邏輯外鍵關(guān)系即在Java代碼里自己控制關(guān)聯(lián)邏輯建表語句里不寫FOREIGN KEY。如果你能在論文或答辯里說出為什么不用物理外鍵這個點絕對是個加分項。第三塊是答卷數(shù)據(jù)。這塊是整個系統(tǒng)設(shè)計的關(guān)鍵也是區(qū)分會設(shè)計和不會設(shè)計的分水嶺。常見的做法有兩種。第一種是寬表設(shè)計一份答卷就一行記錄每個題目對應(yīng)一個字段比如questionnaire_id、q1_answer、q2_answer...。這種設(shè)計寫起來爽但問題是題目一旦變化比如刪了一道題、加了一道題表結(jié)構(gòu)就得跟著改而且空值也會比較多。第二種是行表設(shè)計也叫EAV模式核心是下面兩張表答卷主表answer_record記錄某用戶對某份問卷的一次填寫記錄字段包括ID、問卷ID、用戶ID或匿名標(biāo)識、填寫時間。答卷明細表answer_detail每次填寫記錄對應(yīng)多行每行存儲一道題的答案字段包括ID、答卷ID、題目ID、選項ID如果是選擇類題目、文本內(nèi)容如果是填空或主觀題。這種設(shè)計犧牲了一點查詢效率但換來了極大的靈活性新增一種題型你不需要改表結(jié)構(gòu)只要在代碼里做對應(yīng)的數(shù)據(jù)解析就行。對畢設(shè)來講這套設(shè)計能撐住單選題、多選題、填空題三種基本題型的存儲需求答辯時也更好講清楚。我建議拿到源碼后先把這三塊的表關(guān)系畫出來確認每個字段的含義再去看代碼。因為表結(jié)構(gòu)就是后端代碼的地形圖你只要把表和代碼里的實體類對應(yīng)上就離理解整個系統(tǒng)八九不離十了。4. 環(huán)境搭建JDK版本、MySQL8、Maven配置里最容易坑你的三個地方這個部分我直接用一個清單式的完整過程來演示每一步都是踩過坑之后換來的經(jīng)驗。4.1 JDK環(huán)境如果你用的是SpringBoot 2.7.xJDK 8或者JDK 11都行如果是SpringBoot 3.x那必須JDK 17以上。切記JDK版本和SpringBoot版本要配套否則項目啟動時會出現(xiàn)UnsupportedClassVersionError或者各種奇怪的Bean創(chuàng)建異常。檢查完JDK版本后命令行里輸入java -version確認下很多同學(xué)環(huán)境變量配置了但沒刷新終端或者當(dāng)前終端的PATH里還有舊版本的JDK路徑就會導(dǎo)致明明安裝的是17卻顯示1.8。建議裝完JDK之后打開一個新的終端窗口再驗證別在配置之前的窗口里折騰。4.2 MySQL8的初始化注意事項現(xiàn)在大部分配套資料里的SQL腳本都是基于MySQL 5.7或8.0寫的如果你裝的是MySQL 8.0需要注意utf8mb4字符集的問題。建庫時建議直接執(zhí)行CREATE DATABASE IF NOT EXISTS survey DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE survey; source /your/path/survey.sql;使用source命令導(dǎo)入SQL腳本時腳本路徑不要帶中文和空格否則容易報錯。導(dǎo)入之后用show tables;確認表都建出來了再執(zhí)行一條select * from sys_user;看看數(shù)據(jù)是不是正常。還有一個特別容易踩的坑MySQL 8.0默認使用caching_sha2_password認證插件而某些老版本的JDBC驅(qū)動比如mysql-connector-java 5.x不支持這個插件連接時會報Public Key Retrieval is not allowed。解決方案有兩個一是把JDBC驅(qū)動換成mysql-connector-j8.0.x版本二是在數(shù)據(jù)庫連接URL上加參數(shù)allowPublicKeyRetrievaltrue。你如果用SpringBoot 2.7.x自帶的MySQL驅(qū)動就是8.0.x版本但建議還是在application.yml的連接URL里加上這個參數(shù)有備無患。4.3 Maven的鏡像倉庫配置Maven是個好東西但如果你直接用自己的中央倉庫地址在國內(nèi)網(wǎng)絡(luò)環(huán)境下下載依賴會慢到懷疑人生。Maven倉庫網(wǎng)頁版入口這個熱搜詞能進實時趨勢說明被Maven配置折磨過的人不止一個。解決方式是修改Maven的settings.xml文件把鏡像地址換成國內(nèi)倉庫。在mirrors節(jié)點下加上mirror idaliyunmaven/id mirrorOfcentral/mirrorOf name阿里云公共倉庫/name urlhttps://maven.aliyun.com/repository/public/url /mirror這樣配置之后拉依賴的速度會快很多。需要提醒的是改完settings.xml之后在IDEA里要注意Maven的配置指向File-Settings-Build, Execution, Deployment-Build Tools-Maven確認User settings file指向你修改過的那個settings.xml并且勾選Override。很多同學(xué)改了自己的settings.xml但IDEA沒生效就是因為這里沒選對路徑。4.4 把SpringBoot后端跑起來在確保MySQL創(chuàng)建好庫、導(dǎo)入好數(shù)據(jù)后打開SpringBoot項目在src/main/resources/application.yml里檢查以下幾個配置server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/survey?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrueuseSSLfalse username: root password: 你自己的密碼 driver-class-name: com.mysql.cj.jdbc.Driver然后啟動項目??吹筋愃葡旅娴娜罩据敵鼍驼f明后端已經(jīng)起來了Tomcat started on port(s): 8080 (http) with context path / Started SurveyApplication in 5.32 seconds第一次跑通這個流程我建議你一定要手動用Postman或者瀏覽器訪問一下后端接口。如果接口能返回JSON數(shù)據(jù)再往下走前端這樣能避免前后端一起出問題時不知道該排查誰。4.5 前端Vue項目的啟動Vue項目通常是用Vue CLIvue/cli開發(fā)構(gòu)建的拿到項目后檢查有沒有node_modules目錄如果沒有在項目根目錄執(zhí)行npm install。這一步在國內(nèi)也可能慢可以把npm鏡像切換成淘寶鏡像npm config set registry https://registry.npmmirror.com確認vue.config.js如果有里的代理配置把前端開發(fā)服務(wù)器的/api開頭的請求代理到后端的http://localhost:8080。執(zhí)行npm run serve默認會在localhost:8081或其他端口上啟動開發(fā)服務(wù)器。瀏覽器訪問后能看到登錄頁面就算基本跑通了。5. 核心業(yè)務(wù)的前后端協(xié)作流程從創(chuàng)建問卷到查看統(tǒng)計代碼到底經(jīng)歷了什么跑通項目之后不要急著改代碼。你要做的是跟著一條完整的業(yè)務(wù)鏈路把前后端代碼過一遍。我就以管理員創(chuàng)建問卷、用戶填寫、管理員查看統(tǒng)計這條主線把核心邏輯拆給你看。5.1 管理員創(chuàng)建問卷的Data Flow管理員在Vue前端填寫問卷標(biāo)題、添加題目題目類型選單選題、錄入選項A/B/C/D、點擊保存。Vue頁面拿到表單數(shù)據(jù)后向后端發(fā)送請求this.$axios.post(/api/questionnaire/save, this.createForm)后端對應(yīng)的Controller接收到請求把JSON轉(zhuǎn)換成QuestionnaireCreateDTO。隨后Service層做三件事向questionnaire表插入一條問卷記錄狀態(tài)為draft。遍歷DTO里的題目列表逐題插入question表拿到每個題目的自增ID。遍歷每道題的選項列表插入option表并記錄所屬的題目ID。這里有個事務(wù)的細節(jié)整個創(chuàng)建過程必須在同一個Transactional事務(wù)里完成。因為一旦中間某一步出錯比如第3題的選項沒插進去你不能讓問卷記錄已經(jīng)落庫了否則就會出現(xiàn)有問卷但沒題目的臟數(shù)據(jù)。類上要加Transactional(rollbackFor Exception.class)注意不是只寫Transactional因為Spring默認只是在拋出RuntimeException時才回滾如果你代碼里把異常catch住并轉(zhuǎn)成普通異常拋出事務(wù)就不會回滾那就會出大問題。5.2 用戶填寫問卷的原子性保證用戶打開一份已發(fā)布的問卷逐題填寫并提交。這步操作的代碼邏輯是public boolean submitAnswer(AnswerSubmitDTO dto) { // 1. 校驗問卷狀態(tài)是否已發(fā)布 // 2. 校驗必填題是否都寫了 // 3. 插入answer_record表 // 4. 批量插入answer_detail表 // 5. 更新問卷的已填寫數(shù)量字段 }有兩個容易在答辯時被問到的問題問題一如何防止用戶重復(fù)提交最簡單的方案是在表單提交時加一個冪等標(biāo)識比如前端生成一個UUID作為submissionToken每次進入問卷時向后端申請一個token提交時后端校驗這個token是否已經(jīng)被使用過。如果只用數(shù)據(jù)庫判斷該用戶是否已填過這份問卷一旦同一用戶開兩個頁面會有并發(fā)問題。如果你的項目里沒有做冪等可以在答辯時坦誠說明這個不足并給出優(yōu)化思路這也是一種加分項。問題二多選和單選答案是怎么存儲的單選答案在answer_detail表的option_id字段里直接存選項ID。 多選答案option_id字段沒法存多個值有兩種處理方式。一種是在代碼里把多個選項ID用英文逗號拼接成字符串放進一個字段另一種是每選一個選項就插一條answer_detail記錄。第一種方案查詢簡單但不符合第一范式第二種方案更歸范化但代碼略復(fù)雜。不同的項目實現(xiàn)會有差異你看源碼的時候留意一下它用的是哪種方式。5.3 統(tǒng)計報表的SQL實現(xiàn)用戶填完問卷后管理員端需要實時看到統(tǒng)計結(jié)果。以單選題你最喜歡的編程語言A. Java B. Python C. Go為例統(tǒng)計每個選項被選了多少次用SQL大致是SELECT opt.id AS option_id, opt.content AS option_content, COUNT(detail.id) AS answer_count FROM questionnaire q INNER JOIN question qs ON qs.questionnaire_id q.id INNER JOIN option opt ON opt.question_id qs.id LEFT JOIN answer_detail detail ON detail.option_id opt.id WHERE q.id 1 AND qs.id 1 GROUP BY opt.id, opt.content ORDER BY opt.sort_order;注意這里用的是LEFT JOIN而不是INNER JOIN因為一道題里可能存在某個選項從未被選過的極端情況INNER JOIN會把選項記錄直接過濾掉從0變成查不到這在統(tǒng)計頁面上就是選項列表憑空少了一項很不友好。5.4 前端的數(shù)據(jù)可視化統(tǒng)計結(jié)果如果只是表格效果一般。稍微做得好看一點前端會引入ECharts來畫餅圖或柱狀圖import * as echarts from echarts; const chart echarts.init(document.getElementById(main)); chart.setOption({ tooltip: { trigger: item }, series: [ { name: 投票數(shù), type: pie, radius: 60%, data: this.statisticsList.map(item ({ name: item.optionContent, value: item.answerCount })) } ] });大部分基于Vue的問卷系統(tǒng)都自帶了這個功能你可以在前端源碼里搜echarts看看是否已經(jīng)引入了相關(guān)依賴。如果還沒有可以讓論文里多一個可視化統(tǒng)計分析模塊的功能點工作量和難度都不大但內(nèi)容的完整度會明顯提升。6. 畢業(yè)論文怎么寫才算有料一個好的體系勝過空話畢設(shè)項目的源碼可以跑通但論文寫不出來或者寫得很水同樣沒辦法順利通過。問卷調(diào)查系統(tǒng)這個題目的論文我建議你按照下面的主體結(jié)構(gòu)來組織每個章節(jié)的寫作邏輯都不一樣。6.1 第一章 引言重點在為什么做、背景是什么這一章不要空談互聯(lián)網(wǎng)時代信息爆炸這類廢話而是要聚焦到問卷調(diào)研本身的痛點傳統(tǒng)紙質(zhì)問卷成本高、數(shù)據(jù)回收慢、統(tǒng)計容易出錯通用的問卷平臺比如某些在線SaaS雖然功能全面但數(shù)據(jù)存儲在第三方平臺上存在數(shù)據(jù)安全風(fēng)險且定制化能力受限。因此從零開發(fā)一套可私有化部署的問卷系統(tǒng)對中小企業(yè)或高校內(nèi)部調(diào)研具有一定現(xiàn)實意義。6.2 第二章 相關(guān)技術(shù)介紹每個技術(shù)都交代清楚在這套系統(tǒng)里承擔(dān)什么角色寫技術(shù)章節(jié)時別把每個技術(shù)都抄一遍百度百科。重點寫清楚它們在你的系統(tǒng)里干了什么SpringBoot提供了自動配置和快速構(gòu)建RESTful API的能力在本系統(tǒng)中用于實現(xiàn)用戶管理、問卷管理、答卷管理等核心業(yè)務(wù)接口。MySQL保存問卷、題目、選項、答卷和用戶數(shù)據(jù)利用InnoDB引擎的事務(wù)機制保證創(chuàng)建問卷和提交答卷的原子性。Vue實現(xiàn)數(shù)據(jù)驅(qū)動的SPA單頁面應(yīng)用配合Element UI組件庫完成登錄、問卷編輯器和統(tǒng)計展示頁面。Maven管理項目依賴統(tǒng)一構(gòu)建流程配合spring-boot-maven-plugin將后端項目打包為可執(zhí)行Jar。6.3 第三章 系統(tǒng)需求分析用例圖配合文字描述需求分析最忌諱的是只列功能列表一定要有角色場景的維度。問卷系統(tǒng)至少有管理員和普通用戶兩個角色你要描述清楚每個角色有哪些用例。這一章建議畫兩到三個UML用例圖把登錄注冊問卷管理填寫問卷查看統(tǒng)計結(jié)果等核心用例全部覆蓋到。6.4 第四章 系統(tǒng)設(shè)計架構(gòu)圖、功能模塊圖、數(shù)據(jù)庫ER圖三件套這一章是最重要的也是老師最愛挑刺的地方。你要用架構(gòu)圖把前后端分離的結(jié)構(gòu)畫清楚Vue前端通過Axios調(diào)用后端接口后端Controller層接收請求、Service層處理業(yè)務(wù)邏輯、Mapper層操作MySQL數(shù)據(jù)庫。數(shù)據(jù)庫設(shè)計部分必須給出ER圖并把我在第3節(jié)提到的每張表的核心字段列出來并說明含義。6.5 第五章 系統(tǒng)實現(xiàn)代碼截圖配合關(guān)鍵邏輯描述展示關(guān)鍵功能的時候不要大段貼代碼要配合截圖和文字說明。比如實現(xiàn)問卷編輯器時選Element UI的el-form和el-radio-group就描述清楚前端根據(jù)題型的枚舉值動態(tài)渲染對應(yīng)的輸入組件提交時將題目列表序列化后傳給后端即可。如果你在某個地方處理了一個異?;蛞粋€邊界條件一定要寫出來這是論文的加分項。6.6 第六章 系統(tǒng)測試用黑盒和接口測試雙管齊下這一章至少要覆蓋操作正確性測試數(shù)據(jù)庫連接是否正常、頁面能否正常加載、CRUD功能是否符合預(yù)期。核心功能測試用例表寫清測試數(shù)據(jù)、測試步驟、預(yù)期結(jié)果和實際結(jié)果。接口測試用Postman對后端RESTful API做驗證測試正常參數(shù)、異常參數(shù)缺失字段、超長字符串返回的狀態(tài)碼和響應(yīng)體。7. 排查鏈路實錄項目跑不起來時按這個順序定位問題能省一半時間最后分享一下我在幫學(xué)弟調(diào)試過程中積累的一個排查鏈路。你如果照著這個順序一步步走完90%的啟動問題都能定位。7.1 第一步核對MySQL的庫和表是否真的初始化成功項目起不來的原因里數(shù)據(jù)庫異常占了大頭。先在命令行登錄MySQL執(zhí)行SHOW DATABASES; USE survey; SHOW TABLES;看看survey庫里有沒有表。常見問題有三類建庫了但沒導(dǎo)入SQL腳本表是空的。SQL腳本導(dǎo)入時報錯比如編碼問題導(dǎo)致部分表缺失。項目application.yml里的spring.datasource.url指向了錯誤的庫名。如果數(shù)據(jù)庫正常但項目還是報Access denied for user rootlocalhost那基本是密碼錯了或者權(quán)限沒給夠。如果是密碼錯誤就修改配置如果使用云服務(wù)器MySQL記得確認bind-address允許你的IP訪問。7.2 第二步確認Maven依賴下載完整SpringBoot項目啟動時報ClassNotFoundException或NoClassDefFoundError通常是某些Jar包沒被Maven正確拉取。解決方式是先執(zhí)行mvn clean再執(zhí)行mvn install -DskipTests把項目重新編譯一遍。如果還有缺失切到Maven倉庫本地目錄默認在~/.m2/repository看看對應(yīng)坐標(biāo)的目錄里是不是只有.lastUpdated文件如果是說明下載失敗了把該目錄刪掉重新mvn install。7.3 第三步看完整的后端啟動日志頁面訪問不了時你需要看后端接口返回了什么。打開瀏覽器開發(fā)者工具F12 - Network看一下失敗的請求返回的狀態(tài)碼。具體表現(xiàn)對應(yīng)的常見原因如下現(xiàn)象大概率原因檢查方向請求返回404后端沒這個路徑或Controller的RequestMapping和接口Url不一致檢查Controller類上的RequestMapping和Vue里實際請求的路徑請求返回403跨域或認證權(quán)限問題檢查CORS配置、攔截器是否對OPTIONS請求放行請求返回500后端代碼異常最常見是SQL或空指針看后端控制臺堆棧日志請求一直Pending前后端端口不通或代理配置錯誤檢查vue.config.js的proxy配置單獨用Postman確認接口能通重啟后端口被占用上一次進程沒關(guān)掉Windows用netstat -ano | findstr 8080找到PID并結(jié)束進程7.4 第四步前端資源加載不出來怎么辦前端能打開登錄頁面但頁面樣式是亂的或者某個圖標(biāo)加載不出來多半是靜態(tài)資源路徑問題。Vue項目用public目錄存放靜態(tài)資源在引用路徑上建議使用絕對路徑如/img/logo.png而不是相對路徑./img/logo.png否則部署到子路徑環(huán)境下會出問題。如果Vue頁面打開后一片空白控制臺報各種關(guān)于module的錯通常是依賴裝得不完整直接刪除node_modules目錄重新npm install。7.5 第五步遇到這類問題先停一下自己思考很多同學(xué)遇到報錯的第一反應(yīng)是直接把報錯信息復(fù)制到搜索引擎或者截圖扔進群里。這沒錯但更高效的方式是先看報錯信息里的前五行——尤其是Exception類型和描述性文字。比如你看到j(luò)ava.sql.SQLSyntaxErrorException那十有八九是SQL寫錯了看到NullPointerException那就去檢查某個對象是不是沒有被賦值??炊畧箦e信息的能力是編程基本功里很關(guān)鍵的一項答辯時如果被問到你是怎么排查這個問題的你能把這個過程講出來會非常加分。8. 一些可以繼續(xù)深化的小方向如果你做完了基礎(chǔ)功能還有時間可以考慮在兩三個方向上做一點小優(yōu)化它們不只是加分項也能讓你在答辯時更有談資。防重復(fù)提交的冪等設(shè)計。正如前面提到的加一個submissionToken讓每份問卷在用戶手里只能提交一次。這個優(yōu)化實現(xiàn)簡單但能體現(xiàn)你對并發(fā)和數(shù)據(jù)一致性的理解。問卷的回收率統(tǒng)計。問卷系統(tǒng)不只是誰填了、填了什么管理員也很關(guān)心多少人看到了問卷但沒填。你可以加一個統(tǒng)計字段記錄問卷頁面的訪問次數(shù)和實際提交次數(shù)算出轉(zhuǎn)化率。這個功能需要的不過是給訪問接口加一條埋點日志但業(yè)務(wù)價值很明顯。數(shù)據(jù)導(dǎo)出功能。把答卷明細導(dǎo)出成Excel文件使用EasyExcel或者Apache POI。管理員填完問卷后能一鍵導(dǎo)出數(shù)據(jù)做進一步分析是非常實用的功能。這個功能也很適合寫在論文的功能模塊里?;诮巧脑L問控制優(yōu)化?,F(xiàn)在的系統(tǒng)可能只是簡單區(qū)分管理員和普通用戶。如果能把權(quán)限做到更細粒度比如問卷管理員只能管理自己的問卷不能查看別人的問卷那就是一個合格的RBAC基于角色的訪問控制模型了講起來也能展示你對權(quán)限設(shè)計的思考深度。每個方向的工作量都不大兩三天之內(nèi)就能完成但對系統(tǒng)的完整度和論文的豐滿度幫助很大。9. 我個人在實際操作中的幾點體會做到這里整個項目已經(jīng)從能跑到了能講的階段。我?guī)У膶W(xué)弟最后答辯前我讓他干了一件事自己對著項目把每個接口對應(yīng)的表、每個表對應(yīng)的字段、每個字段對應(yīng)的含義口頭講一遍。講不清楚的地方再回去看代碼。這個過程相當(dāng)枯燥但非常有價值。因為答辯時老師不一定看你的系統(tǒng)用得順不順暢更多的是看你對自己的代碼、自己的設(shè)計熟不熟悉。另外如果你的源碼是從網(wǎng)上拿來的建議不要原封不動地提交。至少做一點自己的改動和重構(gòu)比如把一個工具類提取出來、優(yōu)化一個查詢SQL、加一個自定義異常處理類。這些改動在論文里都有地方寫也在一定程度上避免雷同帶來的被動。這個題目的上限不算高但下限也低不到哪去關(guān)鍵看你怎么理解和組織。把表結(jié)構(gòu)講透了把前后端數(shù)據(jù)流梳理清了把答辯可能問的問題提前想好答案這個項目就能穩(wěn)穩(wěn)地拿下一個不錯的成績。如果你在實操中碰到了具體的報錯歡迎帶著具體的日志信息來聊根據(jù)具體的報錯去定位往往比通篇來看要快得多。本文還有配套的精品資源點擊獲取