问卷系统该如何设计
這里寫自定義目錄標題
- 項目背景
- 項目需求
- 技術難點
- 參考項目
- 參考項目1-DWSurvey 調問表單問卷系統 github標星1.4k
- 參考項目2-limesurvey強大的開源問卷系統
- 創建新問卷
- 參與問卷調差
- 總結
項目背景
公司原有問卷系統項目較老,項目維護修改不方便,要求用java重寫一套問卷系統
項目需求
1.能夠方便的與公司原有系統進行對接.能夠和.net php java等后臺進行對接。
2.能夠實現問卷新增 問卷答案統計等需求。
3.問卷能夠實現選擇、填空、矩陣等題型。
4、能夠實現跳題邏輯.
技術難點
1.如何方便的和公司原有系統以及.net php 系統對接
2.因為問卷數據的不確定性,怎么樣在數據庫存儲能夠做到好存好查 好統計
3.矩陣題型如何實現
4.根據預設條件進行題目跳轉如何實現
參考項目
作為一個菜鳥程序員,拿到需求后首先想到的就是找一下相關的開源項目參考一下,取其精華去其糟粕,然后綜合形成自己的思路.奈何github上面值得參考的開源項目并不多
參考項目1-DWSurvey 調問表單問卷系統 github標星1.4k
https://github.com/wkeyuan/DWSurvey
1、單獨系統沒有辦法與其他系統進行對接。
2、每個題型的題目數據和答案數據分表存儲,數據庫數據存儲比較細致便于查詢和統計,不便于擴展,數據庫我們在設計時要兼顧性能和功能,好的數據庫設計是尋找二者的平衡點,這個項目數據庫存儲有點過于細致了。
3、矩陣題型按照行和列存儲 答案存儲行和列的id 數據庫設計中規中矩。
4、題目跳轉邏輯只設計了評分題和選擇題的跳轉,跳轉分為控制題目顯隱和跳題兩種方式。
5、后臺使用struts2+Hibernate,技術太老,不利于更新維護,前端是用jstl+jsp ,同樣是技術太老不利于迭代,估計項目作者是個元老級工程師,雖然該項目沒有完全開源,但是我們依舊能夠通過已經開源的代碼來猜測出來作者的整體項目設計思路
參考項目2-limesurvey強大的開源問卷系統
https://community.limesurvey.org/downloads/
單獨的系統,社區版本php全開源,題型能滿足大部分調查場景,我們重點分析一下limesurvey的數據庫設計和前端實現,忽略limesurvey的細節,只關注主要邏輯的實現
創建新問卷
創建問卷
創建題組
創建問題
編輯子問題
編輯答案選項
設定條件
經過以上幾步在數據庫中形成的數據如下 (由于數據過多,只挑選一些基本流程數據進行分析)
- 問卷表
| 341787 | 1 | 1 | Administrator | Y |
-
問題表
-
問題選項表
-
問題跳題邏輯表
基本的問卷數據就存在這幾張表中,還有一些其他的附屬屬性設置數據存在其他的表中,可以說數據庫設計相當簡潔,前端拿到問卷問題數據,問卷選項數據就可以根據問題type字段對數據進行有機的組合來形成各種問題ui,填空選擇,矩陣,子問題前端都可以根據這些數據進行實現,
有意思的是問題跳轉邏輯表,limesurvey的跳轉邏輯是這樣的,首先在數據庫中存儲一個表達式(例如該表中的表達式為cfieldname==A1),如果表達式成立那么id為qid的題目將會一直顯示,如果表達式不成立則該題目自動隱藏。另外 這個表達式是怎么來的,cfieldname是怎么來的后面我們會講到
參與問卷調差
完成問卷后會發現limesurvey的問題答案在數據庫是怎么存儲的,會發現數據庫多了一個名為lime_survey_341787的表格,表格中的數據如下
上面表格中的數據就是調查問卷的答題數據,我做了兩次問卷所以產生了兩條記錄,看一下數據庫中的表的每個字段是怎么產生的,通過分析數據得知答案的每個字段名為sid+‘X’+gid+‘X’+qid+title+scale_id,即:問卷id+‘X’+問題組id+‘X’+問題id+子問題title+答案選項的scale_id
還記得上面提到的問題跳轉邏輯中的cfieldidname字段嗎?就是從這里來的
總結
通過對上面兩個開源項目的分析我們基本有了自己的實現思路。
總結
- 上一篇: 一,FPGA配置及文件生成烧写
- 下一篇: 用Python完成毫秒级抢单,助你秒杀淘