:基于SpringBoot+Vue的工程教育認(rèn)證實(shí)戰(zhàn))
做了這么多年的教學(xué)管理類系統(tǒng)我最大的感受是課程管理平臺聽起來像學(xué)校里最簡單的信息系統(tǒng)但真做進(jìn)去才會發(fā)現(xiàn)它最難的不是頁面長什么樣而是一開始就要想清楚“這個系統(tǒng)到底要管理什么”。如果只是做成課程、成績的電子登記表那用一張Excel就夠了根本不需要前后端分離加一堆權(quán)限設(shè)計。這里要說的工程教育認(rèn)證就是計算機(jī)類專業(yè)申請工程教育認(rèn)證時專家需要看到一套完整的教學(xué)過程證據(jù)鏈課程目標(biāo)是否支撐了畢業(yè)要求指標(biāo)點(diǎn)每門課的考核是否覆蓋了課程目標(biāo)期末的達(dá)成度計算是不是合理以及所有數(shù)據(jù)能不能一環(huán)扣一環(huán)地追溯。用表格手工填填到第三門課基本就會亂套。所以當(dāng)時在某高校的信息化項(xiàng)目里做這套“前后端分離的工程教育認(rèn)證計算機(jī)課程管理平臺”時我給自己定的第一原則是所有數(shù)據(jù)必須能由系統(tǒng)自動串成一條證據(jù)鏈而不是又多了一個數(shù)據(jù)堆積工具。這套系統(tǒng)后端是SpringBoot MyBatis MySQL前端用Vue走JWT登錄鑒權(quán)支持管理員、教師、學(xué)生三類角色。核心功能覆蓋課程庫維護(hù)、課程目標(biāo)與畢業(yè)要求指標(biāo)點(diǎn)關(guān)聯(lián)、考核權(quán)重配置、成績錄入、課程目標(biāo)達(dá)成度自動計算、認(rèn)證材料導(dǎo)出等。如果你是正在做教學(xué)類系統(tǒng)開發(fā)、想學(xué)習(xí)前后端分離項(xiàng)目從零落地到部署的完整流程或者正在為工程認(rèn)證整理教學(xué)數(shù)據(jù)這篇內(nèi)容應(yīng)該能給你一份可以照抄的操作手冊。1. 系統(tǒng)定位先想清楚認(rèn)證要的“證據(jù)鏈”再談建系統(tǒng)1.1 傳統(tǒng)做法為什么撐不起認(rèn)證材料在做這套系統(tǒng)之前我特意看了某高校計算機(jī)專業(yè)一個學(xué)期的實(shí)際數(shù)據(jù)。一位講師帶兩門課期末結(jié)束后要同時整理四份材料課程目標(biāo)達(dá)成情況分析、期末試卷分析、過程性考核記錄、持續(xù)改進(jìn)說明。這些數(shù)據(jù)散落在Excel、教務(wù)系統(tǒng)、紙質(zhì)實(shí)驗(yàn)報告里。算一門課的直接評估值需要先把所有學(xué)生成績按課程目標(biāo)拆開再用表格函數(shù)匹配權(quán)重最后做加權(quán)平均。一門課算大半天算完之后還要擔(dān)心口徑是不是統(tǒng)一。這其實(shí)是工程認(rèn)證里最典型的痛點(diǎn)尤其在OBE理念下專家現(xiàn)場強(qiáng)調(diào)的正是“舉證閉環(huán)”。他隨時會問你這門課有幾個課程目標(biāo)每個課程目標(biāo)靠哪些考核環(huán)節(jié)支撐學(xué)生每個環(huán)節(jié)的平均表現(xiàn)是多少最終達(dá)成度是怎么算出來的有沒有低于期望值的目標(biāo)對應(yīng)的改進(jìn)記錄在哪里如果系統(tǒng)只能錄入成績、查詢成績它根本回答不了這一連串問題。所以這套系統(tǒng)的本質(zhì)不是替代教務(wù)系統(tǒng)而是做一套面向認(rèn)證邏輯的教學(xué)過程管理工具。它的核心設(shè)計圍繞“評價閉環(huán)”展開數(shù)據(jù)鏈路必須能從上到下完整追溯“培養(yǎng)方案—畢業(yè)要求—指標(biāo)點(diǎn)—課程目標(biāo)—考核環(huán)節(jié)—學(xué)生成績”。我意識到這個邏輯的時間比較晚最開始按普通課表系統(tǒng)的方式來設(shè)計數(shù)據(jù)庫結(jié)果后期返工很嚴(yán)重所以這個教訓(xùn)值得先寫出來。1.2 這套系統(tǒng)的功能地圖與用戶視角系統(tǒng)按三種角色區(qū)分功能入口權(quán)限邊界很清晰管理員負(fù)責(zé)基礎(chǔ)數(shù)據(jù)維護(hù)包括專業(yè)、班級、課程、教師賬號、畢業(yè)要求指標(biāo)點(diǎn)。管理員還能看到所有課程的認(rèn)證準(zhǔn)備狀態(tài)比如哪些課程目標(biāo)沒有配置權(quán)重、哪些課程沒有關(guān)聯(lián)指標(biāo)點(diǎn)。這個“待辦視圖”非常關(guān)鍵認(rèn)證準(zhǔn)備階段最容易漏的就是課程與指標(biāo)點(diǎn)的關(guān)聯(lián)關(guān)系。教師進(jìn)入某門課程后先維護(hù)課程基本信息、課程目標(biāo)、考核權(quán)重再錄入學(xué)生成績最后查看達(dá)成度分析報告。教師不需要理解指標(biāo)點(diǎn)結(jié)構(gòu)是怎么來的系統(tǒng)在配置權(quán)重時會自動展示這門課程關(guān)聯(lián)的指標(biāo)點(diǎn)。學(xué)生查詢自己的課程列表、每門課每個課程目標(biāo)的達(dá)成情況、學(xué)期成績單。很多人會忽略一個頁面但我認(rèn)為它才是這個系統(tǒng)的價值擔(dān)當(dāng)“認(rèn)證報告中心”。支持按專業(yè)、學(xué)期、課程三個維度導(dǎo)出數(shù)據(jù)導(dǎo)出的內(nèi)容不只是成績匯總還包括達(dá)成度計算過程、權(quán)重配置明細(xì)、考核環(huán)節(jié)得分率。專家審查的時候這些導(dǎo)出的證明材料比在系統(tǒng)里現(xiàn)場點(diǎn)點(diǎn)更能說明問題。2. 技術(shù)選型拆解為什么是SpringBootVueMyBatisMySQL這套組合2.1 前后端分離對這個場景的價值高校環(huán)境有一個特點(diǎn)老師和管理員辦公的網(wǎng)絡(luò)位置不固定。教師可能在辦公室、家里、機(jī)房錄成績教務(wù)管理員在校內(nèi)審核學(xué)生可能從宿舍訪問。前后端分離后前端打包成靜態(tài)文件部署在高性能的Nginx上后端作為獨(dú)立服務(wù)跑在服務(wù)器上動靜分離的效果很直接靜態(tài)頁面由Nginx直接返回請求API才打到后端服務(wù)減少了后端壓力也讓現(xiàn)場部署靈活很多。另一個價值是并行開發(fā)效率。前端和后端只需要約定好接口格式就能同時開工。這個項(xiàng)目不算小課程管理、指標(biāo)點(diǎn)管理、成績錄入、達(dá)成度分析加起來有二十多個頁面。如果按單體JSP方式寫模板和Java代碼耦合在一起改一個頁面流程就要重啟整個后端協(xié)作效率太低了。2.2 后端三件套怎么分工SpringBoot沒有懸念教學(xué)管理系統(tǒng)里最常用的就是它生態(tài)成熟、部署簡單、社區(qū)資料多。MyBatis雖然常被說“老”但在這類系統(tǒng)里反倒是優(yōu)點(diǎn)因?yàn)檫_(dá)成度計算需要寫大量的多表聚合SQLMyBatis的原生XML可以精確定義每一條SQL比全自動ORM更可控。MySQL則是成本最低的選擇高校里隨便一臺服務(wù)器就能裝好。補(bǔ)充一個選型細(xì)節(jié)為什么這個項(xiàng)目用MyBatis而不是MyBatis-Plus網(wǎng)上很多模板工程默認(rèn)帶Plus但引入后會有一些不一致的坑比如邏輯刪除字段設(shè)計沖突、分頁插件版本不匹配。這個項(xiàng)目的核心統(tǒng)計SQL基本都在XML里手寫所以從源頭就做了約束所有和認(rèn)證計算相關(guān)的查詢必須走XML不通過代碼里的Wrapper拼接。這個約定保守了一些但后期維護(hù)真的省心。2.3 數(shù)據(jù)庫設(shè)計按認(rèn)證邏輯來組織核心數(shù)據(jù)表大致是下面這一組我在設(shè)計時反復(fù)調(diào)整過最終穩(wěn)定的結(jié)構(gòu)是sys_user用戶表區(qū)分角色course課程表course_objective課程目標(biāo)表outcome_point畢業(yè)要求指標(biāo)點(diǎn)表co_point_relation課程目標(biāo)與指標(biāo)點(diǎn)關(guān)聯(lián)表assessment考核環(huán)節(jié)表比如平時作業(yè)、實(shí)驗(yàn)、期末score學(xué)生成績表按考核環(huán)節(jié)記錄colligation_result達(dá)成度計算結(jié)果表保存歷史結(jié)論課程與課程目標(biāo)是一對多一個課程目標(biāo)關(guān)聯(lián)多個考核環(huán)節(jié)一個考核環(huán)節(jié)對應(yīng)一批學(xué)生成績。指標(biāo)點(diǎn)是獨(dú)立維護(hù)的一組數(shù)據(jù)通過中間表與課程目標(biāo)關(guān)聯(lián)關(guān)聯(lián)時帶支撐強(qiáng)度H/M/L。這樣一來整個結(jié)構(gòu)就形成了一條干凈的數(shù)據(jù)鏈路課程 → 課程目標(biāo) → 指標(biāo)點(diǎn)課程目標(biāo) → 考核環(huán)節(jié) → 成績。任意一次達(dá)成度計算都能從成績表一路追溯回課程目標(biāo)和指標(biāo)點(diǎn)不會出現(xiàn)“這個分?jǐn)?shù)到底是哪來的”這種尷尬情況。我第一次設(shè)計時走過彎路把課程目標(biāo)直接放進(jìn)課程表加一個“課程目標(biāo)描述”字段就完事。后來發(fā)現(xiàn)一個目標(biāo)要對應(yīng)多個考核環(huán)節(jié)、多個成績記錄、多個指標(biāo)點(diǎn)根本不是加字段能解決的只能重新拆表。所以這段經(jīng)歷也可以給你參考如果一開始就按認(rèn)證的舉證鏈條來設(shè)計后面所有查詢都會順手得多。3. 核心實(shí)現(xiàn)細(xì)節(jié)認(rèn)證邏輯怎么落地到代碼層3.1 用戶登錄與權(quán)限用JWT做最簡鑒權(quán)先說結(jié)論這種內(nèi)部管理系統(tǒng)不一定要上Spring Security全家桶。Spring Security功能全但配置起來容易在過濾鏈上踩坑尤其是前后端分離之后跨域、匿名請求、CSRF關(guān)閉這些配置一不小心就把人繞暈。這里采用JWT加攔截器的方式做一個可用、可維護(hù)、代碼量可控的登錄鑒權(quán)方案。后端登錄成功后生成token返回給前端前端保存后每次請求通過axios攔截器自動帶上。后端寫一個HandlerInterceptor在preHandle里解析token把用戶信息放入ThreadLocal后續(xù)業(yè)務(wù)方法直接取用盡量避免每層手動傳用戶參數(shù)。加起來代碼量也就一百多行核心邏輯非常直白。有幾個要點(diǎn)值得注意token中只放userId和role不放密碼等敏感信息。過期時間設(shè)置成2小時內(nèi)部系統(tǒng)太長不安全。攔截器放行登錄接口和靜態(tài)資源其余接口都要校驗(yàn)。開發(fā)時我還特意加了一個“測試模式”配置項(xiàng)開啟后跳過鑒權(quán)方便前端同學(xué)直接拿聯(lián)調(diào)數(shù)據(jù)。這個配置如果忘了在生產(chǎn)環(huán)境關(guān)閉系統(tǒng)等于對所有人裸奔這是我真實(shí)踩過的坑部署前一定要檢查。3.2 課程目標(biāo)與指標(biāo)點(diǎn)關(guān)聯(lián)認(rèn)證系統(tǒng)的靈魂課程目標(biāo)是整個認(rèn)證體系里的最小可評價單元。比如《面向?qū)ο蟪绦蛟O(shè)計》這門課可以有這樣幾個目標(biāo)C01掌握類、對象、繼承與多態(tài)的基本概念能完成簡單的類建模。C02能運(yùn)用面向?qū)ο笏季S分析并實(shí)現(xiàn)小型應(yīng)用系統(tǒng)。C03能使用UML類圖描述系統(tǒng)設(shè)計具備一定的文檔規(guī)范意識。每個目標(biāo)都要掛靠畢業(yè)要求的某個指標(biāo)點(diǎn)。比如C01可以關(guān)聯(lián)到“能夠?qū)⒐こ炭茖W(xué)的基本原理用于復(fù)雜工程問題的識別與表達(dá)”的某個細(xì)分指標(biāo)點(diǎn)關(guān)聯(lián)強(qiáng)度標(biāo)為中支撐。界面上做的是一個多對多選擇器看起來簡單但真正的價值在“完整性校驗(yàn)”。系統(tǒng)會檢查所有課程目標(biāo)是否至少掛了一個指標(biāo)點(diǎn)所有指標(biāo)點(diǎn)是否被合理數(shù)量的課程覆蓋。這個校驗(yàn)邏輯在認(rèn)證材料審查中非常關(guān)鍵而大部分課程管理系統(tǒng)根本沒做。有了這個校驗(yàn)教務(wù)管理員才能在認(rèn)證準(zhǔn)備階段快速發(fā)現(xiàn)問題而不是到了專家進(jìn)校前一周才開始通宵補(bǔ)材料。3.3 達(dá)成度計算從數(shù)據(jù)庫查詢到前端可視化達(dá)成度計算是整個平臺的核心亮點(diǎn)采用“加權(quán)得分率”思路。每個課程目標(biāo)對應(yīng)若干考核環(huán)節(jié)每個考核環(huán)節(jié)在課程成績中占固定比例目標(biāo)達(dá)成度就是各考核環(huán)節(jié)得分率的加權(quán)平均。計算公式如下達(dá)成度 Σ(考核環(huán)節(jié)得分率 × 考核環(huán)節(jié)權(quán)重) / Σ(考核環(huán)節(jié)權(quán)重)其中得分率 該考核環(huán)節(jié)全班平均得分 / 該考核環(huán)節(jié)滿分。舉一個實(shí)際例子。課程目標(biāo)C01關(guān)聯(lián)平時作業(yè)權(quán)重30%滿分100和期末卷面第一題權(quán)重20%滿分20。全班平時作業(yè)平均84分卷面第一題平均14分那么達(dá)成度 (84/100 × 30% 14/20 × 20%) / (30% 20%) (0.84 × 0.3 0.70 × 0.2) / 0.5 (0.252 0.14) / 0.5 0.784得到的0.784就是該課程目標(biāo)的達(dá)成度。如果教學(xué)團(tuán)隊(duì)設(shè)定的期望值是0.70那這個目標(biāo)就算達(dá)成如果低于0.70系統(tǒng)會在報告里標(biāo)記為未達(dá)成并提示教師填寫改進(jìn)措施。對應(yīng)的SQL實(shí)現(xiàn)也不復(fù)雜核心是按考核環(huán)節(jié)統(tǒng)計全班平均分。下面這段是簡化后的Mapper查詢思路SELECT a.id AS assessment_id, a.name AS assessment_name, a.ratio, AVG(s.score) AS avg_score, a.full_score FROM assessment a LEFT JOIN score s ON s.assessment_id a.id WHERE a.objective_id #{objectiveId} GROUP BY a.id, a.name, a.ratio, a.full_score前端拿到接口返回的明細(xì)后我用ECharts畫達(dá)成度柱狀圖每根柱子對應(yīng)一個課程目標(biāo)。達(dá)到期望值的用綠色未達(dá)到的用紅色下方附“持續(xù)改進(jìn)意見”輸入框。教師確認(rèn)后生成該學(xué)期該課程的達(dá)成度結(jié)論寫入colligation_result表形成歷史檔案。認(rèn)證專家要看的其實(shí)就是這張圖加對應(yīng)的計算過程。3.4 成績錄入與過程材料管理這個模塊技術(shù)含量不高但使用頻率最高。教師可以按考核環(huán)節(jié)錄入班級成績支持按學(xué)生批量粘貼、從Excel一次性導(dǎo)入、單條修改。錄入時前端做一輪輸入校驗(yàn)成績范圍限定在0到滿分超出直接標(biāo)紅避免臟數(shù)據(jù)進(jìn)庫。導(dǎo)入Excel有一個隱藏的坑學(xué)生學(xué)號是文本格式但Excel經(jīng)常自動轉(zhuǎn)成科學(xué)計數(shù)法。前端讀取Excel文件時必須把學(xué)號列強(qiáng)制按字符串解析。如果少了這一步會出現(xiàn)學(xué)生成績記錄錯位而且排查難度非常大因?yàn)楸砻嫔峡疵啃卸加袛?shù)據(jù)。成績錄入完成后系統(tǒng)自動統(tǒng)計每個學(xué)生的“目標(biāo)得分明細(xì)”也就是這名學(xué)生在每個課程目標(biāo)下各項(xiàng)考核的得分以及合成后的目標(biāo)得分。這個能力是認(rèn)證材料里“學(xué)生個體達(dá)成情況”的基礎(chǔ)也是做學(xué)業(yè)預(yù)警的依據(jù)??吹侥硞€學(xué)生的某項(xiàng)課程目標(biāo)得分明顯偏低系統(tǒng)會給教師彈出一條提示方便教師及時關(guān)注。4. 從開發(fā)機(jī)到服務(wù)器可復(fù)用的部署實(shí)戰(zhàn)記錄4.1 本地開發(fā)環(huán)境準(zhǔn)備與前后端聯(lián)調(diào)先列一份版本建議可以直接照抄JDK8或17都可以我推薦17內(nèi)存和性能表現(xiàn)更好。Maven3.8以上配置國內(nèi)鏡像倉庫會快很多。MySQL8.0以上安裝時字符集選utf8mb4。Node.js16以上Vue工程構(gòu)建需要。前端開發(fā)默認(rèn)端口是5173后端服務(wù)端口是8080。后端啟動前要修改application.yml里的數(shù)據(jù)庫連接、JWT密鑰確認(rèn)MySQL里已經(jīng)導(dǎo)入初始化SQL腳本。啟動命令mvn spring-boot:run前端進(jìn)入項(xiàng)目目錄后執(zhí)行npm install npm run dev聯(lián)調(diào)時要特別注意跨域。開發(fā)環(huán)境前后端端口不同Vue工程里配置了Vite代理把/api開頭的請求轉(zhuǎn)發(fā)到后端8080。這樣比在后端開放CORS更安全調(diào)試也方便。等發(fā)布到生產(chǎn)環(huán)境這個代理就不需要了由Nginx統(tǒng)一做轉(zhuǎn)發(fā)。4.2 Linux服務(wù)器上的生產(chǎn)部署生產(chǎn)環(huán)境我建議用一臺Linux服務(wù)器前端靜態(tài)文件由Nginx托管后端jar包用systemd托管。這樣無論是開機(jī)自啟還是查看日志都比較方便。后端打包mvn clean package -DskipTests java -jar target/course-auth-platform.jar \ --spring.config.location/opt/course-auth/application.yml前端打包npm run build # dist目錄生成后復(fù)制到 /usr/share/nginx/course-auth/Nginx配置參考server { listen 80; server_name your-domain.com; location /api/ { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location / { root /usr/share/nginx/course-auth; index index.html; try_files $uri $uri/ /index.html; } }注意Vue的history路由模式必須配合try_files否則用戶訪問子路徑后刷新頁面就會404。這個問題我見過太多次了部署文檔里一定要提醒自己。4.3 數(shù)據(jù)庫初始化與部署后的復(fù)查清單初始化SQL腳本要按順序執(zhí)行先建表再插入管理員賬號和基礎(chǔ)字典數(shù)據(jù)最后插入測試課程數(shù)據(jù)。字符集統(tǒng)一用utf8mb4否則部分課程目標(biāo)描述里的特殊符號可能存不進(jìn)去。部署完成后至少復(fù)查這幾項(xiàng)后端日志是否報數(shù)據(jù)庫連接失敗重點(diǎn)檢查時區(qū)配置。Nginx是否能正常訪問/api請求是否成功轉(zhuǎn)發(fā)到后端。管理員賬號能否登錄菜單權(quán)限是否完整。打開任意課程詳情頁確認(rèn)課程目標(biāo)、考核權(quán)重、指標(biāo)點(diǎn)關(guān)聯(lián)都有數(shù)據(jù)。按這個順序操作整個平臺從零到可用大概就是一小時左右。5. 常見問題與排查經(jīng)驗(yàn)實(shí)錄5.1 跨域和登錄失效問題前端訪問接口時報跨域錯誤原因通常是后端沒有放行預(yù)檢請求。攔截器里要顯式放行OPTIONS方法否則瀏覽器預(yù)檢失敗接口直接被攔。JWT過期后前端不會自動跳登錄頁需要在axios響應(yīng)攔截器里判斷401狀態(tài)碼然后清除本地token并跳轉(zhuǎn)登錄。千萬別把這個邏輯散落到各個頁面里否則后續(xù)維護(hù)會非常痛苦。5.2 MySQL驅(qū)動與MyBatis配置的兼容MySQL 8.0的驅(qū)動類是com.mysql.cj.jdbc.Driver老配置里寫的com.mysql.jdbc.Driver會直接啟動失敗。另外 MyBatis的ResultMap字段映射默認(rèn)不支持下劃線轉(zhuǎn)駝峰需要在application.yml里開啟mapUnderscoreToCamelCase否則數(shù)據(jù)庫查詢結(jié)果里一堆字段名對不上排查起來很容易頭大。5.3 達(dá)成度數(shù)據(jù)異常的處理思路如果算出來的達(dá)成度大于1大概率是權(quán)重沒有歸一化或者某個考核環(huán)節(jié)的滿分設(shè)置錯誤。排查時先看每個考核環(huán)節(jié)的得分率是否都小于等于1再看權(quán)重之和是否接近1。這里有個非常有效的驗(yàn)證手段開發(fā)階段準(zhǔn)備一門真實(shí)課程先用Excel手算一遍達(dá)成度再用系統(tǒng)輸出同一個結(jié)果做比對。兩邊數(shù)據(jù)一致后后續(xù)調(diào)整邏輯就有對照了。5.4 并發(fā)與數(shù)據(jù)量問題高校的選課高峰一般集中在開學(xué)頭兩周最多幾百人同時在線壓力其實(shí)不大。真正的壓力在學(xué)期末教師批量導(dǎo)入成績時會有大量INSERT操作。解決方法是控制單次批量提交行數(shù)比如每次200條分批插入。數(shù)據(jù)庫連接池用默認(rèn)配置撐住幾百個并發(fā)完全夠用不需要額外折騰。6. 寫在最后壓測過了材料也交掉了我的幾點(diǎn)真實(shí)體會系統(tǒng)做完之后我反而覺得最值得回味的不是技術(shù)本身。這套課程管理平臺的技術(shù)難度沒有特別高真正的難點(diǎn)是在前期和教務(wù)處、任課老師反復(fù)確認(rèn)“認(rèn)證到底要什么”。我第一次搭好框架之后發(fā)現(xiàn)課程目標(biāo)和指標(biāo)點(diǎn)的關(guān)聯(lián)方向設(shè)計反了導(dǎo)致后面統(tǒng)計邏輯全部要改只能重新調(diào)整數(shù)據(jù)模型。所以這里有一個很實(shí)際的建議動手寫代碼之前先讓專業(yè)負(fù)責(zé)人挑一門真實(shí)課程按系統(tǒng)邏輯手算一遍達(dá)成度用Excel把結(jié)果算清楚再讓系統(tǒng)去復(fù)現(xiàn)這個結(jié)果。流程先跑通一次后面寫代碼其實(shí)只是把這個流程自動化而已。另一個經(jīng)驗(yàn)是這類系統(tǒng)要同時留好“數(shù)據(jù)導(dǎo)入”和“數(shù)據(jù)導(dǎo)出”兩個口子。實(shí)際使用中老師更愿意在系統(tǒng)里改數(shù)據(jù)但期末填表時一定需要能導(dǎo)出一份標(biāo)準(zhǔn)的認(rèn)證表格。如果不做導(dǎo)出功能系統(tǒng)會被慢慢棄用因?yàn)槔蠋熃徊牧蠒r還得回到Excel世界。未來如果繼續(xù)擴(kuò)展可以做自動生成持續(xù)改進(jìn)報告、對接學(xué)校統(tǒng)一身份認(rèn)證、增加學(xué)生問卷調(diào)查與課程目標(biāo)的映射。不過這些都是錦上添花先把每門課的達(dá)成度算清楚、算正確這套系統(tǒng)的價值就已經(jīng)落地了。把這些過程記下來的目的只有一個等你真正上手做同類系統(tǒng)時能少走一次彎路。