上線了,自己開發的刷題小程序,vue3.0

嘿,最近我搞了個Java刷題的小程序,用Vue寫的,界面和功能都還挺完整的。今天就來跟大家聊聊這個小程序是怎么實現的,代碼里都藏著哪些小細節。

先看整體結構,我把整個頁面分成了幾個大塊:頂部導航欄、題目內容區、底部按鈕欄,還有一個完成后的彈窗。這種布局應該挺符合大家做題庫類應用的習慣吧?

圖片

頂部導航欄

<view?class="navbar"><text?class="nav-title">Java刷題</text><text?class="nav-progress">{{ currentIndex + 1 }}/{{ totalCount }}</text>
</view>

這塊很簡單,左邊是標題,右邊顯示當前進度,比如"3/10"這種。用currentIndex + 1是因為數組索引是從0開始的,加1才符合我們平時的計數習慣。

題目內容區

這部分是核心,我分了題干、選項列表和答案解析三個部分。

首先是題干:

<view?class="question-content"><text?class="question-title">題目 {{ currentIndex + 1 }}:</text><text?class="question-text">{{ currentQuestion.questionContent }}</text>
</view>

這里用了v-if="currentQuestion"來確保數據加載完成后才顯示,避免頁面閃爍。

然后是選項列表,這塊有點意思:

<view?class="options-list"><view?class="option-item"?v-for="(option, idx) in parsedOptions"?:key="idx":class="{?'selected': selectedIndex === idx,'correct': showExplanation && isCorrectOption(idx),'incorrect': showExplanation && selectedIndex === idx && !isCorrectOption(idx)}"@click="handleSelectOption(idx)"><text?class="option-letter">{{ String.fromCharCode(65 + idx) }}</text><text?class="option-text">{{ option }}</text></view>
</view>

我用了v-for來循環渲染選項,parsedOptions是處理過的選項數組。這里有個小技巧,選項字母A、B、C、D是通過String.fromCharCode(65 + idx)生成的,65對應的就是字母A的ASCII碼,這樣就不用手動寫每個選項的字母了。

樣式方面,我用了動態class:

  • 選中狀態:selected

  • 正確答案:correct類(只有在顯示解析時才生效)

  • 錯誤答案:incorrect類(選中的答案不對時才顯示)

這樣用戶選完答案提交后,就能清楚地看到自己選的對不對,正確答案是哪個。

圖片

接下來是答案解析,只有提交答案后才會顯示:

<view?class="explanation"?v-if="showExplanation"><text?class="explanation-title">解析:</text><text?class="explanation-content">{{ currentQuestion.answerExplanation }}</text>
</view>

底部導航按鈕

<view?class="bottom-bar"><button?class="btn-prev"?@click="prevQuestion"?:disabled="currentIndex === 0">上一題</button><button?class="btn-next"?@click="nextQuestion"?:disabled="!hasSelected && currentIndex === totalCount - 1">{{ currentIndex === totalCount - 1 ? '完成練習' : (hasSelected ? '下一題' : '請選擇答案') }}</button>
</view>

這里的按鈕文本會根據當前狀態動態變化:

  • 如果是最后一題,顯示"完成練習"

  • 否則,如果已經選了答案,顯示"下一題"

  • 還沒選答案的話,顯示"請選擇答案"

disabled屬性也做了處理,第一題時上一題按鈕禁用,最后一題沒選答案時,完成按鈕也會禁用,防止用戶跳過題目。

完成彈窗

<view?class="result-popup"?v-if="showResult"><view?class="popup-content"><text?class="popup-title">練習完成!</text><text?class="popup-score">得分: {{ correctCount }}/{{ totalCount }}</text><button?class="popup-button"?@click="restart">重新開始</button><button?class="popup-button"?style="margin-top: 10px;"?@click="restart2">再戰錯題</button></view>
</view>

全部做完后會彈出這個彈窗,顯示得分,還有兩個按鈕:重新開始和再戰錯題。這個再戰錯題功能我覺得還挺實用的,能針對性地鞏固薄弱點。

圖片

腳本部分

接下來看看邏輯實現,我用的是Vue 3的setup語法。

首先定義了一些狀態變量:

const?currentIndex = ref(0)?// 當前題目索引
const?currentQuestion = ref(null)?// 當前題目數據
const?selectedIndex = ref(-1)?// 選中的選項索引,-1表示未選擇
const?showExplanation = ref(false)?// 是否顯示解析
const?totalCount = ref(0)?// 總題數
const?correctCount = ref(0)?// 做對的題數
const?showResult = ref(false)?// 是否顯示結果彈窗

然后是一些計算屬性:

// 解析選項,把字符串分割成數組
const?parsedOptions = computed(()?=>?{if?(!currentQuestion.value?.options)?return?[]return?currentQuestion.value.options.split('\n').filter(option?=>?option.trim()).map(option?=>?option.replace(/^[A-Z]\./,?'').trim())
})// 是否已選擇答案
const?hasSelected = computed(()?=>?selectedIndex.value !==?-1)

parsedOptions會把后端返回的選項字符串(可能是用換行分隔的)轉換成數組,還會去掉每個選項前面的A.、B.這種前綴,讓顯示更干凈。

處理選擇選項的方法:

const?handleSelectOption =?(idx) =>?{if?(showExplanation.value)?return?// 已顯示解析,禁止修改selectedIndex.value = idx
}

這里加了個判斷,如果已經顯示解析了,就不能再改答案了,避免用戶反復修改。

上一題和下一題的邏輯:

const?prevQuestion =?()?=>?{
if?(currentIndex.value >?0) {currentIndex.value--loadCurrentQuestion()}
}const?nextQuestion =?()?=>?{
if?(!hasSelected.value)?return// 未選擇答案// 檢查答案是否正確
if?(!showExplanation.value) {const?userAnswer =?String.fromCharCode(65?+ selectedIndex.value)if?(userAnswer === currentQuestion.value.correctAnswer) {correctCount.value++reportCorrect(currentQuestion.value.id);?// 上報正確答案}?else?{reportIncorrect(currentQuestion.value.id);?// 上報錯誤答案}showExplanation.value =?truereturn}// 跳轉到下一題
if?(currentIndex.value < totalCount.value -?1) {currentIndex.value++loadCurrentQuestion()}?else?{// 完成所有題目showResult.value =?true}
}

下一題的邏輯稍微復雜點:

  1. 首先檢查是否已經選擇答案,如果沒有就直接返回

  2. 如果還沒顯示解析,就先判斷答案是否正確,更新正確題數,然后顯示解析

  3. 如果已經顯示解析了,就跳到下一題,或者如果是最后一題,就顯示結果彈窗

加載當前題目的方法:

const?loadCurrentQuestion =?()?=>?{currentQuestion.value = questionData.value[currentIndex.value]?selectedIndex.value =?-1?// 重置選擇狀態showExplanation.value =?false?// 隱藏解析
}

每次切換題目時,都會重置選擇狀態和解析顯示狀態。

重新開始和再戰錯題的功能:

const?restart =?()?=>?{currentIndex.value =?0correctCount.value =?0showResult.value =?falseuni.redirectTo({url:"/pages/aaa/aaa"})
}const?restart2 =?async?() => {
let?resData =?await?expendPoint('java刷題',20)
if?(resData.code !==?200) {uni.showModal({title:?'提示',content: resData.message,});return}showResult.value =?falsecurrentIndex.value =?0correctCount.value =?0uni.showLoading({title:"加載中",mask:?true});
const?tms =?await?selectError();?// 獲取錯題uni.hideLoading();questionData.value = tms;totalCount.value = tms.length;loadCurrentQuestion()
}

這里的expendPoint是個能量消耗的接口,可能是我這個小程序里的一個積分系統,做錯題練習需要消耗20點能量。

最后是頁面加載時的初始化:

onMounted(async?() => {
let?resData =?await?expendPoint('java刷題',20)
if?(resData.code !==?200) {uni.showModal({title:?'提示',content: resData.message,});return}uni.showLoading({title:"加載中",mask:?true});
const?tms =?await?randomTm();?// 獲取隨機題目uni.hideLoading();questionData.value = tms;totalCount.value = tms.length;loadCurrentQuestion()
})

頁面一加載就會調用接口獲取題目數據,同時顯示加載中提示,讓用戶知道正在加載。

樣式部分

樣式我用了scoped屬性,確保不會污染其他組件。主要處理了各種狀態的顯示效果,比如選中、正確、錯誤的樣式區分,還有彈窗的遮罩效果等。

總的來說,這個小程序雖然簡單,但功能還挺完整的,用戶體驗上也做了不少細節處理。比如:

  • 清晰的進度顯示

  • 直觀的答案反饋(正確/錯誤)

  • 詳細的解析說明

  • 錯題重練功能

  • 合理的按鈕狀態控制

代碼結構也比較清晰,把UI和邏輯分離,方便后續維護和擴展。如果想加新功能,比如收藏題目、難度篩選什么的,也很容易在這個基礎上擴展。

大家覺得這個小程序怎么樣?有什么可以改進的地方歡迎一起討論~

點擊下方鏈接,即可體驗~

速用百寶箱https://mp.weixin.qq.com/s?__biz=MzI1ODI1ODkzMA==&mid=2247497389&idx=1&sn=dd67cedd437a01b3f06507d38650ffde&chksm=ebe1b5699d11eaf0db4a06891d66a85e81642d24ac5f209576907e695aa84080485fa0af6136&scene=126&sessionid=1753317024&subscene=91&clicktime=1753317025&enterid=1753317025&key=daf9bdc5abc4e8d0431ce024e74393f3d4d7363a48a9149b474f3b8cf23986d4b35229bab8d5ea130bb8d6cac53a81552b00c36509a1417c0cd156bcc51f1eab9f4256a30fa6f38a00fce6ebe4c6687ac0a6951f6cece7c99ac7a3ad0802fec5444a13ea0b7ec6943b769291a6397feb6cb7ce96bb4dcd0ea4c3a20b94274060&ascene=0&uin=NDAwODI4MTc2&devicetype=Windows+11+x64&version=63090c37&lang=zh_CN&countrycode=CN&exportkey=n_ChQIAhIQC%2Byv%2BJhP3dcGtQjVPBMVaRLmAQIE97dBBAEAAAAAAONbCcPymDMAAAAOpnltbLcz9gKNyK89dVj0mId9lGY7cgnRR9uMjFqtA85HhyhxR%2F8MkxC519%2BAAh5oQXtwcxPqtbYuMxU9JG0jLZYRcQ6v6JjRHJNp8ys0DuFDth01%2Fp3jjmgfq9HvxRpISFTGcQeWwa5V638C1okgLeuZSo%2BIQ7HhM0cM1JDjoeoCj4RS4DVLDLeupELVNXBvlf7OkIUXSv6UqorKMIEzGKrpeQA%2BBPGRVfR3u%2BhoINPcohS22vIVXyOvaMNODUGi04FFuwOSZzsrHtd3Mkxp&acctmode=0&pass_ticket=blZdPvi3Lplm9v5ei2FR0KEPOc%2FjdsNpEJy8DRmJcCqu5pYRRJMo5GEgEjyl5FKH&wx_header=1

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/915929.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/915929.shtml
英文地址,請注明出處:http://en.pswp.cn/news/915929.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

嵌入式開發學習———Linux環境下數據結構學習(三)

單向循環鏈表單向循環鏈表是一種特殊的單向鏈表&#xff0c;尾節點的指針指向頭節點&#xff0c;形成一個閉環。適用于需要循環訪問的場景&#xff0c;如輪詢調度。結構特點&#xff1a;每個節點包含數據域和指向下一個節點的指針&#xff0c;尾節點的指針指向頭節點而非空值。…

【華為機試】684. 冗余連接

文章目錄684. 冗余連接描述示例 1示例 2提示解題思路核心分析問題轉化算法選擇策略1. 并查集 (Union-Find) - 推薦2. 深度優先搜索 (DFS)3. 拓撲排序算法實現詳解方法一&#xff1a;并查集 (Union-Find)方法二&#xff1a;深度優先搜索 (DFS)數學證明并查集算法正確性證明時間復…

Ⅹ—6.計算機二級綜合題7---10套

目錄 第7套 【填空題】 【修改題】 【設計題】 第8套 【填空題】 【修改題】 【設計題】 第9套 【填空題】 【修改題】 【設計題】 第10套 【填空題】 【修改題】 【設計題】 第7套 【填空題】 題目要求:給定程序中,函數fun的功能是:將形參s所指字符串中所…

【三橋君】大語言模型計算成本高,MoE如何有效降低成本?

? 你好&#xff0c;我是 ?三橋君? &#x1f4cc;本文介紹&#x1f4cc; >> 一、引言 在AI技術飛速發展的當下&#xff0c;大語言模型&#xff08;LLM&#xff09;的參數規模不斷增長&#xff0c;但隨之而來的計算成本問題也日益凸顯。如何在保持高效推理能力的同時擴…

Python游戲開發利器:Pygame從入門到實戰全解析

引言 Pygame是Python中最受歡迎的2D游戲開發庫之一&#xff0c;基于SDL&#xff08;Simple DirectMedia Layer&#xff09;構建&#xff0c;支持圖形渲染、音效處理、事件響應等核心功能。無論是開發簡單的休閑游戲&#xff0c;還是復雜的交互式應用&#xff0c;Pygame都能提供…

行為型模式-協作與交互機制

行為型模式聚焦于對象間的行為交互&#xff0c;通過規范對象協作方式提升系統的靈活性與可擴展性。在分布式系統中&#xff0c;由于多節點異步通信、網絡不可靠性及狀態一致性挑戰&#xff0c;行為型模式需針對分布式特性進行適應性設計。本文從觀察者、策略、命令、責任鏈、狀…

spring boot 整合 Spring Cloud、Kafka 和 MyBatis菜鳥教程

環境準備確保項目中已引入 Spring Boot、Spring Cloud、Kafka 和 MyBatis 的依賴。以下是一個典型的 Maven 依賴配置&#xff1a;<dependencies><!-- Spring Boot Starter --><dependency><groupId>org.springframework.boot</groupId><artif…

20 BTLO 藍隊靶場 Sticky Situation 解題記錄

難度&#xff1a;5/10考察技能: Windows admin, Autopsy 使用場景&#xff1a;分析USB設備使用情況Autopsy使用注意&#xff1a;用管理員打開&#xff0c;在實際分析時注意先復制一個鏡像文件&#xff0c;保存好原文件常用的Windows USB 取證的位置:Windows XP:Registry Key: U…

安裝及配置Go語言開發環境與VSCode集成指南

安裝Go語言開發 安裝Go語言開發環境是第一步。訪問Go官網&#xff0c;下載適合操作系統的安裝包&#xff0c;如果進不去可以訪問Go官方鏡像站。 根據自己的系統選擇對應的安裝包&#xff0c;我這邊是Windows系統就點擊安裝第一個即可。 點擊下一步即可。 驗證安裝是否成功可以…

專題:2025微短劇行業生態構建與跨界融合研究報告|附100+份報告PDF匯總下載

原文鏈接&#xff1a; https://tecdat.cn/?p43384 分析師&#xff1a;Boyu Wang 在此對 Boyu Wang 對本文所作的貢獻表示誠摯感謝&#xff0c;他在武漢大學完成了數據科學與大數據技術專業的學習。擅長 R 語言、Python、機器學習、數據可視化。 中國短視頻行業在經歷爆發式增…

配置NGINX

Nginx環境配置與前端VUE部署安裝nginx&#xff1a;命令sudo yum update && sudo yum install nginx部署:拷貝前端到目錄/home/publish/idasweb/下修改nginx配置&#xff1a;進入到/etc/nginx目錄下&#xff0c;修改nginx.conf中user www-data為user root&#xff0c;不…

MySQL深度理解-MySQL索引優化

1.Order by與Group by優化1.1Case1employees表中建立了name&#xff0c;position和age索引&#xff0c;并且使用了order by age進行排序操作&#xff1a;EXPLAIN SELECT * FROM employees WHERE name LiLei and position dev order by age最終explain的結果發現使用了idx_nam…

「Linux命令基礎」用戶和用戶組實訓

用戶與用戶組關系管理 在Linux系統中,用戶和用戶組的關系就像班級里的學生和小組。一個用戶可以同時屬于多個組,這種靈活的成員關系為權限管理提供了便利。創建用戶時,系統會自動生成一個與用戶同名的主組,這個組會成為用戶創建文件時的默認屬組。 理解用戶和用戶組的關系…

Https以及CA證書

目錄 1. 什么是 HTTPS 通信機制流程 證書驗證過程 CA證書 瀏覽器如何校驗證書合法性呢&#xff1f; 1. 什么是 HTTPS HTTP 加上加密處理和認證以及完整性保護后即是 HTTPS。 它是為了解決 HTTP 存在的安全性問題&#xff0c;而衍生的協議&#xff0c;那使用 HTTP 的缺點有…

數字圖像處理(四:圖像如果當作矩陣,那加減乘除處理了矩陣,那圖像咋變):從LED冬奧會、奧運會及春晚等等大屏,到手機小屏,快來挖一挖里面都有什么

數字圖像處理&#xff08;四&#xff09;三、&#xff08;準備工作&#xff1a;玩具咋玩&#xff09;圖像以矩陣形式存儲&#xff0c;那矩陣一變、圖像立刻跟著變&#xff1f;原圖發揮了鈔能力之后的圖上述代碼包含 10 個圖像處理實驗&#xff0c;每個實驗會生成對應處理后的圖…

SpringBoot航空訂票系統的設計與實現

文章目錄前言詳細視頻演示具體實現截圖后端框架SpringBoot持久層框架Hibernate成功系統案例&#xff1a;代碼參考數據庫源碼獲取前言 博主介紹:CSDN特邀作者、985高校計算機專業畢業、現任某互聯網大廠高級全棧開發工程師、Gitee/掘金/華為云/阿里云/GitHub等平臺持續輸出高質…

2025年PostgreSQL 詳細安裝教程(windows)

前言 PostgreSQL 是一個功能強大的開源關系型數據庫管理系統(ORDBMS)&#xff0c;以下是對它的全面介紹&#xff1a; 基本概況 名稱&#xff1a;通常簡稱為 "Postgres" 類型&#xff1a;對象-關系型數據庫管理系統 許可&#xff1a;開源&#xff0c;采用類MIT許可…

Java日志按天切分方法

使用 Logrotate&#xff08;推薦&#xff09;Logrotate 是 Linux 系統自帶的日志管理工具&#xff0c;支持自動切割、壓縮和刪除舊日志。步驟&#xff1a;創建 Logrotate 配置文件在 /etc/logrotate.d/ 下新建配置文件&#xff08;如 java-app&#xff09;&#xff1a;sudo nan…

進階向:基于Python的本地文件內容搜索工具

概述 大家好&#xff01;今天我們將一起學習如何用Python創建一個簡單但強大的本地文件內容搜索工具。這個工具特別適合處理大量文本文件時的快速檢索需求。 為什么要學習這個工具 如果你剛接觸編程&#xff0c;完全不用擔心&#xff01;我會從零開始講解&#xff0c;確保每…

多模態AI的可解釋性

多模態AI的可解釋性挑戰 在深入探討解決方案之前&#xff0c;首先需要精確地定義問題。多模態模型因其固有的復雜性&#xff0c;其內部決策過程對于人類觀察者而言是不透明的。 模態融合機制 (Modal Fusion Mechanism)&#xff1a;模型必須將來自不同來源&#xff08;如圖像和文…