日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

基于SpringBoot+VUE(PC端+小程序端)的智能在线考试系统毕业设计

發(fā)布時間:2024/3/13 windows 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于SpringBoot+VUE(PC端+小程序端)的智能在线考试系统毕业设计 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

作者主頁:編程千紙鶴

作者簡介:Java、前端、Python開發(fā)多年,做過高程,項目經(jīng)理,架構(gòu)師

主要內(nèi)容:Java項目開發(fā)、畢業(yè)設(shè)計開發(fā)、面試技術(shù)整理、最新技術(shù)分享

收藏點贊不迷路? 關(guān)注作者有好處

文末獲得源碼

項目編號:

一,項目簡介

隨著計算機(jī)技術(shù)的不斷發(fā)展,我們的日常生活和工作都與計算機(jī)技術(shù)的關(guān)系越來越密切。計算機(jī)技術(shù)的發(fā)展改變了我們?nèi)粘5纳詈凸ぷ髁?xí)慣,也改變了社會的發(fā)展速度,使得我們的生活更加便利和高效。伴隨著計算機(jī)技術(shù)發(fā)展起來的互聯(lián)網(wǎng)技術(shù)將我們的生活帶領(lǐng)進(jìn)信息化時代,改變了我們的學(xué)習(xí)和工作環(huán)境,例如我們經(jīng)常面對的考試也隨著互聯(lián)網(wǎng)技術(shù)的發(fā)展產(chǎn)生了改變,伴隨著信息技術(shù)的發(fā)展,在線無紙化的考試系統(tǒng)應(yīng)運而生,不僅徹底改變了傳統(tǒng)紙質(zhì)考試的習(xí)慣和環(huán)境,更是提高了考試效率,保證了考試效果,達(dá)到了考試目的[1]。傳統(tǒng)的紙質(zhì)考試具有很多局限性和不足,主要包括以下幾點:

1.傳統(tǒng)紙質(zhì)考試需要較多的人力資源和時間資源進(jìn)行題目的設(shè)定,同時題目的難易程度和考核價值水平很難達(dá)到基本的要求;

2.傳統(tǒng)紙質(zhì)考試的閱卷采用人工的方式,人工閱卷難免會出現(xiàn)閱卷差錯或者分?jǐn)?shù)合算差錯,這也會對考試的效果造成影響;

3.傳統(tǒng)紙質(zhì)考試的人工閱卷模式也會浪費大量的人力資源和時間資源,不能保證工作效率和工作質(zhì)量;

4.傳統(tǒng)紙質(zhì)考試對考試的總結(jié)能力較差,不能夠全面具體的分析考試結(jié)果,教師也很難得到基本的考試結(jié)果分析的數(shù)據(jù)信息,而這些數(shù)據(jù)信息是提高教學(xué)質(zhì)量和教學(xué)效果的關(guān)鍵因素;

5.傳統(tǒng)紙質(zhì)考試對考試時間以及考試紀(jì)律的要求不能達(dá)到統(tǒng)一,這也會影響到考試的公平性。根據(jù)以上分析的傳統(tǒng)紙質(zhì)考試的不足之處,新型的結(jié)合計算機(jī)技術(shù)以及互聯(lián)網(wǎng)技術(shù)的在線考試系統(tǒng)應(yīng)運而生,不僅通過一種新的技術(shù)解決了傳統(tǒng)紙質(zhì)考試的基本問題,還提供了一種新的考試思路和考試?yán)砟?#xff0c;糾正了傳統(tǒng)紙質(zhì)考試的弊端,提供更加合理有效的考試過程。

二,環(huán)境介紹

三,技術(shù)說明

后端系統(tǒng)前端系統(tǒng)微信小程序
spring-boot 2.1.6.RELEASEvue 采用新版,使用了vue-cli4搭建的系統(tǒng)iView 主題樣式
spring-boot-security 用戶登錄驗證element-ui 最流行的vue UI框架
undertow web容器vue-element-admin 模版
mybatis/mybatis_plusecharts 圖表統(tǒng)計
hikari 速度最快的數(shù)據(jù)庫連接池ueditor 題目編輯器

四,功能列表

4.1 學(xué)生系統(tǒng)功能

模塊介紹
登錄用戶名、密碼
注冊年級、用戶名、密碼
任務(wù)中心管理員發(fā)布的年級任務(wù),每個學(xué)生只能做一次
考試題干支持文本、圖片、數(shù)學(xué)公式、表格等,學(xué)生答題支持:文本
固定試卷可重復(fù)練習(xí)、自行批改的試卷
時段試卷在時間限制內(nèi),可重復(fù)練習(xí)、自行批改的試卷
考試記錄查看答卷記錄和試卷信息
錯題本答錯題目會自動進(jìn)入錯題本,顯示題目基本信息
個人信息顯示學(xué)生個人資料
更新信息修改個人資料、頭像
個人動態(tài)顯示用戶最近的個人動態(tài)
消息中心用于接收管理員發(fā)送的消息

4.2 管理系統(tǒng)功能

模塊介紹
登錄用戶名、密碼
主頁試卷總數(shù)、題目總數(shù)、用戶活躍度、題目月數(shù)量
學(xué)生列表顯示系統(tǒng)所有的學(xué)生,新增、修改、刪除、禁用
管理員列表顯示系統(tǒng)所有的管理員,新增、修改、刪除、禁用
學(xué)科列表學(xué)科查詢、修改、刪除
學(xué)科創(chuàng)編創(chuàng)建學(xué)科
試卷列表試卷查詢、修改、刪除
試卷創(chuàng)編創(chuàng)建的試卷為時段試卷、固定試卷、任務(wù)試卷
題目列表題目查詢、修改、刪除
題目創(chuàng)建題目支持單選題、多選題、判斷題、填空題、簡答題,題干支持文本、圖片、表格、數(shù)學(xué)公式
任務(wù)列表任務(wù)查詢、修改、刪除
消息列表顯示已發(fā)送的消息,消息已讀人數(shù)等信息
消息發(fā)送發(fā)送消息給多個用戶
用戶日志顯示所有用戶日志
個人資料顯示管理員用戶名、真實姓名
時間線顯示管理員創(chuàng)建時間
修改資料修改姓名、手機(jī)號

4.3 小程序功能

模塊介紹
登錄用戶登錄登出功能,登錄會自動綁定微信賬號,登出會解綁
注冊年級、用戶名、密碼
任務(wù)中心管理員發(fā)布的年級任務(wù),每個學(xué)生只能做一次
考試題干支持文本、圖片、數(shù)學(xué)公式、表格等,學(xué)生答題支持:文本
固定試卷可重復(fù)練習(xí)、自行批改的試卷
時段試卷在時間限制內(nèi),可重復(fù)練習(xí)、自行批改的試卷
考試記錄查看答卷記錄和試卷信息
錯題本答錯題目會自動進(jìn)入錯題本,顯示題目基本信息
個人信息顯示學(xué)生個人資料
更新信息修改個人資料、頭像
個人動態(tài)顯示用戶最近的個人動態(tài)
消息中心用于接收管理員發(fā)送的消息

五,數(shù)據(jù)庫設(shè)計

僅展示部分?jǐn)?shù)據(jù)庫字段設(shè)計

5.1?試卷表

字段名類型注釋
idint
namevarchar試卷名稱
subject_idint學(xué)科
paper_typeint試卷類型( 1.固定試卷 4.時段試卷 6.任務(wù)試卷 )
grade_levelint年級
scoreint試卷總分(千分制)
question_countint題目數(shù)量
suggest_timeint建議時長(分鐘)
limit_start_timedatetime時段試卷 開始時間
limit_end_timedatetime時段試卷 結(jié)束時間
frame_text_content_idint試卷框架 內(nèi)容為JSON
create_userint
create_timedatetime
deletedbit
task_exam_idint

5.2 試卷答案表

字段名類型注釋
idint
exam_paper_idint
paper_namevarchar試卷名稱
paper_typeint試卷類型( 1.固定試卷 4.時段試卷 6.任務(wù)試卷 )
subject_idint學(xué)科
system_scoreint系統(tǒng)判定得分
user_scoreint最終得分(千分制)
paper_scoreint試卷總分
question_correctint做對題目數(shù)量
question_countint題目總數(shù)量
do_timeint做題時間(秒)
statusint試卷狀態(tài)(1待判分 2完成)
create_userint學(xué)生
create_timedatetime提交時間
task_exam_idint

5.3 題目表

字段名類型注釋
idint
question_typeint1.單選題 2.多選題 3.判斷題 4.填空題 5.簡答題
subject_idint學(xué)科
scoreint題目總分(千分制)
grade_levelint級別
difficultint題目難度
correcttext正確答案
info_text_content_idint題目 填空、 題干、解析、答案等信息
create_userint創(chuàng)建人
statusint1.正常
create_timedatetime創(chuàng)建時間
deletedbit

5.4 學(xué)科表

字段名類型注釋
idint
namevarchar語文 數(shù)學(xué) 英語 等
levelint年級 (1-12) 小學(xué) 初中 高中 大學(xué)
level_namevarchar一年級、二年級等
item_orderint排序
deletedbit

5.5 用戶表

字段名類型注釋
idint
user_uuidvarchar
user_namevarchar用戶名
passwordvarchar
real_namevarchar真實姓名
ageint
sexint1.男 2女
birth_daydatetime
user_levelint學(xué)生年級(1-12)
phonevarchar
roleint1.學(xué)生 3.管理員
statusint1.啟用 2禁用
image_pathvarchar頭像地址
create_timedatetime
modify_timedatetime
last_active_timedatetime
deletedbit是否刪除
wx_open_idvarchar微信openId

5.6 用戶日志表

字段名類型注釋
idint
user_idint用戶id
user_namevarchar用戶名
real_namevarchar真實姓名
contenttext內(nèi)容
create_timedatetime時間

其他表的設(shè)計省略............

六,系統(tǒng)展示

6.1 后臺管理

主頁

用戶管理?

試卷管理

題目管理?

添加題目

添加試卷?

?

任務(wù)管理

教育管理?

成績管理

?6.2 學(xué)生端

首頁登錄與注冊

學(xué)生端首頁?

試卷中心?

考試記錄?

錯題本

?個人中心

6.3 小程序端

登錄與注冊

?

首頁?

試卷考試?

考試記錄?

我的?

七,核心代碼展示

@Service public class TaskExamServiceImpl extends BaseServiceImpl<TaskExam> implements TaskExamService {protected final static ModelMapper modelMapper = ModelMapperSingle.Instance();private final TaskExamMapper taskExamMapper;private final TextContentService textContentService;private final ExamPaperMapper examPaperMapper;@Autowiredpublic TaskExamServiceImpl(TaskExamMapper taskExamMapper, TextContentService textContentService, ExamPaperMapper examPaperMapper) {super(taskExamMapper);this.taskExamMapper = taskExamMapper;this.textContentService = textContentService;this.examPaperMapper = examPaperMapper;}@Overridepublic PageInfo<TaskExam> page(TaskPageRequestVM requestVM) {return PageHelper.startPage(requestVM.getPageIndex(), requestVM.getPageSize(), "id desc").doSelectPageInfo(() ->taskExamMapper.page(requestVM));}@Override@Transactionalpublic void edit(TaskRequestVM model, User user) {ActionEnum actionEnum = (model.getId() == null) ? ActionEnum.ADD : ActionEnum.UPDATE;TaskExam taskExam = null;if (actionEnum == ActionEnum.ADD) {Date now = new Date();taskExam = modelMapper.map(model, TaskExam.class);taskExam.setCreateUser(user.getId());taskExam.setCreateUserName(user.getUserName());taskExam.setCreateTime(now);taskExam.setDeleted(false);//保存任務(wù)結(jié)構(gòu)TextContent textContent = textContentService.jsonConvertInsert(model.getPaperItems(), now, p -> {TaskItemObject taskItemObject = new TaskItemObject();taskItemObject.setExamPaperId(p.getId());taskItemObject.setExamPaperName(p.getName());return taskItemObject;});textContentService.insertByFilter(textContent);taskExam.setFrameTextContentId(textContent.getId());taskExamMapper.insertSelective(taskExam);} else {taskExam = taskExamMapper.selectByPrimaryKey(model.getId());modelMapper.map(model, taskExam);TextContent textContent = textContentService.selectById(taskExam.getFrameTextContentId());//清空試卷任務(wù)的試卷Id,后面會統(tǒng)一設(shè)置List<Integer> paperIds = JsonUtil.toJsonListObject(textContent.getContent(), TaskItemObject.class).stream().map(d -> d.getExamPaperId()).collect(Collectors.toList());examPaperMapper.clearTaskPaper(paperIds);//更新任務(wù)結(jié)構(gòu)textContentService.jsonConvertUpdate(textContent, model.getPaperItems(), p -> {TaskItemObject taskItemObject = new TaskItemObject();taskItemObject.setExamPaperId(p.getId());taskItemObject.setExamPaperName(p.getName());return taskItemObject;});textContentService.updateByIdFilter(textContent);taskExamMapper.updateByPrimaryKeySelective(taskExam);}//更新試卷的taskIdList<Integer> paperIds = model.getPaperItems().stream().map(d -> d.getId()).collect(Collectors.toList());examPaperMapper.updateTaskPaper(taskExam.getId(), paperIds);model.setId(taskExam.getId());}@Overridepublic TaskRequestVM taskExamToVM(Integer id) {TaskExam taskExam = taskExamMapper.selectByPrimaryKey(id);TaskRequestVM vm = modelMapper.map(taskExam, TaskRequestVM.class);TextContent textContent = textContentService.selectById(taskExam.getFrameTextContentId());List<ExamResponseVM> examResponseVMS = JsonUtil.toJsonListObject(textContent.getContent(), TaskItemObject.class).stream().map(tk -> {ExamPaper examPaper = examPaperMapper.selectByPrimaryKey(tk.getExamPaperId());ExamResponseVM examResponseVM = modelMapper.map(examPaper, ExamResponseVM.class);examResponseVM.setCreateTime(DateTimeUtil.dateFormat(examPaper.getCreateTime()));return examResponseVM;}).collect(Collectors.toList());vm.setPaperItems(examResponseVMS);return vm;}@Overridepublic List<TaskExam> getByGradeLevel(Integer gradeLevel) {return taskExamMapper.getByGradeLevel(gradeLevel);} } @Service public class AuthenticationServiceImpl implements AuthenticationService {private final UserService userService;private final SystemConfig systemConfig;@Autowiredpublic AuthenticationServiceImpl(UserService userService, SystemConfig systemConfig) {this.userService = userService;this.systemConfig = systemConfig;}/*** @param username username* @param password password* @return boolean*/@Overridepublic boolean authUser(String username, String password) {User user = userService.getUserByUserName(username);return authUser(user, username, password);}@Overridepublic boolean authUser(User user, String username, String password) {if (user == null) {return false;}String encodePwd = user.getPassword();if (null == encodePwd || encodePwd.length() == 0) {return false;}String pwd = pwdDecode(encodePwd);return pwd.equals(password);}@Overridepublic String pwdEncode(String password) {return RsaUtil.rsaEncode(systemConfig.getPwdKey().getPublicKey(), password);}@Overridepublic String pwdDecode(String encodePwd) {return RsaUtil.rsaDecode(systemConfig.getPwdKey().getPrivateKey(), encodePwd);}}

<view class="exam-page"><view class="view-wrap"><view class="exam-count-down">{{remainTimeStr}}</view></view><view class="view-wrap-hidden"></view><view><view class="exam-name-title"><h1>{{form.name}}</h1></view><form bindsubmit='formSubmit'><i-panel title="{{titleItem.name}}" wx:for="{{form.titleItems}}" wx:for-item="titleItem" wx:key="{{titleItem.name}}" i-class="exam-panel-title"><i-cell-group i-class="exam-cell"><i-cell wx:for="{{titleItem.questionItems}}" wx:key="{{titleItem.id}}" wx:for-item="questionItem"><view wx:if="{{questionItem.questionType === 1}}"><rich-text nodes="{{questionItem.itemOrder}}. {{questionItem.title}}" /><radio-group class="radio-group" name="{{questionItem.itemOrder}}_{{questionItem.id}}_{{questionItem.questionType}}"><label class="radio" wx:for="{{questionItem.items}}" wx:key="{{questionItem.prefix}}" wx:for-item="radioItem" class="exam-radio-item-label"><radio color="#2d8cf0" value="{{radioItem.prefix}}" checked="{{radioItem.checked}}" class="exam-item-left" /><rich-text nodes="{{radioItem.prefix}}. {{radioItem.content}}" class="exam-item-left" /></label></radio-group></view><view wx:elif="{{questionItem.questionType === 2}}"><rich-text nodes="{{questionItem.itemOrder}}. {{questionItem.title}}" class="exam-item-left" style="line-height:35px" /><checkbox-group class="exam-item-left" style="margin-left:10px" name="{{questionItem.itemOrder}}_{{questionItem.id}}_{{questionItem.questionType}}"><label wx:for="{{questionItem.items}}" wx:key="{{questionItem.prefix}}" wx:for-item="radioItem" class="exam-radio-item-label"><checkbox color="#2d8cf0" value="{{radioItem.prefix}}" checked="{{radioItem.checked}}" class="exam-item-left" /><rich-text nodes="{{radioItem.prefix}}. {{radioItem.content}}" class="exam-item-left" /></label></checkbox-group></view><view wx:elif="{{questionItem.questionType === 3}}"><rich-text nodes="{{questionItem.itemOrder}}. {{questionItem.title}}" class="exam-item-left" style="line-height:35px" /><radio-group class="radio-group" class="exam-item-left" style="margin-left:10px" name="{{questionItem.itemOrder}}_{{questionItem.id}}_{{questionItem.questionType}}"><label class="radio" wx:for="{{questionItem.items}}" wx:key="{{questionItem.prefix}}" wx:for-item="radioItem" class="exam-radio-item-label"><radio color="#2d8cf0" value="{{radioItem.prefix}}" checked="{{radioItem.checked}}" class="exam-item-left" /><rich-text nodes="{{radioItem.content}}" class="exam-item-left" /></label></radio-group></view><view wx:elif="{{questionItem.questionType === 4}}"><rich-text nodes="{{questionItem.itemOrder}}. {{questionItem.title}}" /><view class="exam-input-contain" wx:for="{{questionItem.items}}" wx:key="{{questionItem.prefix}}" wx:for-item="inputItem" wx:for-index="idx"><view class="exam-input-contain-label">{{inputItem.prefix}}</view><input class="exam-input-contain-content" maxlength="-1" name="{{questionItem.itemOrder}}_{{questionItem.id}}_{{questionItem.questionType}}_{{idx}}" /></view></view><view wx:else><rich-text nodes="{{questionItem.itemOrder}}. {{questionItem.title}}" /><view class="exam-textarea-contain"><textarea placeholder="答案" maxlength="-1" name="{{questionItem.itemOrder}}_{{questionItem.id}}_{{questionItem.questionType}}"></textarea></view></view></i-cell></i-cell-group></i-panel><view><button class="i-btn i-btn-primary i-btn-square" form-type='submit'>提交</button></view><i-action-sheet visible="true" visible="{{timeOutShow}}" mask-closable="{{ false }}"><view slot="header" style="padding: 16px"><view class="exam-timeout-title">考試試卷結(jié)束,請?zhí)峤辉嚲?#xff01;</view><button class="i-btn i-btn-primary i-btn-square" form-type='submit'>提交</button></view></i-action-sheet></form><i-modal title="考試結(jié)果" visible="{{modalShow}}" bind:ok="returnRecord" bind:cancel="returnRecord"><view>得分:{{result}}</view></i-modal><i-spin size="large" fix wx:if="{{ spinShow }}"></i-spin><i-message id="message" /></view> </view>

八,項目部署

8.1 目錄結(jié)構(gòu)

獲取到源碼進(jìn)行解壓后,文件列表如下:

?8.2 導(dǎo)入數(shù)據(jù)庫

打開Navicat(或者其他數(shù)據(jù)庫連接工具也可),導(dǎo)入資料中的sql文件。

8.3 后端源碼部署

8.3.1 導(dǎo)入源碼

打開idea,新建工程【可以任意目錄】。把解壓后的xzs目錄復(fù)制到創(chuàng)建好的idea工程中。進(jìn)行導(dǎo)入。

導(dǎo)入進(jìn)來之后,idea會進(jìn)行編譯。編譯之后沒有出現(xiàn)錯誤說明導(dǎo)入成功。

8.3.2 修改配置文件

修改數(shù)據(jù)庫連接配置,在application-dev.yml配置文件中修改成自己的數(shù)據(jù)庫名和自己的密碼。

8.3.3 啟動項目?

SpringBoot的程序啟動類,相信大部分小伙伴們都知道該怎么啟動。不過在這里還是要寫一下,以防個別小伙伴不知道。在src下找到XzsApplication啟動類,在該類中進(jìn)行右鍵運行即可。最后查看控制臺有沒有報錯信息。沒有報錯信息,啟動成功。

?上面說明啟動成功

8.4 管理員端和學(xué)生端部署

管理員端和學(xué)生端部署操作都是一樣的,在這里以管理員端為例進(jìn)行演示。

打開vscode【用其他前端開發(fā)工具打開也可】,導(dǎo)入資料中的vue目錄下的xzs-admin工程,學(xué)生端是xzs-student。打開vscode的終端,進(jìn)行安裝依賴和啟動項目。

8.4.1 安裝依賴

命令:npm install

?

8.4.2 啟動項目

命令:npm run serve

?

?運行成功,端口號8002

8.5 小程序端部署

8.5.1 微信小程序開發(fā)工具下載與安裝

開發(fā)工具的官方下載地址為:https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html。

不支持Windows XP和Windows 7系統(tǒng),建議使用WIN10。我這里選擇Windows 64版本的安裝包。

安裝過程比較簡單,不用設(shè)置什么,按照提示來就行了。下面是每一步詳細(xì)截圖

?

?

?8.5.2 項目部署

?打開微信開發(fā)工具---> 選擇導(dǎo)入--->找到資料中的wx目錄,導(dǎo)入xzs_student

?

?到這一步會提示,輸入appId,如果自己有就寫自己的,沒有的話,點擊測試,使用測試號

?導(dǎo)入進(jìn)來之后,會自動提示是否運行,選擇【信任并運行】

運行成功 。到此整個項目部署就已經(jīng)完成了

九,項目總結(jié)

該項目是PC端+小程序端。Java做為后端支持。代碼結(jié)構(gòu)規(guī)整,源碼容易閱讀,功能完善,非常適合做為畢設(shè)來使用。

總結(jié)

以上是生活随笔為你收集整理的基于SpringBoot+VUE(PC端+小程序端)的智能在线考试系统毕业设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。