試源碼v1.0:從題庫(kù)管理到自動(dòng)計(jì)分的完整PHP實(shí)現(xiàn))
簡(jiǎn)介心理測(cè)試源碼v1.0是一套情感測(cè)試類全靜態(tài)網(wǎng)頁(yè)源碼面向網(wǎng)站開發(fā)初學(xué)者、站長(zhǎng)或?qū)π睦頊y(cè)試欄目感興趣的個(gè)人開發(fā)者可用于快速搭建測(cè)試專題站或參考其頁(yè)面組織方式。壓縮包共482個(gè)文件以447個(gè)htm頁(yè)面為主體輔以33個(gè)gif圖片和少量js、db文件整體大小僅996KB部署輕量、結(jié)構(gòu)清晰其中htm頁(yè)面對(duì)應(yīng)各測(cè)試欄目與結(jié)果展示gif作為界面配圖js與db用于簡(jiǎn)單交互和數(shù)據(jù)緩存。該資源已有1510人學(xué)習(xí)下載資源內(nèi)覆蓋測(cè)試空間、情愛(ài)測(cè)試、心理測(cè)試、社交測(cè)試、成功測(cè)試、性格測(cè)試、性愛(ài)測(cè)試、個(gè)性測(cè)試、異類測(cè)試等欄目全部為靜態(tài)HTML頁(yè)面無(wú)需數(shù)據(jù)庫(kù)與后端環(huán)境解壓即可瀏覽通過(guò)頁(yè)面間的跳轉(zhuǎn)關(guān)系和分類組織可以直觀學(xué)習(xí)多欄目測(cè)試網(wǎng)站的內(nèi)容規(guī)劃與純前端交互實(shí)現(xiàn)方式還包含配套GIF圖片資源適合直接使用或二次修改。 你隨手搜「心理測(cè)試源碼」蹦出來(lái)的結(jié)果要么是老掉牙的ASP項(xiàng)目要么是只給前端不給后端邏輯的半成品能真正跑通、還能按自己需求改造的其實(shí)不多。這套「心理測(cè)試源碼 v1.0」就是我從零搭起來(lái)的一套完整可運(yùn)行系統(tǒng)題庫(kù)動(dòng)態(tài)維護(hù)、在線答題、自動(dòng)計(jì)分、報(bào)告生成、管理員后臺(tái)一個(gè)不落。整個(gè)主流程沒(méi)依賴任何重型框架普通虛擬主機(jī)就能跑前端用的響應(yīng)式H5手機(jī)電腦都能正常答題。這套源碼適合三類人一是想做趣味測(cè)試類小程序或公眾號(hào)H5的獨(dú)立開發(fā)者拿它當(dāng)?shù)鬃钍∈露菍W(xué)校、企業(yè)內(nèi)部要做心理測(cè)評(píng)或培訓(xùn)反饋的直接改題庫(kù)就能用三是剛?cè)胄械暮蠖诵率窒胝乙粋€(gè)「不是CRUD demo、有真實(shí)業(yè)務(wù)邏輯」的完整項(xiàng)目來(lái)讀源碼。我在這篇文章里會(huì)把v1.0的整體設(shè)計(jì)思路、技術(shù)選型理由、關(guān)鍵代碼實(shí)現(xiàn)、以及我實(shí)際踩過(guò)的坑全部拆開講照著敲一遍你也能搭出一套自己的心理測(cè)試系統(tǒng)。1. 為什么做一套心理測(cè)試源碼v1.0到底解決了什么1.1 心理測(cè)試源碼的核心需求拆解市面上的心理測(cè)試平臺(tái)不少但真到要自己部署一套的時(shí)候你會(huì)發(fā)現(xiàn)需求其實(shí)非常具體。核心訴求無(wú)非這幾條第一題庫(kù)要能隨時(shí)增刪改不能每換一套題就改代碼第二答題過(guò)程要順暢題目可以分頁(yè)、支持單選和多選第三計(jì)分邏輯要靈活一套量表可能是總分制也可能是分維度計(jì)分第四用戶答完要立刻看到對(duì)應(yīng)結(jié)果的報(bào)告頁(yè)面最好還能隨時(shí)回看歷史記錄第五管理員要有個(gè)后臺(tái)能看到多少人測(cè)過(guò)、大概的分?jǐn)?shù)分布。這五點(diǎn)拆開看都不難但組合在一起再加上「要能部署在廉價(jià)虛擬主機(jī)上」這個(gè)約束就篩掉了一大批技術(shù)方案。v1.0的設(shè)計(jì)目標(biāo)就是把這五條全部落地且保持代碼可讀、可改、不黑魔法。1.2 v1.0的邊界不做大而全先把主流程跑通很多人的第一個(gè)版本死于「想太多」。我一朋友做類似項(xiàng)目第一版就上了Redis、消息隊(duì)列、微服務(wù)拆分結(jié)果折騰了兩個(gè)月還沒(méi)上線。心理測(cè)試源碼v1.0的定位特別明確不搞用戶注冊(cè)登錄體系先用游客ID瀏覽器本地存儲(chǔ)不做付費(fèi)解鎖那是后面版本的事不接短信通知不做復(fù)雜權(quán)限。核心只圍繞「答題—計(jì)分—出報(bào)告」這條主干鏈路。這樣做的好處是顯而易見(jiàn)的開發(fā)周期被壓縮到了兩周以內(nèi)部署環(huán)境要求極低任何一個(gè)懂點(diǎn)PHP的人都能看懂全量代碼。更重要的是當(dāng)你把主流程跑通之后后續(xù)加功能就像往架子上添磚而不是返工重建。2. 技術(shù)選型與整體架構(gòu)2.1 語(yǔ)言與框架為什么我選了PHP而非Python/Java編程語(yǔ)言之爭(zhēng)永遠(yuǎn)有熱度但落到「心理測(cè)試源碼」這個(gè)具體場(chǎng)景選型邏輯其實(shí)非常清晰。我當(dāng)時(shí)在PHP和Python之間糾結(jié)過(guò)一陣子Python的生態(tài)確實(shí)好做數(shù)據(jù)分析、可視化報(bào)告都很順但部署是個(gè)門檻——大多數(shù)廉價(jià)虛擬主機(jī)對(duì)Python的支持都不如PHP原生。最終選了PHP 7.4 MySQL 5.7這套組合原因有三一是部署最省心幾乎任何主機(jī)商都支持上傳即用二是PHP的數(shù)組處理對(duì)「題目選項(xiàng)」「評(píng)分規(guī)則」這種JSON結(jié)構(gòu)的操作非常順手三是我要寫的業(yè)務(wù)邏輯不復(fù)雜用原生PHP反而比上框架更直白讀者看起來(lái)也更容易理解。前端部分v1.0沒(méi)有用Vue或React而是用了原生HTML CSS 輕量jQuery。理由很簡(jiǎn)單這版核心是答題交互不需要復(fù)雜的前端狀態(tài)管理原生寫法加載更快也不存在跨域和構(gòu)建問(wèn)題。誠(chéng)然如果你想把心理測(cè)試嵌到小程序里前端部分后期可以替換成uni-app但后端接口設(shè)計(jì)成無(wú)狀態(tài)的就完全不用動(dòng)。2.2 數(shù)據(jù)庫(kù)設(shè)計(jì)5張表搞定題庫(kù)、答題與報(bào)告數(shù)據(jù)庫(kù)是整個(gè)系統(tǒng)的地基。v1.0里我總共只設(shè)計(jì)了5張核心表沒(méi)有過(guò)度設(shè)計(jì)每張表都有明確職責(zé)。表名職責(zé)說(shuō)明關(guān)鍵字段tests測(cè)試量表定義id, title, description, type, statusquestions題目表id, test_id, content, question_type, sort_orderoptions選項(xiàng)表id, question_id, option_text, score_value, sort_orderanswers用戶答題記錄id, test_id, user_token, answer_data, created_atresults結(jié)果報(bào)告表id, test_id, user_token, total_score, level, report_content, created_at這套設(shè)計(jì)的核心思路是「量表-題目-選項(xiàng)-記錄-結(jié)果」五層分離。tests表存每套測(cè)試的基本信息type字段用來(lái)區(qū)分是「趣味型」還是「專業(yè)型」這會(huì)影響到計(jì)分規(guī)則questions和options是一對(duì)多關(guān)系標(biāo)準(zhǔn)的主從表設(shè)計(jì)answers表里的answer_data字段存的是JSON格式的完整答題快照這樣用戶中途退出再回來(lái)能恢復(fù)也能追溯計(jì)分過(guò)程results表存最終計(jì)算出來(lái)的分?jǐn)?shù)和報(bào)告內(nèi)容。有一個(gè)細(xì)節(jié)值得強(qiáng)調(diào)為什么不把選項(xiàng)直接存在題目表里而是單獨(dú)拆一張options表因?yàn)樾睦頊y(cè)試?yán)锝?jīng)常出現(xiàn)「同一道題在不同測(cè)試?yán)镞x項(xiàng)文字相同但分值不同」的情況拆開之后題目和選項(xiàng)就是一次設(shè)計(jì)、多處復(fù)用。比如經(jīng)典的「焦慮自評(píng)量表」20道題的選項(xiàng)都是「沒(méi)有/有時(shí)/經(jīng)常/總是」但不同維度的題目正向計(jì)分和反向計(jì)分規(guī)則不一樣這時(shí)候選項(xiàng)表里的score_value字段就能配合反向計(jì)算邏輯一起工作。3. 核心功能拆解與實(shí)現(xiàn)細(xì)節(jié)3.1 量表設(shè)計(jì)與評(píng)分模型總分制和維度制都得支持心理測(cè)試的核心是評(píng)分模型。v1.0我實(shí)現(xiàn)了兩種最常見(jiàn)的計(jì)分方式總分制把所有題目得分累加對(duì)照分?jǐn)?shù)區(qū)間輸出結(jié)論和維度制把題目按標(biāo)簽分組分別計(jì)算各維度得分??偡种谱詈?jiǎn)單比如一個(gè)20題的抑郁自評(píng)量表每個(gè)選項(xiàng)計(jì)1-4分總分20-80分然后按區(qū)間劃分20-40分正常41-50分輕度51-60分中度60分以上建議就醫(yī)。這種模型用一個(gè)純函數(shù)就能搞定。維度制稍微復(fù)雜一點(diǎn)它要求題目表里得有一個(gè)dimension字段。比如一個(gè)性格測(cè)試拆成「外向性」「情緒穩(wěn)定性」「開放性」三個(gè)維度每道題屬于其中一個(gè)維度計(jì)分時(shí)按維度分別累加。實(shí)現(xiàn)上就是在計(jì)分引擎里多一層分組邏輯先遍歷用戶答案按題目ID找到對(duì)應(yīng)的dimension累加到各自的維度總分里最后生成雷達(dá)圖數(shù)據(jù)。這里我要特別提一個(gè)容易踩坑的點(diǎn)反向計(jì)分。很多心理量表為了防盲從會(huì)把一半題目設(shè)計(jì)成反向敘述比如「我感覺(jué)生活充滿希望」是正向「我經(jīng)常感到絕望」是反向。反向題的得分不能直接用選項(xiàng)分值必須做換算如果選項(xiàng)分值是1-4那反向題的得分就是5減去選項(xiàng)分值。v1.0的題目表里專門加了一個(gè)is_reverse字段計(jì)分引擎里判斷一下就行。3.2 答題流程與接口設(shè)計(jì)一次答題請(qǐng)求是怎么走完的答題接口的設(shè)計(jì)直接決定了前端開發(fā)的體驗(yàn)。v1.0采用了「一測(cè)一接口、一次提交全部答案」的簡(jiǎn)化模式而不是每道題單獨(dú)請(qǐng)求。整體流程分三步第一步用戶請(qǐng)求開始測(cè)試前端POST請(qǐng)求到start_test.php后端生成一個(gè)唯一的user_token用時(shí)間戳隨機(jī)數(shù)MD5生成并在answers表插入一條空記錄返回題目列表和測(cè)試的基本信息。第二步用戶答完所有題目后前端把答案數(shù)組一次性POST到submit_test.php數(shù)據(jù)結(jié)構(gòu)大概是這樣的{ test_id: 1, user_token: a1b2c3d4e5f6, answers: [ {question_id: 1, option_id: 2}, {question_id: 2, option_id: 3} ] }第三步后端收到這個(gè)請(qǐng)求后做三件事校驗(yàn)答案合法性題目是否存在、選項(xiàng)是否屬于該題目、逐題計(jì)分、生成報(bào)告寫入results表。整個(gè)流程同步執(zhí)行響應(yīng)時(shí)間基本在100毫秒以內(nèi)體感上用戶提交完立刻就能看到結(jié)果頁(yè)。這里有個(gè)設(shè)計(jì)取舍值得聊一下。為什么不設(shè)計(jì)成「每答一題自動(dòng)保存」因?yàn)樾睦頊y(cè)試的特殊性在于用戶跳過(guò)某道題是很常見(jiàn)的行為如果強(qiáng)制每題都請(qǐng)求一次后端反而會(huì)因網(wǎng)絡(luò)波動(dòng)導(dǎo)致答案丟一半。v1.0的策略是允許用戶全部答完再提交同時(shí)在提交時(shí)后端會(huì)檢查是否存在未答題目如果有就返回提示「還有第X題未作答」。3.3 報(bào)告生成輸出一段“看起來(lái)專業(yè)”的測(cè)評(píng)結(jié)論報(bào)告是心理測(cè)試系統(tǒng)的門面用戶做了20道題最后就為了看那幾段文字。v1.0的報(bào)告生成我采用了一個(gè)很實(shí)用的模板方案每個(gè)測(cè)試在配置里維護(hù)一份多級(jí)別的報(bào)告內(nèi)容數(shù)組每個(gè)級(jí)別對(duì)應(yīng)一個(gè)分?jǐn)?shù)區(qū)間里面包含標(biāo)題、描述、建議三個(gè)字段。你可能會(huì)問(wèn)報(bào)告內(nèi)容是不是得靠心理學(xué)專業(yè)人士來(lái)寫其實(shí)不用。90%的趣味測(cè)試場(chǎng)景下報(bào)告文案只要在「正向肯定」和「適度建議」之間拿捏好分寸就行。比如一個(gè)壓力測(cè)試高分區(qū)間可以寫「當(dāng)前壓力水平較高建議適當(dāng)調(diào)整作息、增加運(yùn)動(dòng)」低分區(qū)間寫「壓力水平較低心態(tài)較為平穩(wěn)」。這既不是醫(yī)學(xué)診斷也不涉及任何敏感信息。生成報(bào)告的偽代碼思路很簡(jiǎn)單$level findLevel($totalScore, $testConfig[ranges]); $report $testConfig[reports][$level]; // 寫入results表并返回為了讓報(bào)告看起來(lái)更個(gè)性化v1.0還做了一個(gè)小功能如果用戶答案里出現(xiàn)了某個(gè)「關(guān)鍵題」的特殊選項(xiàng)會(huì)給報(bào)告追加一句備注。比如一個(gè)職業(yè)傾向測(cè)試第5題選了「喜歡獨(dú)立完成任務(wù)」那報(bào)告里會(huì)額外提到「你更適合獨(dú)立型的工作節(jié)奏」。這個(gè)通過(guò)配置一個(gè)keywords規(guī)則數(shù)組就能實(shí)現(xiàn)不用寫死邏輯。4. 實(shí)操過(guò)程與核心環(huán)節(jié)實(shí)現(xiàn)4.1 從零搭建環(huán)境準(zhǔn)備與項(xiàng)目骨架我建議你本地用XAMPP或phpStudy搭環(huán)境PHP版本要求7.4以上MySQL 5.7以上不用裝任何擴(kuò)展原生PDO連接數(shù)據(jù)庫(kù)就夠了。項(xiàng)目目錄結(jié)構(gòu)我直接分享一下psych-test/ ├── api/ │ ├── start_test.php │ ├── submit_test.php │ └── get_result.php ├── admin/ │ ├── login.php │ └── manage_test.php ├── config/ │ └── database.php ├── includes/ │ ├── db.php │ ├── functions.php │ └── scoring_engine.php ├── assets/ │ ├── css/ │ └── js/ └── index.phpconfig/database.php里放數(shù)據(jù)庫(kù)連接信息includes/db.php封裝PDO單例連接includes/functions.php放一些通用函數(shù)比如JSON響應(yīng)格式化、user_token生成includes/scoring_engine.php是核心計(jì)分引擎。admin目錄下是后臺(tái)管理v1.0只有簡(jiǎn)單的一個(gè)登錄框和題庫(kù)管理頁(yè)面夠用就行。數(shù)據(jù)庫(kù)初始化腳本我放在項(xiàng)目根目錄的install.sql里建庫(kù)建表、插入一套示例測(cè)試數(shù)據(jù)。這里強(qiáng)烈建議示例數(shù)據(jù)不要只塞一兩道題至少放一套完整的10題量表不然你調(diào)試計(jì)分邏輯的時(shí)候會(huì)發(fā)現(xiàn)數(shù)據(jù)量太小根本測(cè)不出邊界問(wèn)題。4.2 計(jì)分引擎的實(shí)現(xiàn)核心代碼逐行講計(jì)分引擎是整個(gè)項(xiàng)目里最值得細(xì)看的部分也是我花時(shí)間最多的地方。我直接貼核心代碼然后逐段解釋?php class ScoringEngine { private $db; public function __construct($db) { $this-db $db; } public function calculate($testId, $answers) { // 1. 獲取該測(cè)試的題目信息和計(jì)分類型 $sql SELECT id, dimension, is_reverse FROM questions WHERE test_id ?; $stmt $this-db-prepare($sql); $stmt-execute([$testId]); $questions $stmt-fetchAll(PDO::FETCH_ASSOC); $dimensionScores []; $totalScore 0; // 2. 根據(jù)維度分組累加分?jǐn)?shù) foreach ($answers as $answer) { $questionId $answer[question_id]; $optionId $answer[option_id]; // 找到題目信息 $question null; foreach ($questions as $q) { if ($q[id] $questionId) { $question $q; break; } } if (!$question) continue; // 查出選項(xiàng)分值 $sql SELECT score_value FROM options WHERE id ? AND question_id ?; $stmt $this-db-prepare($sql); $stmt-execute([$optionId, $questionId]); $option $stmt-fetch(PDO::FETCH_ASSOC); if (!$option) continue; $score intval($option[score_value]); // 反向計(jì)分5 - 原分值 if ($question[is_reverse] 1) { $score 5 - $score; } $totalScore $score; // 維度累計(jì) $dimension $question[dimension] ?: default; if (!isset($dimensionScores[$dimension])) { $dimensionScores[$dimension] 0; } $dimensionScores[$dimension] $score; } return [ total_score $totalScore, dimension_scores $dimensionScores ]; } }第一段把該測(cè)試的所有題目一次性查出來(lái)放在內(nèi)存里避免在循環(huán)里一條條查題目不然20道題就是21次數(shù)據(jù)庫(kù)查詢性能會(huì)很差。第二段遍歷用戶提交的答案數(shù)組反向題做分值換算同時(shí)累加總分和維度分。這里有個(gè)細(xì)節(jié)dimension字段如果為空就用default兜底這樣即使出題人沒(méi)設(shè)置維度也不會(huì)報(bào)錯(cuò)。第三段下文會(huì)寫拿到計(jì)算結(jié)果后調(diào)報(bào)告生成邏輯。很多新手容易犯的錯(cuò)是計(jì)分和報(bào)告混在一起寫導(dǎo)致改報(bào)告文案的時(shí)候不小心動(dòng)了計(jì)分代碼。我的建議是嚴(yán)格分層計(jì)分引擎只負(fù)責(zé)算分?jǐn)?shù)報(bào)告生成單獨(dú)放一個(gè)函數(shù)generateReport($testId, $scoreData)。4.3 部署上線虛擬主機(jī)上的三個(gè)注意點(diǎn)當(dāng)項(xiàng)目在本地跑通之后部署上線還有幾個(gè)坑要避開。第一線上MySQL的字符集一定要設(shè)置成utf8mb4不然題庫(kù)里萬(wàn)一有生僻字或者emoji符號(hào)存進(jìn)去就變問(wèn)號(hào)。第二正式環(huán)境必須把PHP的display_errors關(guān)掉錯(cuò)誤信息暴露給用戶不僅不專業(yè)還可能泄露服務(wù)器路徑。第三admin后臺(tái)的登錄不能只用前端校驗(yàn)后端必須校驗(yàn)sessionv1.0我用了最簡(jiǎn)單的PHP session機(jī)制登錄成功后在session里標(biāo)記一個(gè)is_admin字段所有后臺(tái)操作前都檢查一下。部署環(huán)節(jié)我的建議是先在一臺(tái)測(cè)試服務(wù)器上完整走一遍安裝流程再切到生產(chǎn)環(huán)境。因?yàn)樘摂M主機(jī)的PHP版本、文件權(quán)限、MySQL賬號(hào)權(quán)限都可能和本地環(huán)境不同提前踩一遍坑能省很多事。5. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄5.1 高頻問(wèn)題速查表這套心理測(cè)試源碼開發(fā)過(guò)程中我自己和后來(lái)參照源碼搭建的朋友都遇到過(guò)一些重復(fù)出現(xiàn)的問(wèn)題整理成表格方便你直接對(duì)照排查。問(wèn)題現(xiàn)象可能原因排查與解決方法提交答案后報(bào)「數(shù)據(jù)庫(kù)連接失敗」數(shù)據(jù)庫(kù)配置錯(cuò)誤或主機(jī)不支持PDO檢查config/database.php里的主機(jī)名虛擬主機(jī)一般用localhost確認(rèn)PHP開啟了pdo_mysql擴(kuò)展中文題庫(kù)內(nèi)容變成問(wèn)號(hào)數(shù)據(jù)庫(kù)或數(shù)據(jù)表字符集不是utf8mb4執(zhí)行ALTER TABLE xxx CONVERT TO CHARACTER SET utf8mb4并檢查連接字符集報(bào)告頁(yè)面空白PHP報(bào)錯(cuò)被隱藏或計(jì)分引擎返回空數(shù)據(jù)臨時(shí)打開display_errors看報(bào)錯(cuò)信息確認(rèn)answers表里有提交記錄反向計(jì)分結(jié)果異常is_reverse字段被設(shè)成了字符串1而非數(shù)字1檢查數(shù)據(jù)庫(kù)字段類型建議用tinyint并在代碼里做intval強(qiáng)轉(zhuǎn)用戶按后退鍵后重復(fù)提交前端未做提交鎖提交后立即禁用提交按鈕后端根據(jù)user_tokentest_id唯一索引兜底5.2 兩個(gè)印象最深的坑第一個(gè)坑是并發(fā)提交導(dǎo)致的重復(fù)記錄。有個(gè)朋友部署后測(cè)試快速連點(diǎn)兩次提交按鈕結(jié)果answers表和results表各寫入了兩條記錄報(bào)告頁(yè)顯示的卻是舊數(shù)據(jù)。排查后發(fā)現(xiàn)是前端按鈕沒(méi)禁用后端也沒(méi)有做冪等控制。解決方案很簡(jiǎn)單給answers表的user_token和test_id加聯(lián)合唯一索引重復(fù)提交時(shí)SQL會(huì)報(bào)錯(cuò)捕獲后直接返回第一次的結(jié)果即可。第二個(gè)坑是題干里包含特殊字符導(dǎo)致前端顯示亂掉。早期我把題干直接拼接在HTML里結(jié)果某道題里出現(xiàn)了一個(gè)「」符號(hào)整個(gè)頁(yè)面布局瞬間崩了。后來(lái)學(xué)乖了前端渲染題目?jī)?nèi)容前必須經(jīng)過(guò)htmlspecialchars轉(zhuǎn)義這才一勞永逸。如果你打算把這道題改成小程序版本記得也要做對(duì)應(yīng)的轉(zhuǎn)義處理。6. v1.0之后的演進(jìn)思路6.1 從趣味到專業(yè)數(shù)據(jù)可視化與復(fù)測(cè)趨勢(shì)v1.0的結(jié)果報(bào)告還是純文字形式其實(shí)已經(jīng)夠用但如果你想讓它看起來(lái)更專業(yè)下一步可以引入可視化圖表。比如把維度制測(cè)試的結(jié)果渲染成雷達(dá)圖把多次測(cè)試的總分做成折線趨勢(shì)圖讓用戶看到自己一段時(shí)間內(nèi)的變化。技術(shù)上不需要引入重型圖表庫(kù)ECharts的CDN文件就夠了后端只需要把dimension_scores和歷次total_score通過(guò)JSON返回到前端。還有一個(gè)很實(shí)際的需求是歷史記錄查看。v1.0的數(shù)據(jù)表其實(shí)已經(jīng)支持這個(gè)功能——通過(guò)user_token就能查出某用戶的所有測(cè)試記錄。如果你有用戶注冊(cè)體系把user_token換成user_id即可。在沒(méi)做登錄的前提下可以考慮把user_token存在localStorage里這樣同一個(gè)瀏覽器下次訪問(wèn)還能看到歷史。6.2 商業(yè)化和合規(guī)避免踩到紅線如果你的心理測(cè)試系統(tǒng)打算面向公眾運(yùn)營(yíng)有幾個(gè)合規(guī)點(diǎn)必須提前想清楚。第一不能打著「心理診斷」的旗號(hào)要在頁(yè)面顯眼位置標(biāo)注「測(cè)試結(jié)果僅供娛樂(lè)參考不構(gòu)成醫(yī)療建議」這既是保護(hù)用戶也是保護(hù)你自己第二收集的用戶答題數(shù)據(jù)屬于敏感數(shù)據(jù)v1.0里的游客模式天然規(guī)避了一部分隱私風(fēng)險(xiǎn)如果后期加了注冊(cè)功能隱私政策頁(yè)面必須跟上第三題庫(kù)內(nèi)容不要涉及政治、宗教、醫(yī)療診斷等敏感議題趣味性和安全性之間的分寸要拿捏好。我個(gè)人實(shí)際跑下來(lái)的體會(huì)是心理測(cè)試源碼v1.0最大的價(jià)值不是代碼本身多厲害而是它把「一套可運(yùn)行的心理測(cè)試系統(tǒng)」的邊界和主干搭清楚了。你完全可以在它基礎(chǔ)上換成Python Flask重寫、加付費(fèi)解鎖、做成小程序但核心的「題庫(kù)-計(jì)分-報(bào)告」三層結(jié)構(gòu)不用變。最后分享一個(gè)小技巧如果你想讓自己的測(cè)試系統(tǒng)顯得更專業(yè)不妨在報(bào)告頁(yè)末尾加一個(gè)「測(cè)試說(shuō)明」折疊區(qū)把每道題對(duì)應(yīng)的維度列出來(lái)這個(gè)細(xì)節(jié)很多用戶是真的會(huì)看的。本文還有配套的精品資源點(diǎn)擊獲取