欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,av无码精品一区二区久久,欧美性爱视频不卡一区三区,欧美乱人伦视频在线观看,国产一级牲交高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

基于SpringBoot的網(wǎng)上問卷調(diào)查系統(tǒng):從數(shù)據(jù)庫建模到統(tǒng)計(jì)報(bào)表實(shí)戰(zhàn)解析

基于SpringBoot的網(wǎng)上問卷調(diào)查系統(tǒng):從數(shù)據(jù)庫建模到統(tǒng)計(jì)報(bào)表實(shí)戰(zhàn)解析 1. 項(xiàng)目概覽這個(gè)問卷調(diào)查系統(tǒng)到底能做什么做技術(shù)這么多年我接觸過不少“看起來很基礎(chǔ)、做起來全是細(xì)節(jié)”的系統(tǒng)網(wǎng)上問卷調(diào)查系統(tǒng)就是其中典型的一個(gè)。很多朋友一開始覺得它就是“問卷CRUD 答題頁面”真上手之后才發(fā)現(xiàn)從題目類型設(shè)計(jì)、動(dòng)態(tài)表單渲染、答卷校驗(yàn)到統(tǒng)計(jì)報(bào)表每一環(huán)都能踩出不同的坑。這篇文章我想圍繞一個(gè)基于 SpringBoot 的網(wǎng)上問卷調(diào)查系統(tǒng)展開把我從項(xiàng)目設(shè)計(jì)、數(shù)據(jù)庫建模、核心代碼實(shí)現(xiàn)到部署排查的完整鏈路都拆開講講順便把源碼里值得關(guān)注的部分挑出來逐段說明。這套系統(tǒng)的定位非常明確面向中小規(guī)模調(diào)研場景比如企業(yè)內(nèi)部員工滿意度調(diào)查、學(xué)校課程評(píng)價(jià)、產(chǎn)品上線前的用戶反饋收集等。它需要支持管理員創(chuàng)建問卷、維護(hù)題庫、發(fā)布問卷、查看回收數(shù)據(jù)同時(shí)還要支持參與者打開鏈接答題、提交答卷、事后查看結(jié)果。從業(yè)務(wù)復(fù)雜度來看它不像電商系統(tǒng)那樣有復(fù)雜的交易鏈路也不像后臺(tái)管理系統(tǒng)那樣全是表格和權(quán)限配置它真正的難點(diǎn)在于“問卷是一種高度動(dòng)態(tài)的數(shù)據(jù)結(jié)構(gòu)”——每份問卷的題目數(shù)量不同、題型不同、選項(xiàng)不同答卷數(shù)據(jù)又是一對多關(guān)聯(lián)的這就要求在設(shè)計(jì)階段就把數(shù)據(jù)的靈活性和統(tǒng)計(jì)的可用性同時(shí)考慮進(jìn)去。這個(gè)項(xiàng)目適合誰來參考呢如果你正在學(xué)習(xí) SpringBoot 整合 MyBatis Plus想找一個(gè)能覆蓋“增刪改查 多表關(guān)聯(lián) 數(shù)據(jù)統(tǒng)計(jì) 前端渲染”的完整案例那它很合適。如果你要做畢業(yè)設(shè)計(jì)或者個(gè)人作品集那它同樣值得一看因?yàn)閱柧硐到y(tǒng)的業(yè)務(wù)閉環(huán)非常完整既能體現(xiàn)數(shù)據(jù)庫設(shè)計(jì)能力也能體現(xiàn)接口設(shè)計(jì)能力和業(yè)務(wù)建模能力。我這里會(huì)按實(shí)際的開發(fā)順序來講不是那種只貼代碼不解釋的教程每一步盡量說清楚“為什么這么做”。你哪怕之前沒見過問卷系統(tǒng)的代碼照著我這個(gè)思路也能把整個(gè)項(xiàng)目的脈絡(luò)捋明白。2. 整體設(shè)計(jì)思路與技術(shù)選型背后的考量2.1 為什么用 SpringBoot而不是傳統(tǒng) SSM很多老項(xiàng)目還在用 SpringMVC MyBatis XML 那一套能在里面游刃有余的開發(fā)者確實(shí)基本功扎實(shí)但是新項(xiàng)目再用 SSM 純屬自己給自己上強(qiáng)度。SpringBoot 的價(jià)值不在于“功能多”而在于它把那些固定套路全部收斂成了約定內(nèi)嵌 Tomcat、自動(dòng)裝配數(shù)據(jù)源、Starter 一鍵引入依賴再加上application.yml統(tǒng)一管理配置開發(fā)階段只需要關(guān)注業(yè)務(wù)本身。我見過不少朋友糾結(jié)“SpringBoot 是不是太傻瓜化了學(xué)不到底層原理”這個(gè)擔(dān)心其實(shí)沒必要——SpringBoot 只是把框架的裝配過程自動(dòng)化了你用到的 Spring IOC、AOP、事務(wù)傳播機(jī)制、MyBatis 映射原理一樣不少只是省掉了那堆web.xml和spring-mvc.xml而已。還有一個(gè)容易被忽略的點(diǎn)是測試和部署成本。問卷調(diào)查系統(tǒng)的迭代速度不慢經(jīng)常要加題型、加統(tǒng)計(jì)口徑SpringBoot 的spring-boot-devtools支持熱重啟配合spring-boot-maven-plugin打包出一個(gè)可執(zhí)行 Jar扔到服務(wù)器上java -jar就能跑。對于中小型團(tuán)隊(duì)來說這種“低摩擦”的交付方式比傳統(tǒng) SSM 要順滑得多。另外后續(xù)如果要引入 Spring Security 做登錄鑒權(quán)、引入 Redis 做答題防刷SpringBoot 生態(tài)的整合成本也低得多。2.2 數(shù)據(jù)庫建模問卷、題目、選項(xiàng)、答卷的關(guān)聯(lián)設(shè)計(jì)這一節(jié)是整個(gè)系統(tǒng)最核心的部分。我見過很多初學(xué)者把問卷設(shè)計(jì)成一張大表題目和選項(xiàng)全塞在 JSON 字段里這么做原型階段確實(shí)爽但到了“統(tǒng)計(jì)某道題有多少人選了某個(gè)選項(xiàng)”的時(shí)候就傻眼了Java 代碼里要解析 JSON、要手寫聚合邏輯性能差還容易出 bug。所以在這套系統(tǒng)里我采用了一套經(jīng)典的“四層模型”問卷表questionnaire記錄問卷基礎(chǔ)信息包括標(biāo)題、描述、狀態(tài)草稿/發(fā)布/結(jié)束、開始時(shí)間、結(jié)束時(shí)間、是否匿名、每日答題次數(shù)限制。題目表question通過questionnaire_id關(guān)聯(lián)問卷每個(gè)題目包含題型、題干、是否必填、排序號(hào)等字段。選項(xiàng)表option通過question_id關(guān)聯(lián)題目用于單選、多選、下拉等題型。填空和評(píng)分題沒有選項(xiàng)取決于題型標(biāo)記。答卷結(jié)果表answer主要記錄用戶對某道題目的作答內(nèi)容選項(xiàng)型題目存選項(xiàng)ID填空型題目存文本內(nèi)容。這里有一個(gè)關(guān)鍵點(diǎn)值得展開考試系統(tǒng)里的答題記錄通常用“一次提交一行主記錄 明細(xì)子表”的方式但問卷系統(tǒng)我不建議套用同一套模型。因?yàn)閱柧淼念}目是動(dòng)態(tài)的今天創(chuàng)建的問卷可能只有 5 道題明天創(chuàng)建的問卷可能就有 30 道題如果用固定字段去存每一題的答案表結(jié)構(gòu)就得頻繁變更。把這層邏輯放在明細(xì)表里讓每一行記錄都帶著question_id才能讓系統(tǒng)具備“任何問卷都能存”的擴(kuò)展能力。代價(jià)是查詢時(shí)需要多一次 JOIN但以問卷系統(tǒng)的數(shù)據(jù)量級(jí)來看這個(gè)代價(jià)可以忽略不計(jì)。2.3 業(yè)務(wù)模塊劃分不要把所有代碼堆在一個(gè) Controller 里我接手過一些所謂的“快速開發(fā)”項(xiàng)目三個(gè) Controller 搞定一切Service 層幾乎沒有業(yè)務(wù)SQL 全寫在 Mapper 注解里看起來代碼量很少但后續(xù)每加一個(gè)功能都要?jiǎng)永洗a。這套問卷系統(tǒng)我把模塊拆成五個(gè)部分問卷管理模塊負(fù)責(zé)問卷的 CRUD、發(fā)布、結(jié)束、復(fù)制。題目管理模塊在問卷下維護(hù)題目和選項(xiàng)支持拖拽排序源碼里用排序號(hào)實(shí)現(xiàn)前端可選。答題模塊面向參與者包括問卷可見性校驗(yàn)、題目渲染數(shù)據(jù)獲取、答卷提交和校驗(yàn)。統(tǒng)計(jì)模塊按問卷聚合回收數(shù)據(jù)計(jì)算選項(xiàng)占比、答題人數(shù)、平均分評(píng)分題型。用戶模塊這里做了精簡采用基于 Session 的簡單登錄管理員和普通參與者共用一張用戶表通過角色字段區(qū)分。這五個(gè)模塊拆完之后每個(gè) Mapper 都只對自己負(fù)責(zé)的數(shù)據(jù)表進(jìn)行操作Controller 層只做參數(shù)接收和結(jié)果封裝Service 層承載具體的業(yè)務(wù)流程。這樣的結(jié)構(gòu)不復(fù)雜又給后續(xù)擴(kuò)展留了余地。比如你要加一個(gè)“答卷導(dǎo)出 Excel”的功能只需要在統(tǒng)計(jì)模塊里加一個(gè)導(dǎo)出接口完全不用動(dòng)答題模塊的代碼。3. 核心功能詳解從題目類型設(shè)計(jì)到數(shù)據(jù)統(tǒng)計(jì)3.1 題目類型的抽象讓不同的題型共用一套渲染邏輯問卷調(diào)查系統(tǒng)的“靈魂”在于題目類型。你可以把題型抽象成三類基礎(chǔ)能力選項(xiàng)型單選、多選、下拉它們本質(zhì)上都是“從預(yù)置選項(xiàng)集合中選一個(gè)或多個(gè)”區(qū)別只在于選擇數(shù)量和 UI 控件的不同。文本型單項(xiàng)填空、多項(xiàng)填空它們需要用戶輸入文本校驗(yàn)規(guī)則可能是長度限制或正則匹配如郵箱格式。評(píng)分型評(píng)分題通常是 1~5 星和矩陣題前者的本質(zhì)是一組單選題后者的本質(zhì)是多行單選但在界面上要展示成表格。在設(shè)計(jì)數(shù)據(jù)庫的時(shí)候我建議用question_type字段存數(shù)字枚舉而不是直接存“radio”、“checkbox”這類前端名詞。原因是后端關(guān)心的是“這個(gè)是單選還是多選決定我如何校驗(yàn)答案”前端關(guān)心的才是“我該渲染成單選按鈕還是復(fù)選框”。如果數(shù)據(jù)庫直接存前端名詞一旦前端 UI 層改名數(shù)據(jù)結(jié)構(gòu)就要跟著改耦合度太高。合理的做法是后端用穩(wěn)定枚舉值返回給前端時(shí)再做一次映射給出前端認(rèn)識(shí)的類型標(biāo)識(shí)。在實(shí)際開發(fā)中我定義了一個(gè) Light 枚舉類包含單選、多選、下拉、填空、評(píng)分、矩陣這幾種類型。每種題型至少有兩個(gè)核心方法一個(gè)是“如何校驗(yàn)提交答案”另一個(gè)是“如何格式化答案用于存儲(chǔ)”。比如單選題提交值必須是題目下某個(gè)選項(xiàng)的 ID 且不能重復(fù)多選題則是一個(gè)數(shù)組需要校驗(yàn)數(shù)組中的每個(gè)元素都是合法選項(xiàng) ID且不能有重復(fù)項(xiàng)。這些校驗(yàn)邏輯放在 Service 層統(tǒng)一處理不要分散在 Controller 里。3.2 答卷提交策略校驗(yàn)、入庫與防重復(fù)答卷提交是整個(gè)系統(tǒng)里最容易出錯(cuò)的地方。我先說一個(gè)反例有人把答案數(shù)組直接序列化成 JSON 字符串存到一個(gè)叫answer_content的字段里然后在統(tǒng)計(jì)的時(shí)候解析這個(gè) JSON。這么做開發(fā)效率確實(shí)高但屬于“用代碼復(fù)雜度換取表結(jié)構(gòu)簡單度”等數(shù)據(jù)量上來之后統(tǒng)計(jì)分析的效率會(huì)非常糟糕而且一旦某個(gè)答案的格式變了老數(shù)據(jù)的解析就可能出錯(cuò)。這套系統(tǒng)的答題模塊采用的是“明文結(jié)構(gòu)化存儲(chǔ)”策略。參與者提交時(shí)后端收到的是[{questionId: 1, optionIds: [2,3]}, {questionId: 2, content: 不錯(cuò)}]這樣的結(jié)構(gòu)體Service 層會(huì)做以下幾步根據(jù)questionnaire_id加載問卷校驗(yàn)狀態(tài)是否為“發(fā)布中”校驗(yàn)當(dāng)前時(shí)間是否在開始時(shí)間和結(jié)束時(shí)間之間。加載問卷下的全部題目構(gòu)建一個(gè)MapLong, Question便于后續(xù)按題校驗(yàn)。逐題校驗(yàn)提交的答案。比如必填題沒有提交值要報(bào)錯(cuò)判斷題干和題目 ID 是否匹配防止使用者篡改參數(shù)提交不存在的題目。通過校驗(yàn)后以“一次提交生成一條總答卷記錄 每題答案一條明細(xì)記錄”的方式批量插入??偞鹁碛涗浝锎鎲柧?ID、參與者 ID、提交時(shí)間、IP 地址可選明細(xì)記錄里存題目 ID、題目類型、選項(xiàng) ID 集合逗號(hào)拼接或文本內(nèi)容。關(guān)于“是否匿名”這里有個(gè)設(shè)計(jì)細(xì)節(jié)如果問卷開啟了匿名模式那么總答卷記錄里的user_id置空只保留一條由隨機(jī)字符串生成的標(biāo)識(shí)用于區(qū)分“同一份答卷中的多條明細(xì)記錄”。這樣既能做到匿名又能在統(tǒng)計(jì)時(shí)區(qū)分不同的答卷。防重復(fù)提交方面我在源碼里用了簡單的“Session 問卷 ID”標(biāo)記同一個(gè) Session 對同一份問卷只能提交一次。如果要更嚴(yán)格一些可以改成基于 IP 和問卷 ID 的 Redis 標(biāo)記但中小型項(xiàng)目用 Session 方案已經(jīng)足夠畢竟問卷系統(tǒng)的并發(fā)量不太高。3.3 統(tǒng)計(jì)報(bào)表用 SQL 聚合而不是在 Java 中循環(huán)統(tǒng)計(jì)功能最能體現(xiàn)一個(gè)開發(fā)的 SQL 功底。以“單選題各選項(xiàng)占比”為例最直觀的思路是查出所有答卷明細(xì)然后在 Java 里循環(huán)計(jì)數(shù)。這個(gè)方案在數(shù)據(jù)量幾百條的時(shí)候沒問題但如果問卷參與人數(shù)上萬就很容易引發(fā)性能問題——你會(huì)在內(nèi)存里維護(hù)一個(gè)巨大的 List然后循環(huán)、分組、計(jì)數(shù)既浪費(fèi)內(nèi)存又拖慢響應(yīng)速度。正確的思路是讓數(shù)據(jù)庫去做聚合。比如統(tǒng)計(jì)“題目ID為 123 的單選題各選項(xiàng)被選擇的次數(shù)”可以用一條類似這樣的 SQLSELECT answer_detail.option_value, COUNT(*) AS cnt FROM answer_detail WHERE answer_detail.question_id 123 AND answer_detail.questionnaire_id 456 GROUP BY answer_detail.option_value這里option_value字段存儲(chǔ)的是逗號(hào)拼接的選項(xiàng) ID 字符串比如“2,5”。GROUP BY 之后就能得到每個(gè)選項(xiàng)組合的計(jì)數(shù)。對于單選題一個(gè)選項(xiàng) ID 不會(huì)出現(xiàn)兩次所以直接按它分組是沒問題的但對于多選題一份答案里可能同時(shí)選了 2 和 5這時(shí)候想要“選項(xiàng) 2 被選了多少次”就需要額外的處理。我的做法是給選項(xiàng)表增加一個(gè)“編號(hào)”的概念在統(tǒng)計(jì)時(shí)將多選答案的字符串拆開后與選項(xiàng)表關(guān)聯(lián)再按選項(xiàng) ID 分組。具體可以放在一個(gè)自定義 Mapper 方法里寫一小段 SQL 來完成。如果要統(tǒng)計(jì)評(píng)分題的平均分就直接取對應(yīng)題目明細(xì)里的數(shù)值字段做 AVG 聚合。統(tǒng)計(jì)結(jié)果最終封裝成一個(gè)MapInteger, Long或ListOptionStat對象返回給前端前端用圖表庫渲染成餅圖或條形圖。我在本地調(diào)試的時(shí)候用 5000 份模擬答卷跑過一遍整條統(tǒng)計(jì)鏈路耗時(shí)在 200 毫秒以內(nèi)完全夠用。4. 配置、啟動(dòng)與部署從零跑通整個(gè)項(xiàng)目4.1 需要準(zhǔn)備的環(huán)境清單在動(dòng)手跑這個(gè)項(xiàng)目之前先檢查一下本機(jī)環(huán)境。我建議的版本組合如下軟件推薦版本說明JDK1.8 或 11SpringBoot 2.7.x 對這兩個(gè)版本兼容性最好Maven3.6用于依賴下載和項(xiàng)目打包MySQL5.7 或 8.0注意驅(qū)動(dòng)和時(shí)區(qū)配置差異Navicat / DataGrip任意用于導(dǎo)入 SQL 腳本和查看數(shù)據(jù)前端開發(fā)者工具任意便于調(diào)試接口返回結(jié)構(gòu)這里要重點(diǎn)提醒一個(gè)容易踩的坑如果你用 MySQL 8.0pom.xml里的mysql-connector-java版本別太老否則會(huì)報(bào)Public Key Retrieval is not allowed的錯(cuò)誤。解決方式是升級(jí)驅(qū)動(dòng)版本或者在數(shù)據(jù)庫連接 URL 上加上allowPublicKeyRetrievaltrueuseSSLfalse。4.2 核心配置文件解讀application.yml是 SpringBoot 項(xiàng)目的樞紐。我拿這個(gè)項(xiàng)目里最關(guān)鍵的幾個(gè)配置來說server: port: 8080 servlet: context-path: / spring: datasource: url: jdbc:mysql://localhost:3306/survey_system?useUnicodetruecharacterEncodingutf-8useSSLfalseserverTimezoneAsia/Shanghai username: root password: your_password driver-class-name: com.mysql.cj.jdbc.Driver jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT8 mybatis-plus: configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: id-type: autoserverTimezoneAsia/Shanghai和time-zone: GMT8這兩個(gè)配置是一對的少一個(gè)都可能導(dǎo)致日期時(shí)間字段差 8 小時(shí)。這個(gè)問題我在本地出現(xiàn)過看起來是數(shù)據(jù)寫入時(shí)間不對實(shí)際上是連接時(shí)區(qū)沒對齊。map-underscore-to-camel-case: true讓數(shù)據(jù)庫字段questionnaire_id自動(dòng)映射為 Java 屬性questionnaireId寫 Mapper XML 時(shí)就不用反復(fù)起別名。log-impl: StdOutImpl會(huì)在控制臺(tái)打印 SQL 日志開發(fā)階段建議開著方便排查問題上線前記得改成org.apache.ibatis.logging.nologging.NoLoggingImpl或者刪掉避免日志刷屏。4.3 數(shù)據(jù)初始化一份 SQL 腳本能省多少事源碼里附帶的sql文件夾下有建庫建表腳本包括用戶表、問卷表、題目表、選項(xiàng)表、答卷表、答卷明細(xì)表以及少量初始數(shù)據(jù)。我第一次拿到這個(gè)項(xiàng)目的時(shí)候是直接在 MySQL 里手動(dòng)建表的結(jié)果因?yàn)樽侄晤愋秃?MyBatis Plus 的映射對不上花了不少時(shí)間排查。后來我建議的做法是直接導(dǎo)入 SQL 腳本把表結(jié)構(gòu)和初始管理員賬號(hào)一次性建好。導(dǎo)入之后先確認(rèn)幾件事表前綴是否和 MyBatis Plus 的全局配置一致。如果表名有前綴如t_questionnaire需要在配置里指定table-prefix: t_或者讓實(shí)體類加TableName(t_questionnaire)注解。檢查初始密碼的加密方式。如果源碼里用的 MD5 加鹽確保你的登錄邏輯和數(shù)據(jù)庫里存的密文格式一致否則會(huì)出現(xiàn)“賬號(hào)密碼都對但登錄失敗”的詭異問題。確認(rèn)問卷狀態(tài)字段的默認(rèn)值。數(shù)據(jù)庫里建議給status字段加默認(rèn)值 0并加上注釋說明 0 草稿、1 發(fā)布、2 結(jié)束。這樣開發(fā)期不容易誤操作。4.4 本地啟動(dòng)的完整步驟整個(gè)啟動(dòng)流程其實(shí)非常標(biāo)準(zhǔn)步驟如下用 Maven 執(zhí)行clean package或者直接在 IDEA 里Reload All Maven Projects確保所有依賴都下載完畢。本地 MySQL 中創(chuàng)建數(shù)據(jù)庫survey_system設(shè)置字符集為utf8mb4導(dǎo)入 SQL 腳本。修改application.yml中的數(shù)據(jù)庫賬號(hào)密碼為你本機(jī)的實(shí)際配置。啟動(dòng)SurveyApplication.java的主方法。瀏覽器訪問http://localhost:8080用腳本里初始化的管理員賬號(hào)登錄后臺(tái)。在問卷管理頁面創(chuàng)建一份問卷添加幾道題單選、多選、填空然后點(diǎn)擊“發(fā)布”復(fù)制答題鏈接用無痕窗口打開答卷頁面完成一次完整答題。第 6 步非常重要我建議每位拿這套源碼去改的朋友都完整走一遍“創(chuàng)建問卷→發(fā)布→答題→查看統(tǒng)計(jì)”的閉環(huán)而不是直接改代碼。只有先跑通主線流程你才知道哪塊是正常的、哪塊是你改壞的。我之前帶過一位實(shí)習(xí)生一上來就改數(shù)據(jù)庫字段結(jié)果問卷發(fā)布后答題頁面怎么都渲染不出來最后發(fā)現(xiàn)是題目表的question_type字段值枚舉對不上。先跑通一遍就是給自己建立一個(gè)“正?;€”。5. 前端交互與渲染動(dòng)態(tài)問卷表單是怎么做到的5.1 接口設(shè)計(jì)和數(shù)據(jù)協(xié)議約定很多朋友在學(xué)后端的時(shí)候會(huì)忽略接口設(shè)計(jì)但問卷系統(tǒng)的接口設(shè)計(jì)直接決定了前端渲染的復(fù)雜度。在這套系統(tǒng)里問卷答題頁面的核心接口就一個(gè)根據(jù)問卷 ID 獲取完整的問卷內(nèi)容。返回的 JSON 結(jié)構(gòu)大致如下{ code: 200, data: { questionnaireId: 19, title: 2024年度員工滿意度調(diào)查, description: 本問卷共10題預(yù)計(jì)耗時(shí)2分鐘, status: 1, deadline: 2024-12-31 23:59:59, questions: [ { questionId: 101, questionType: 1, required: true, stem: 你所在部門是, options: [ {optionId: 1001, text: 技術(shù)部}, {optionId: 1002, text: 市場部} ] } ] } }這個(gè)結(jié)構(gòu)的特點(diǎn)是問卷、題目、選項(xiàng)一次性全量返回前端拿到后直接遍歷渲染即可。對于題庫量最大的問卷這種方式的響應(yīng)體積也就在幾十 KB 左右完全沒必要做成分頁加載。如果后續(xù)問卷題目數(shù)量特別多比如超過 100 題再考慮分步加載或者按頁加載初期不必過度設(shè)計(jì)。5.2 動(dòng)態(tài)渲染的關(guān)鍵代碼思路前端在拿到數(shù)據(jù)結(jié)構(gòu)后需要根據(jù)questionType字段渲染不同的控件。核心是一個(gè)條件判斷映射單選題渲染成 radio 組多選題渲染成 checkbox 組下拉題渲染成 select填空題渲染成 input/textarea評(píng)分題渲染成一排星形按鈕矩陣題渲染成表格。以 Vue 為例大致的渲染邏輯是這樣的div v-forquestion in questions :keyquestion.questionId div classquestion-title {{ question.required ? * : }}{{ question.stem }} /div !-- 單選題 -- el-radio-group v-ifquestion.questionType 1 v-modelanswerMap[question.questionId] el-radio v-foropt in question.options :keyopt.optionId :labelopt.optionId{{ opt.text }}/el-radio /el-radio-group !-- 多選題 -- el-checkbox-group v-else-ifquestion.questionType 2 v-modelanswerMap[question.questionId] el-checkbox v-foropt in question.options :keyopt.optionId :labelopt.optionId{{ opt.text }}/el-checkbox /el-checkbox-group !-- 下拉題 -- el-select v-else-ifquestion.questionType 3 v-modelanswerMap[question.questionId] el-option v-foropt in question.options :keyopt.optionId :labelopt.text :valueopt.optionId/el-option /el-select !-- 填空題 -- el-input v-else-ifquestion.questionType 4 v-modelanswerMap[question.questionId] typetextarea placeholder請輸入你的答案/el-input /div提交時(shí)前端的answerMap已經(jīng)是一個(gè)“題目 ID → 答案”的映射比如{101: 1001, 102: [1003, 1005], 103: 挺好的}。把它轉(zhuǎn)成后端需要的列表格式后 POST 給提交接口即可。這個(gè)環(huán)節(jié)有一個(gè)容易被忽略的點(diǎn)填空題如果用戶什么都沒填但題目標(biāo)了必填后端一定要再次校驗(yàn)不能只依賴前端。因?yàn)榍岸诵r?yàn)被繞過實(shí)在太容易了這是安全性的基本功。5.3 后端 XSS 防護(hù)和參數(shù)合法性校驗(yàn)問卷系統(tǒng)允許用戶輸入文本那就必然要考慮 XSS跨站腳本攻擊。如果有人在填空題里輸入一段scriptalert(xss)/script不處理的話這段內(nèi)容很可能在管理員查看答卷時(shí)被瀏覽器執(zhí)行。雖然答題入口是內(nèi)部的但這種教育成本很低的問題沒必要賭。我的建議是分兩層處理后端入庫前對文本類字段做 HTML 標(biāo)簽過濾把和轉(zhuǎn)義為lt;和gt;。前端顯示時(shí)使用 Vue/React 默認(rèn)的文本插值而不是v-html來渲染用戶提交的內(nèi)容。這一步是最重要的只要不用v-html渲染用戶輸入XSS 的風(fēng)險(xiǎn)就會(huì)大幅降低。參數(shù)合法性校驗(yàn)方面除了前面提到的題目 ID 和選項(xiàng) ID 匹配之外還要注意文本型答案的長度限制比如單題答案不能超過 500 字。評(píng)分題的范圍限制必須是 1 到 5 之間的整數(shù)。郵箱題如果有要校驗(yàn)郵箱格式。這些校驗(yàn)寫起來不復(fù)雜但要養(yǎng)成習(xí)慣。別覺得“內(nèi)部系統(tǒng)不用管安全”等到有人拿著你系統(tǒng)的鏈接刷問卷、灌垃圾數(shù)據(jù)的時(shí)候再回頭補(bǔ)這些校驗(yàn)就晚了。6. 統(tǒng)計(jì)模塊實(shí)戰(zhàn)數(shù)據(jù)可視化與導(dǎo)出6.1 統(tǒng)計(jì)頁面的數(shù)據(jù)和圖表對接問卷管理的后臺(tái)通常會(huì)有一個(gè)“查看統(tǒng)計(jì)”的入口。點(diǎn)擊之后頁面會(huì)展示這個(gè)問卷的回收概況總答卷數(shù)、有效答卷數(shù)、各題作答率即有多少人答了這道題以及每個(gè)選項(xiàng)的選擇人數(shù)和占比。統(tǒng)計(jì)接口的設(shè)計(jì)思路是按問卷聚合{ questionnaireId: 19, totalCount: 1280, questionStats: [ { questionId: 101, stem: 你所在部門是, type: 1, answerCount: 1275, optionStats: [ {optionId: 1001, text: 技術(shù)部, count: 520, rate: 40.8}, {optionId: 1002, text: 市場部, count: 755, rate: 59.2} ] } ] }前端拿到這個(gè)結(jié)構(gòu)后用 ECharts 畫餅圖或者條形圖非常直接。一個(gè)值得推薦的小技巧是不要在前端計(jì)算占比讓后端直接返回 rate 字段。這樣前端做展示更簡單同時(shí)后端可以在取數(shù)時(shí)統(tǒng)一處理精度和格式化邏輯避免不同頁面算出來的比例對不上。6.2 統(tǒng)計(jì)性能優(yōu)化索引、緩存、異步導(dǎo)出問卷系統(tǒng)在統(tǒng)計(jì)層面的數(shù)據(jù)量通常不會(huì)大到需要引入 Elasticsearch但有幾條優(yōu)化策略是很實(shí)用的第一給外鍵字段建索引。answer_detail表的questionnaire_id和question_id字段在多表 JOIN 時(shí)是高頻過濾條件建立普通索引就能大幅度加快 GROUP BY 和 WHERE 的查詢效率。我建議在初始化 SQL 腳本里就加上這層索引而不是等數(shù)據(jù)量大了再補(bǔ)。第二統(tǒng)計(jì)接口開啟 Spring Cache 緩存。同一份問卷在短時(shí)間內(nèi)被多次查看統(tǒng)計(jì)結(jié)果其實(shí)是一樣的。用Cacheable注解把統(tǒng)計(jì)結(jié)果緩存 5 分鐘能顯著降低數(shù)據(jù)庫壓力。注意問卷一旦有新答卷提交需要主動(dòng)調(diào)用CacheEvict清掉對應(yīng)問卷的緩存否則統(tǒng)計(jì)結(jié)果會(huì)一直不變。第三Excel 導(dǎo)出采用異步生成。當(dāng)后臺(tái)需要導(dǎo)出全部答卷明細(xì)時(shí)同步導(dǎo)出可能會(huì)導(dǎo)致請求超時(shí)。更好的做法是提交導(dǎo)出任務(wù)后返回一個(gè)任務(wù) ID后臺(tái)線程生成 Excel 文件再通過前端輪詢或 WebSocket 通知下載完成。這一步在初期可以不做但如果你的系統(tǒng)面向的問卷經(jīng)常有幾千人參與導(dǎo)出功能幾乎是必須的。6.3 一道題教會(huì)你多選題統(tǒng)計(jì)的拆分邏輯多選題的統(tǒng)計(jì)是新手最容易懵的地方。假設(shè)一道題有 5 個(gè)選項(xiàng)用戶選了“A、C”我們在answer_detail.option_value字段里存儲(chǔ)的是1,3?,F(xiàn)在想統(tǒng)計(jì)“選項(xiàng) AID1被選了多少次”如果用GROUP BY option_value只能統(tǒng)計(jì)出“同時(shí)選 A 和 C 的人有多少”得不出“選 A 的人有多少”。拆分的方式有幾種。一種是在 Java 中循環(huán)讀取后再統(tǒng)計(jì)適合數(shù)據(jù)量小的場景另一種是直接在 SQL 層面用FIND_IN_SET或LIKE處理比如SELECT COUNT(*) FROM answer_detail WHERE question_id 102 AND FIND_IN_SET(1, option_value) 0如果統(tǒng)計(jì)所有選項(xiàng)的分布可以用一條 JOIN 把選項(xiàng)表和答題明細(xì)表按 FIND_IN_SET 關(guān)聯(lián)起來再分組計(jì)數(shù)。不過需要留意的是FIND_IN_SET寫法簡單但當(dāng)數(shù)據(jù)量很大時(shí)無法走索引。所以在實(shí)際項(xiàng)目中我更推薦“冗余統(tǒng)計(jì)表”的策略每次答卷提交后異步更新一張question_option_stat統(tǒng)計(jì)表每個(gè)問卷、每個(gè)題目、每個(gè)選項(xiàng)一行直接累加計(jì)數(shù)。這樣統(tǒng)計(jì)接口永遠(yuǎn)只查這張小表性能又快又穩(wěn)定代價(jià)僅僅是提交時(shí)多一點(diǎn)更新開銷。對于中小型問卷系統(tǒng)這是性價(jià)比最高的方案。7. 常見問題排查與避坑實(shí)錄7.1 問題速查表這套系統(tǒng)在開發(fā)和部署過程中有幾類問題出現(xiàn)的頻率特別高我整理了一個(gè)速查表方便你直接定位現(xiàn)象可能原因解決方案啟動(dòng)時(shí)報(bào)Unknown database還沒有創(chuàng)建數(shù)據(jù)庫或庫名拼寫錯(cuò)誤在 MySQL 中執(zhí)行CREATE DATABASE survey_system DEFAULT CHARACTER SET utf8mb4;登錄失敗賬號(hào)密碼正確但進(jìn)不去密碼加密方式和數(shù)據(jù)庫密文不一致檢查登錄 Service 中使用的加密算法MD5/SHA與初始數(shù)據(jù)的密文格式對齊問卷發(fā)布后答題頁 404問卷狀態(tài)字段未設(shè)置為“發(fā)布”或接口路徑錯(cuò)誤確認(rèn)status1并檢查后端 Controller 的RequestMapping路徑時(shí)間字段差 8 小時(shí)數(shù)據(jù)庫連接 URL 缺少時(shí)區(qū)配置在url中加入serverTimezoneAsia/Shanghai統(tǒng)計(jì)接口響應(yīng)很慢沒有對questionnaire_id建索引給answer_detail表的questionnaire_id字段添加普通索引提交答卷后提示參數(shù)錯(cuò)誤題型枚舉值和實(shí)際不符檢查前端渲染用的題型映射和后端枚舉定義保持一致多選答案統(tǒng)計(jì)不準(zhǔn)沒有處理多選拆分改用“統(tǒng)計(jì)表冗余”或FIND_IN_SET拆分邏輯7.2 踩過的坑從一個(gè)拼接 SQL 導(dǎo)致的 Bug 說起有一次我在統(tǒng)計(jì)模塊里為了省事直接拼接了選項(xiàng) ID 的字符串去查詢數(shù)據(jù)庫結(jié)果某個(gè)選項(xiàng) ID 是兩位數(shù)時(shí)LIKE %1%把 ID 為 11、21 的選項(xiàng)也匹配進(jìn)去了統(tǒng)計(jì)結(jié)果直接翻倍。從那以后我給自己定了一條規(guī)矩能用參數(shù)化的寫法和FIND_IN_SET就不要用字符串 LIKE 匹配數(shù)字 ID。這條原則不只適用于問卷系統(tǒng)任何涉及 ID 過濾的場景都一樣數(shù)據(jù)格式規(guī)范化永遠(yuǎn)比“寫起來快”更重要。還有個(gè)常見的坑是在“復(fù)制問卷”功能上。很多系統(tǒng)支持一鍵復(fù)制已有問卷實(shí)現(xiàn)時(shí)如果只是把問卷表記錄復(fù)制一份而忘記同時(shí)復(fù)制題目和選項(xiàng)就會(huì)出現(xiàn)“問卷存在但打開編輯時(shí)一片空白”的詭異問題。正確做法是在事務(wù)里完成三步復(fù)制問卷主記錄遍歷原問卷下的所有題目為新問卷創(chuàng)建新題目和新選項(xiàng)同時(shí)維護(hù)好新舊 ID 的映射關(guān)系。這個(gè)邏輯不難但容易漏。7.3 關(guān)于并發(fā)提交的思考問卷系統(tǒng)有一個(gè)特殊場景同一個(gè)用戶、同一份問卷在多個(gè)標(biāo)簽頁同時(shí)提交。如果系統(tǒng)不做任何限制就可能產(chǎn)生重復(fù)答卷。處理方案我在前面提過 Session Redis 的標(biāo)記方式但更徹底的做法是在數(shù)據(jù)庫層面加一層唯一約束。比如在總答卷表里增加一個(gè)unique_key字段存儲(chǔ)user_id questionnaire_id 某次會(huì)話的隨機(jī)標(biāo)識(shí)在數(shù)據(jù)庫層面設(shè)置唯一索引。這樣即使前端重復(fù)提交、后端并發(fā)處理數(shù)據(jù)庫最終也只會(huì)保留一條有效記錄。這個(gè)方案比單純依賴后端邏輯要可靠得多因?yàn)樗亲詈笠坏牢锢矸谰€。8. 個(gè)人體會(huì)與幾點(diǎn)額外建議回到這個(gè) SpringBoot 網(wǎng)上問卷調(diào)查系統(tǒng)本身我個(gè)人的體會(huì)是它的代碼量不算大但覆蓋的知識(shí)點(diǎn)非常全面。從 SpringBoot 自動(dòng)配置到 MyBatis Plus 的 ActiveRecord 模式從 REST 接口設(shè)計(jì)到前端動(dòng)態(tài)渲染從 SQL 聚合統(tǒng)計(jì)到部署排查每一個(gè)環(huán)節(jié)都能在真實(shí)項(xiàng)目中找到對應(yīng)場景。對正處于學(xué)習(xí)階段的朋友來說把它“吃透”比急著上手微服務(wù)更有價(jià)值。最后分享一個(gè)小技巧做完這套問卷系統(tǒng)后你可以自己給自己提需求比如“支持刪除問卷前二次確認(rèn)”“支持統(tǒng)計(jì)結(jié)果導(dǎo)出 PNG”“支持答題進(jìn)度條”然后逐個(gè)實(shí)現(xiàn)。這些需求單獨(dú)看都不難但把它們一個(gè)個(gè)加進(jìn)去的過程就是對這套代碼最有效的鞏固方式。你在動(dòng)手的過程中會(huì)遇到“如何改表結(jié)構(gòu)而不影響老數(shù)據(jù)”“如何加接口而不破壞原有協(xié)議”這些真實(shí)問題而這些經(jīng)驗(yàn)恰恰是只讀一遍代碼學(xué)不到的。希望這篇文章能幫你少走一些彎路。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
99久在线| 亚洲黄3级片网站欧美| 99er6| 少妇人妻偷人精品无码视频新浪| 深爱五月激情五月| 9999热在线免费观看| 丁香伊人五月色婷婷五十路| 99免费视频在线观看爱| 久在线综合69| 日本乱子人伦在线视频| 亚洲操逼网| AV伊人青草丁香六月| 婷婷五月综合激情小说| 91色噜噜狠狠狠狠色综合| 久久99精品日本| 精品欧美一区二区三区久久久| www.无码com| 欧美日韩一区二区三区四区| 免费观看的av| 五月婷婷啪啪综合网| 五月婷婷综合激情小说| 99爱在线视频| 99在线国| 激情婷婷丁香色五月综合| 亚洲在线操| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 超碰在线人人| 色综合久久五月天| 久久伊人婷婷| 国产精品大香蕉| 五月综合视频| 久久色五月天| 丁香六月情| wwwss在线观看| 九九视屏| 欧美日本韩国亚洲| 五月丁香啪啪啪| 色情成人五月天| 大香蕉综合| 啪啪综合网| 五月丁香| 天天做夜夜爽| 99在线免费观看| 国产91九色| 超碰91人人操| 97操碰视频| 激情五月丁香六月| 亚洲热热视频| 少妇综合网| 深爱激情网五月天| 天天狠天天叉| 新激情综合| 激情五月色婷婷| 久久九九大香蕉电院| 激情深爱综合| 五月丁香欧美综合免费视频| 色五月婷婷久久大| 丁香五月婷婷啪啪啪| 丁香五月成人社区| 五月亭亭开心网| 日韩黄色中文字幕| 欧美五月婷婷| 91综合视频在线| 看国产探花操逼三级片| 欧美天天五月丁香免费观看| 五月丁香六月| 婷婷五月天桃花网| 国产五月天婷婷| 五月天五月婷五月激情网| 99精日本久久| 第二色AⅤ| 综合久色五月| 中文字幕乱轮| 96丁香婷婷九月蜜桃综合久久| WWW久久久| 五月婷婷丁香大陆免费| 九色自拍| 久热这里只有| 91超级碰在线视频| 99在线视频喷水| 亚洲激情五月天| 99热免| 色久综合天天做视频| 79色色免费| 可以免费观看的av网址| 婷婷深爱五月丁香网| 蜜桃五月天| 色在线视频网2025| 91九色精品熟女内射| 婷婷五月丁香五月| 日本91在线播放| 99视频啪啪| 精品九九网| 99手机在线精品视频| 999婷婷综合| 久久9精品| 欧美成人无码一区二区三区| 色五婷婷| 色色色综合| 亚洲精品a成人在线播放| 亚洲综合网在线| 国产人人操| AV成人在线播放| 色色五月天网站| 五月丁香婷婷激情| 亚洲午夜一区二区| 成人va在线观看视频| 99久久.www| 综合色情网| 狠狠久久婷五月综合色| 久久五月天色婷婷| 在线观看免费观看在线9久| 久久色午夜在线导航| 亭亭玉立国色天香| 色五月天婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷 | 天插天啪天啪天啪| av久热| 青青久在线视频免费观看| 亚洲成人AV一区在线观看| 色玖玖综合| 秋霞学生妹一二级| 操操天堂| www.cao.com久久| 丁香五月婷婷婷桃花影院| 久久久久久久综合狠狠综合| 开心五月天激情网站| www.91九色| 婷婷六月综合激情| 97黑人精品区| 亚洲AV色婷婷人禽五月天| 久久网日本| 在线看的免费网站| 久久人妻久久久久| 高清视频一区| 色爽九九| 日本色色视频| 国内一级片| 日韩小视频在线99| 国产,欧美,学生妹,视频| 亚洲无AV在线中文字幕| 97五月天| 99精彩视频在线观看| 色综合com| 狠狠操狠狠插| 丁香婷婷婷婷十二月在线观看视频| 开心五月六月婷婷| www激情| 极品五月天| 激情五月天com| 天天天天天天天操| 色九月婷婷综合| 97碰碰叉| AV天堂婷婷五月天| 欧美情色电影一区二区| 情情五月天色| 大伊香蕉精品视频在线| 成人羞羞啪啪 全 视频| 六月婷婷综合| 亚洲va日| 六月激情网| 丁香五夜激情四射夜夜夜| 色综合五月在线| 色五月天综合网| 色约约视频一区二区三区四区五区 | 艹| 97久久精品| 精品爱欲五| 日本三级大片| 激情五月天综合网| 色狠狠狠干| 色婷婷狠| av九九| 亚洲啪视频| 久婷婷色| 五月丁香婷婷色| 操九色| 久久亚洲激情五码| 七七色色综合| 97天堂| 色婷婷久久| 图片区 小说区 区 亚洲五月| 4399亚洲视频| 五月丁香六月欧美综合网站| 夜夜涩涩涩| 激情综合久久| 久久性爱视频| 婷婷狠狠操| 七七久久婷婷| 五月婷婷六月丁香在线| 91美女艹逼网站| 婷婷噜噜| 强伦轩人妻一区二区电影| 激情第四色| 欧美日韩日韩成人| 影视av久久久噜噜噜噜噜三级| 97超级碰碰碰| 五月丁香久久综合| 亚洲欧美999| 激情性爱网站| 综合XX网| 久久五月六月| 婷婷色综合网日韩国产| 久久久27操| 日韩AV片| 日本WwW色偷偷丁香花久久久京东热| 东北婷婷五月天| 五月天婷婷婷| 伊人网大香| 婷婷性爱| 色播jjjj| 色色色婷婷五月天| 婷婷性爱无码视频| 国产九九一区二区三区| 丁香五月天堂| 热成人网| 99re热在线视频| 伊人久久婷婷| 日亚二欧美| 99久久免费精品| 五月丁香五月激情综合色综合| 色色五月丁香| 亚洲在线激情婷婷五月| 五月丁香综合影院| 日韩人妻AV在线| 大香蕉精品视频| 色色色无码| 夜夜操夜夜操| 99热这里| 亚洲 小说 欧美 激情 另类| 操操自拍| 婷婷色情小说| 欧美性生交XXXXX无码小说| 婷婷色色丁香| 91久久久久久久| 9热在线观看| 欧美激情五月天在线观看| 色婷丨日丨天丨综合久久| 4399无码视频| 在线观看av网站| 操一区| 五月丁香久久激情网| 中文字幕欧美精品久久| 成熟妇人A片免费看网站| 亚洲婷婷欧美婷婷| 天天情色五月天| 亭亭色网| 中文字幕人妻AV| 狠狠草在线观看| 五月激情丁香| 91色综合网| 成人精品视频99在线观看免费| 91丨九色丨熟女丰满| 日韩另类| 丁香激情五月| 色综合天天天天做夜夜| 亚洲综合五月天婷婷| 99久久玖玖| 丁香婷婷久久激情| www.日本久久videos| 超级碰碰99| 五月天婷婷激情| 伦99热| 五月婷婷激情日本| 懂色av粉嫩AV蜜臀AV| 亚洲无码11| 玖玖五月丁香| 99爱在线免费视频| 久热这里只有精品66| 亚洲成人综合在线| 色五月综合激情网| 中文成人在线| 五月婷婷影院| 婷婷亚洲综合| 五月天婷婷无码| 五月丁香六月成人| 99色| 超碰99热精品| 99热热这里只精品996小说| 激情五月色综合国产精品| 综合玖玖性爱免费视频| 五月婷婷激情| 九九色人| 97碰在线视频| 九九99免费视频| 99色.com| 色色色婷婷五月| 激情久久综合网| 五月婷婷五月| 99精品网| 国产伦亲子伦亲子视频观看| 欧美电影在线观看| 99精品偷自拍| 国产真人做爰视频免费| 色情一区二区播放| 五月丁香啪啪综合| 超碰免费成人| 九九综合| 一起草性爱不卡视频| 91久久电影| 天天透天天爱| 久操福利| 亚洲无码色| 99热免| 欧美A片在线视频免费观看| 综合久久高清| 99热精品在线播放| 五月天婷婷成人网| 懂色av粉嫩av蜜臀av| 国产高潮A片羞羞视频涩涩| 91久久久久久久久久久| 99操碰| 婷婷五月影院| 色级停停| 婷婷自拍| 亚洲人妻av| 五月丁香啪啪| 亚州视频九九99| 激情五月丁香在线观看直播| 这里只有精品视频99| 深情五月天| 天天草比天天爽| 丁香婷婷六月男男| 日日干天天爽| 五月天婷久久| 丁香五月婷婷99| 亚洲xx网| 99热99思午夜精品| 五月网网站| 亚洲热视频| 五月丁香六月成人| 亚洲无AV在线中文字幕| 超91在线视频| 黄色成人网站在线播放| 激情五月天之六月婷婷| 五月花免费视频| 激情五月天啪啪| 26uuu在线观看| 婷婷五月天网| 色婷青青| 91久久精品无码一区二区三区| 7777激情基地| 男女99免费视频| 如何安全看伊人婷婷| 级人人91| 日本在线播放97| 亚洲精品444久久久久久| 激情综合五月婷婷| 五月丁香花激情综合网| 国产婷婷婷| 九色综合网| 色婷狠狠| 日韩一区二区在线播放| 人人操av| 五月天成人在线播放丁香| 中文字幕成人| 午夜婷婷五月天| 九九99九九99偷拍视频免费看| 激情深爱五月天| 五月丁小婷婷激情四射| 99ri在线视频| 色婷婷丁香| 久久ww| 人人爽网| 色婷视频| 五月丁香婷婷AV| www.激情五月| 偷偷操99| 五月婷婷久草在线视频综合| 色综合色| 中文精品在| 99.色| 天天久久狠狠色综合| 无码少妇高潮喷水A片免费| 色色丁香五月| 亚洲久热无码| 97碰碰碰免费公开在线视频| 国产精品人妻欲求不满| 激情五月丁香六月综合AVXXXX| 九九99久久| 《丁香激情综合久久伊人久久》影视在线观看 -高清预告手机免费播放 -三妹影院 | 久久婷婷青青| 5月婷婷综合| 色播五月天激情| 国产欧美日韩综合精品一区二区 | 综合激情五月四射婷婷| 婷婷五月天影院| 中文字幕1区2区。| 综合成人小说婷婷| 蜜乳9188| 激情综合网激情五月丁香| 色婷婷久久综合| 五月丁香六月婷婷激情四射| 九九操综合网| 综合大香蕉| caop在线| 99视频35精品视频在线观看| 免费亚洲成人电影AV| 五月天婷婷黄色| 色色婷婷丁香| 色啪影院| 色色色色综合网| 久久婷婷激情四射五月天| 色色婷婷综合网| 色色婷婷丁香| 狠狠操.com| 粉嫩av蜜桃av蜜臀av| 婷婷色六月| 成人午夜天| 色综合五月天| 98毛片| 婷婷久久大香蕉| www色婷婷com| 电影蜘蛛女| 婷婷社区五月天| 久久婷婷综合网| 日本色色网站| 99精品国产在热久久婷婷| 丁香六月色婷婷综合| 超碰日韩成人| 天天日日爽| 蜜臀久久99精品久久久久久酒店| 婷婷综合成人五月天| 午夜少妇在线观看视频| 婷婷五月天伦理| 丁香六月婷婷久久综合| 色色色.com| 538在线精品| 婷婷五月情色| 激情综合色婷婷啪啪五月天| 久久A V无码视频| 亚州成人综合在线| 99热8| 婷婷丁香综合| 97碰碰视频在线观看| 丁香激情网| 在线观看熟女少妇| 91九色中文| 婷婷玖玖五月天| 婷婷丁香五月麻豆| 婷婷丁香五月天激情| 色射7856五月天激情四射| 日噜噜色| 五月www| 国产古装妇女野外A片| 色婷婷在线综合色播网| 99久在线精品99re8热| 激情五月天开心| 色婷婷操逼| 激情九月婷婷九月| 日本熟妇乱妇熟色A片蜜桃| 久草热8精品视频在线观看| 9久国产精品| 这里只有精品视频99| 噜噜噜噜噜在线| 久草久青福利| 热99这里只有精品视频| 超碰大香蕉网| 99色婷婷视频| 在线成人网址| 亚洲欧洲中文日韩久久AV乱码| 五月丁香啪啪激情| 欧美超碰亚洲| 激情六月色| 久久久久亚洲AV成人无码电影| 亚洲操b| 婷婷六月丁香在线| 天堂va久久久噜噜噜久久Va| 亚洲愉拍99热成人精品| 色狠狠伊人久久五月丁香| 99热 日韩| 久久五月婷婷丁香| 成人久久天天x资源站| 99@久久@99精品视频| 久9视频免费播放| 人妻自慰在线| 久草九九| 第四色在线观看| 国产成人亚洲综合A∨婷婷| 97久久久久| 成人网在线观看视频| 色XX综合网| 综合网网欲色| 丁香五月天电影| 亚洲色 视频| 91无码视频| 国产精品天天狠天天看| 激情五月天小说|五月天开心激情网|亚洲精品国产自在现线|黄色五月天 | 亚洲va综合va国产va中文| 婷婷五月天色网久| 99精品在线观看视频| 丁香婷婷激情网站| 丁香婷婷深情五月亚洲| 五月婷婷丁香瑟瑟视频| 九九激情网| 碰碰操91| 我淫我色婷婷五月天激情四射| 51XX午夜影福利| 狠狠色婷婷7| 9久久网| 色狠狠色噜噜AV天堂五区| 无码99| 欧美色五月| 天天插天天狠| 久久人人九| 色婷婷激情Av久久久| 99热这里全是精品| 久久小片| 九九视频精品视频精品| 日韩好吊操| 大香蕉伊然在亚洲90| 精品久久99| 国产精品视频久久99| 成人做爰A片免费看网站找不到了| 性色综合网| www.色五月| 亚洲人妻av| www夜夜操comwww| 丁香六月 婷婷六月| 色婷婷a v| av电影在线播放| 国产精品99久久久久久久女警| AV在线免费播放| 色五月色五天免费视频| 久操人妻| 丁香五月婷婷网| 免费亚洲婷婷中文字幕| 噜噜狠狠色综合久| 亚洲综合色网| 在线观看日韩12345区| 日韩视频女神99| 五月天婷婷基地丁香| 五月天婷婷黄色视频| 色娸娸综合网| 婷婷97碰碰| 久艹久| 九九操操| 久久视频在线视频| 久久99久久99精品免观看粉嫩| 亚洲激情网站| 久久色情| 五月色综合| 色婷婷五月影院| 91激情五月开心| 丁香五月影院| 六月婷综合| 日日日日日| 久久99久久99精品免视看婷| 99爽视频| 色五月天婷婷| 久久大香蕉| 久草A片| 久热99热| 五月天大香蕉| 中文字幕在线日亚州9| 色色亚卅| 五月天 另类图片| 国产资源91在线| 精品51XX| 99综合网| 久操大香蕉| 中文AV网站| 成人精品在线观看| 黃色三级三级三级三级 qixing300.shrkbk.com www.jinbozs.com tianmiaosw.com | 97人妻超级碰碰碰碰碰| 99久操视频| 五月色亭丁香| 婷婷五月电影| 五月激情丁香六月狠狠干| 综合激情五月天| 久久性爱网站| 99精品无码| 六月丁香av| 激情五月天小说| 97碰碰九九视频| 五月天伊人| 亚洲人妻av伦理| 性色综合网| 香蕉视频性爱BB做爱| 亚洲综合激情五月天婷婷| 国产精品久久久久久久久久| se99在线| 婷婷五月天免费小说| bbwcuckold精品熟妇| 99综合99| 丁香五月电影| 久久婷婷精品| 少妇性按摩无码中文A片 | 天天狠狠婷婷在线| 成人做爰黄A片免费看直播室男男| 夜夜人妻五月天| 操日本人妻视频| 五月婷婷激情中心| 婷婷丁香97| 欧美激情五月天| 狠狠色婷婷综合开心影视| 美欧日韩国产成人在战| 婷婷丁香午夜综合影视| 久久九九在线视频| 色香蕉影院| 九九热123| 5Www色5夜| 影音先锋天天日| 秋霞三级色戒| 男人的天堂五月丁香| 一本久道综合色婷婷五月| 五月婷婷啪啪| 日韩无码性爱| 成人婷婷色五月天| 色99热| 97高清国语自产拍| 国产偷人爽久久久久久老妇APP | 天天色天天射天天日| 五月丁香久久网| 人人爽人人射-美女久久久久久久久久-成人AV| 99网| 五月丁香六月激情综合| 日本欧美在线| 丁香五月综合激情久久潮喷| 9 1超碰九色| 久操福利| 色婷婷丁香五月色综合网| 久热这里只有精品6| 六月丁香婷婷色狠狠久久| www.99热这里只有精品| 伍月婷婷六月丁香| 婷婷丁香六月| 超碰成人在线观看| 激情五月婷黄版| 婷婷五月天综合在线| 五月婷婷在线观看| 激情 婷婷| 六月丁丁香| 嫩BBB槡BBBB搡BBBB| 久久丁香五月婷婷| www.97碰碰com| 日日夜夜久| 成人中文网| 五月丁香久久精品在线观看| 大香蕉天堂| 亚洲影院婷婷色| 黄涩毛片| 国产人妻777人伦精品HD| 婷婷久久性爱| 欧美性丁香色色五月天干干| 亚洲激情综合| 琪琪色五月婷婷老师| 玖月婷婷爱丁香| 婷婷五月天美女21p| 日本WwW色偷偷丁香花久久久京东热| 丁香五月婷婷深爱综合激情| 久久激情网| 色吧网综合| 色热久资源| 日本三级黄色大片| 色综合大香蕉| 亚州色色色| 五月天婷婷色综合| 色婷婷五月天不卡| 99久久天堂婷婷| AV伊人青草丁香六月| 激情婷婷色色| 97干在线视频| 97精品自拍视频| av第一二区| 亭亭五月丁香五月天激情| 六月丁香开心婷婷欧美| 热热久久99| 色五月婷婷7777| 激情网站五月| www.99色| 日本色婷婷五月天成人电影| 人人摸人人搞| 丁香综合伊人| 欧美性色A片免费免费观看的| 中文人妻主播久久| 99精品在线观看| 婷婷色中文字幕| 五夜婷婷| 五五月丁香花激情综合网| 色五月亚洲| 狠狠色丁香婷婷综合久久97AV| 色五月综合网| 日日干日日s| 666555。COm毛片| 色综色五月天婷婷| 无码成人AAAAA毛片AI换脸| 99re这里只有精品9| 婷婷五月天网| www.色擼擼.com| 国产毛片精品一区二区色欲黄A片| 极品人妻VIDEOSSS人妻| 五月天激情亚洲| 99久久这里只有精品免费官网| 欧美 色婷婷| 久9视频| 天天综合色| 久久精品噜噜噜成人A∨色欲| av色色国产| 婷婷五月综合色中文字幕| 夜夜操狠狠操| 九九性视频| 天天色伊人| 91狠狠色| www久| 五月色婷婷影院| www婷婷| 操人无码| 日本色婷婷五月天成人电影| www,色色色网站| 亚洲成人免费在线| 久久总和99| 婷婷五月天激情网址| 高清 码 免费看片短视频| 婷婷91| 91综合在线| 丁香五月成人论坛| www.lchjjc.com| 久久久五月四色| 97人妻碰碰碰久久香蕉| 色色99| 丁香五月综合在线观看| www综合久久| 九九無妻| 久久久久久久久久8888| 久久免费高| 丁香九月婷| 五月天成人在线播放丁香| 婷婷五月综合久久中文字幕| 国产一级片色色| 九九re精品视频在线观看| 亚洲小视频免费播放| 免费视频WWW在线观看网站| 亚洲综合激情五月久久| 色婷婷精品小视频| 五月丁香六月激情综合| 五月婷婷六月激情| 99热精品在线观看| www.minyis.com【JT】实力收量可预付QQ2101460746 | 五月人人丁香婷婷五月人人丁香| 狠狠干天天日| 久久久激情| 久久婷婷五月综合色天| 色月丁| 激情综合网五月丁香| 婷婷九九| 久久久久9| 99自拍视频在线| 丁香婷婷六月天| 第四色激情网| 久久天堂色| 五月天婷婷影院影院观看| 亚洲丁香五月天视频| 1000部毛片A片免费观看| 六月份天丁香婷婷| 99精品热| 久婷婷色| 婷婷五月天小说网| 伦99热| 凹凸7777操操操| 91大神在线免费看视频全集男男一起操| 亚洲一区二区无码蜜乳av| 一级精品999WWW| 墨西哥毛片内射精| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 丁香五月天在线| 26uuu激情五月天| 日本成人综合| 超碰伊人碰婷婷五月| 婷婷99| 99热.com| 久久激情五月| 97热这里精品在线视频| 婷婷六月激情| 五月天激情啪啪| 五月激情视频| 91超碰在线观看| 色综合视频| 99精品女人天堂| 九九综合88| 91在线人| av人人操| 婷五月天| 久久99免费视屏| www.狠狠狠狠| www.com色播五月天| 国产67194| 五月丁香基地| 97欧美在线| 激情六月综合| 婷婷丁香色情| 激情AV在线| 9色在线| 婷婷六月丁香激情| 成人网丁香五月| 九九热视频网站| 丁香婷婷六月激情文学 | 色五月久久成人婷婷| 五月丁香色情| 大香蕉精品视频| 亚洲一区二区无遮挡A片| 91精品人妻少妇无码影院| 婷婷综合欧美| 琪琪狠狠干| 五月丁香六月婷| 三级三久久线久久99久目本WW| 六月丁香婷婷网| 激情网第四色| 六月丁香大香蕉| 久久久99久久| 色婷婷五月天天天天天| 开心五月激情站| 这里只有精品视频在线看| 九九色热视频| 婷婷 丁香 精品| 久久伦乱| 久久激情五月天| 大香蕉久操| 99热啪啪| 天堂久久大香蕉| 国产毛片精品一区二区色欲黄A片| 97精品人人A片免费看| 丁香六月天婷婷色| 六月丁丁香| 久久久91精品| 伊人9在线| 色八月婷婷| 91九色偷拍| 天堂久久性| 激情综合网丁香| 99在线视频在线观看| 开心五月色婷| 99热这里只有精品青草| 色综合色色| 免费无码毛片一区二区A片| h在线看免费版在线看| 日韩无码AV电影网站| 免费操超碰| 91久久婷婷| 亚洲综合激情五月久久| 99只有这里是精品| 狼人婷婷综合| 国产SUV精品一区二区6| 色色婷婷综合| 色哟哟www| 成人网站免费sxj| 97碰碰视频| 欧美大片免费播放器| 中文字幕人妻AV| 激情色播| 丁香婷婷激情网站| 日本91在线| 超碰免费人| 亚洲AV中文在线| 亚洲综合婷婷五月| 五月丁香六月色婷婷| 丁香五月香蕉| 综合另类激情| 五月丁香婷婷激情四射迷人| 婷婷五月天改成什么了| 无套内射极品大美女| 欧州婷婷五月天综合| 久久久免费图片视频| 激情精品久久| 黄色笑话深爱激情网丁香五月婷婷啪啪啪啪啪| www激情| 超碰久热| 国产 码在线成人网站| 蜜臀综合久草| 五月激激网w'w'w| 色色网91| 久久丝丝热| 99热精品中文字幕| 中国丰满熟女A片免费观| 中字幕视频在线永久在线观看免费| 丁香五月激情五月| 五月婷婷婷| 五月丁香六月停停| 五月丁香激情片| 五月丁香视频在线观看| 激情五月色婷婷| 成人亚洲精品久久久久| 操操啪| 麻豆123区| 香焦网五月天| 国产精品24r| 97丁香五月天| 亚洲黄色影视| 99色日本| 99热久久这里只有精品2010| 国产精品成人AV在线| 国产XXXX搡XXXXX搡麻豆| 婷婷她六月天| 欧美婷婷日本| 亚洲成人网站在线播放| 99在线精品视频| 性爱五月婷| 婷婷丁香五| 久久免费精彩视频| 久久久这里有精品| 婷婷综合网性| 99爱视频在线免费观看| 婷婷性爱影院| 无码AV大香线蕉伊人| 五月青青草综合| www.婷婷六月天| 91九色在线| 五月丁香无码| 日日操夜夜操无码免费| 日日.c| 五月丁香色停停啪啪啪| 成人 在线 日韩| 91人操人人人操人| 丁香玖玖| 色99在线| 色婷六月| 2020日日干| 色网五月婷婷| 亚洲第一色色色| 婷婷色五月激情| 婷婷六月丁香激情| 五月天桃色深爱网| 婷婷丁香五月色偷偷| 国产一级婬片毛片| 黄色五月婷婷| 天天日夜夜欢| 色碰碰视频| 九九碰九九爱97超碰| 国产成人+综合亚洲+天堂| 丁香伊人五月色婷婷五十路| 99免费在线| 色婷婷人人| 亚洲操b| 婷婷九月在线| 99热最新网址| 1024欧美看片| 亚洲a色| 在线观看中文字幕| 婷婷色五月偷拍| 成人无码精品1区2区3区免费看| 婷婷综合爱| 色色丁香五月天| 韩日另类| 97精品综合久久| 亚洲综合在线视频| 亚洲性受XXXX五月丁香| 五月天婷婷久久视频| av婷婷丁香 六月| 99网| 天天五月情| 99视频免费播放| 91人人爽久久涩噜噜噜| 第四色网婷婷| 五月丁香综合啪啪| 国产午夜精品一区二区| 99久久99热| 九洲一级A片| 日本综合久久| 五月色丁香| www.色擼擼.com| 2015超碰| 丁香五月玖玖| 丁香久久九九99| 伊人婷婷五月天| 婷婷无码视频| EEUSS鲁片一区二区三区| 六月丁香婷婷尤物| 亚洲电影中文字幕| www.henhenl| 五月婷婷六月丁香激情综合网| 99操| 婷婷五月丁香超碰| 久热无码| 欧美99热| 99riAv1国产在线观看| 欧洲第一无人区观看| 99久久97| 超碰二区| 亚洲激情丁香五月基地| 一本九九色| 色五月天婷婷| 丁香五月在线观看完整版| 五月婷婷丁香五月天| AV片在线观看| wuyuedingxiang99| 99色视频| 这里只有精彩亚洲视频推荐| 亚洲另类在线观看| 性色天| 五月天开心网| 久热在线中文字幕色999舞| 日日干四虎| www.色五月.com| 久久婷婷精品| 久久这里只有精品视频15 | 九九色院| 超碰在线看| 一级性爱视频| 丁香花五月天激情| 疯狂做受XXXX高潮A片| 亚洲激情五月| 情五月亚洲婷婷| 亚洲成人网站在线| 少妇高潮呻吟A片免费看软件| 婷婷五月天网| 激情六月丁香| 色综合天天综合成人网| 五月婷婷六月色| 视频一二区| 六月丁香深深爱综合网| 六月综和久久| A久网| 久久精品性爱| 激情小说五月天| 久草婷婷网| 欧日韩成人| 亚洲成人在线综合| 激情综合网激情五月婷婷| 99re热在线视频| 亚洲色激情| 激情五月天之六月婷婷| 色色色婷婷| 九九婷婷激情综合网| 丁香五月激情网| 丁香六月啪啪啪| 99热在线这里| 97热精品| 久久182| 青青草青青草五月天| 一本色道久久综合狠狠躁小说| 人妻五月天激情开心网| 亚洲国产精品成人免费一区久久久在线观看AAAA | 婷婷综合五月天| 五月天天天色| 狠狠干 狠狠操| 天天爽天天日人人爱| 在线成人视频免费| 91紱請| 99热这里是精品| www.久久| 26UUU欧美激情一区二区| 五月丁香啪啪综合| 国产精品A片| 色婷婷久久综合中文久久一本| 一本色道久久综合狠狠躁小说| 九色在线五月婷婷网址| 九月色婷婷| 99色精品| seuuu婷婷| 激情亭亭五月| 影音先锋综合网| 99热99成人| 91视频精品99| 青青日韩| 99精色| 5月丁香综合图区| 久久久久久久综合狠狠综合| 这里只有精品视频| 国产AV一区二区三区日韩| 国庆精品久久| 激情五月天小说| 色噜噜狠狠色综合网| 午夜福利8055| 中文字幕高清av| av五月天婷婷丁香| 丁香婷婷六月| 99视频日韩| 久色大香蕉| 天堂伊人干| 免费碰碰视频久| 丁香婷婷久| 丁香六月欧美| 色月丁| 天色综合网| 亚洲性视频| 婷婷五月AV| 婷婷五月天成人| 97色色色色| 婷婷免费成人视频| 五月丁香婷婷六月天| 99热在线这里只有精品| 337p大胆噜噜噜噜噜91Av| 大香蕉啪啪网| 综合综合色色| 97久久香草精品视频| 色色网站免费观看| 久久综合丁香激情五月| 亚洲激情另类| 丁香九月婷| 色婷婷久久| 亚洲色综合| 五月天激情小说| 色婷婷在线电影| 亚洲精品第一色色色色色色| 亚洲AV成人无码精品| 一区二区三区XXXXXX| 婷婷丁香九月| 国产永久一二一起草| 色9999综合久久| 亚洲激情免费久久| 人妻熟妇国产精品| 天天日夜夜爽| 色五月丁香伊人五月| 亚洲av电影网站| 超碰93在线观看| 伊人大香五月天| 国产人人操| 99久久久| 五月丁香综合中文| 激情中文在线| 九九九日本熟女| 五月婷婷六月激情在线| 天天爽天天透天天爱| 色婷婷狠狠| 丁香五月影院| 欧美叉叉叉BBB网站| 97超碰99热99| 成人av在线电影| 一本伊人色婷| 色婷婷狠| 色婷网| www99精品在线观看| 9久久久久久久久久久| 婷婷丁香五月精品| 激情五月婷婷五月丁香五月开心五月 | 五月综合丁香婷婷| 热99精品视频五月| 少妇高潮A片无套内谢麻豆传| 中字幕视频在线永久在线观看免费| 九月丁香很很色| 黄网免费看| -91九色大屁股| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 亚洲妇女熟BBW| 婷婷综合日本| 成人色五月天| 激情图片久久| 女人天堂AV| 五月丁香偷拍| 青青热视频| 人人人操B超碰| 日日爽日日| 91趴趴| 色五月激情五月丁香五月婷婷啪啪综合| 99这里只有精品8| 婷婷 丁香 精品| 99久久性爱| 国内在线99视频| 婷婷国产日本欧美| 亚洲精品99| 97资源欧美日韩大香蕉超碰一区| 欧美精品99| 久久五月天婷婷| 激情五月天偷拍综合网| 婷婷六月激情在线视频| 五月婷婷丁香六月| 亚洲成人影视在线观看| 国产美女主播vip| 久9免费视频| 丁香五月影| 热的五码久久精品| 婷婷的99视频网站| 天天操天天爱天天日| 天天夜夜六月丁香五月婷婷老师| 婷婷色综合中心站| 狠狠操之狠狠操| 丁香五月久久综合| 99热手机在线精品| 操碰久| 久久久999精品| 五月天狠狠干| 91丨九色丨东北熟女| 91九色PORNY中文啦| 无码人妻电影| 婷婷五月天AV网| 伊人五月丁香| 欧美在线视频免费播放| 欧美性猛交AAAA片黑人 | 五月婷婷,六月婷婷| 亚洲午夜av| 1024手机在线观看看片_日韩精品| 婷色视频| 婷婷五月丁香狠狠| 99亚洲视频| 天天干,夜夜爽| 色婷婷狠狠18yy| 婷婷综合网| 婷婷六月亚洲综合| 无码99| 五月丁香啪啪激情| 99国产视频网| 91啪啪网| 亚洲成人影视在线观看| 色五月av| 色五月丁香A欧美com| 久久这有这里精品| 超碰在线视屏| 91免费看片| 激情99| 亚州男人天堂婷婷五月| 五月婷六月丁香| 亚洲无AV在线中文字幕| AV在线资源| 99精品自拍视频| 中文AV在线播放| 五月婷婷偷拍| 色七七九九| 亚洲婷婷丁香| 色狠狠999综合| 丁香六月婷婷综合色| 99ri国产| 五月天大香蕉视频| 色色无码日韩| 色99在线视频| 丁香五月婷婷日本| 月色色综合婷婷网| 99自拍视频网站| 久久久久久草黄色片AV在线观看| 天天爽天天| 国产Va视频| 婷婷五月天渟渟| 五月天婷婷色色| 国产精品涩涩涩视频网站| 99热99在线| 亚洲1区| 婷婷天天综合| 91碰操| 婷婷激情六月视频| 开心婷婷五月天电影院| 色久一| 亚洲精品视频在线| 婷婷五六月丁香| 免费视频WWW在线观看网站| 婷婷五月大香蕉| 色婷婷视频在线| 狠狠狠狠狠操| 丁香五月色网| 欧美97超碰| 丁香色综合| 9er热在线精品视频| 九九丁香社区欧美激情| 久久A V无码视频| 强伦轩人妻一区二区电影| 色五月天丁香婷婷| 国产FREESEXVIDEOS性中国 | 国产AV一区二区三区日韩| 五月丁香久久久| 欧美一黄一色一乱一伦| 99视频在线播放大全| 99这里只有精品在线| 99噜噜噜在线播放| 五月六月婷婷| 91久久综合| 亚洲色五月天| 黄页大全十八禁| 五月婷婷六月丁香首页| 久久五月丁香| 日日操夜夜操狠狠操| 一本婷婷丁香久久| 日本九九视频| 人人操Av| 色黄啪啪| 九九99在线免费在线观看视频| 亚洲激情无码久久| 欧美婷婷色| 91婷婷搞| 五月天婷婷伊人|