日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

ARTICLE DETAIL

資訊詳情

深耕商務建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

學生選課系統(tǒng)全棧開發(fā)實戰(zhàn):SpringBoot+Vue+MyBatis+MySQL設計部署詳解

學生選課系統(tǒng)全棧開發(fā)實戰(zhàn):SpringBoot+Vue+MyBatis+MySQL設計部署詳解 做學生選課系統(tǒng)說到底是把一條條課程數(shù)據(jù)、一個個學生身份、一節(jié)節(jié)時間資源串起來把誰在什么時間選了哪門課這件事管明白。這篇博文圍繞SpringBootVueVueMyBatisMySQL這套企業(yè)級前后端分離架構(gòu)完整拆解一個學生選課管理系統(tǒng)的源碼設計、數(shù)據(jù)庫建模、后端接口實現(xiàn)、前端頁面交互以及真實部署中會遇到的坑。無論你是正在做畢業(yè)設計、課程設計還是想快速上手SpringBoot后端Vue前端的全棧開發(fā)套路這篇內(nèi)容都能幫你少走不少彎路。先說結(jié)論這套系統(tǒng)跑通不難但要把選課容量、防重復選、退課名額釋放、角色權(quán)限控制這些細節(jié)做干凈還是有不少門道。下面我按實際開發(fā)順序從技術選型、數(shù)據(jù)庫設計、后端核心邏輯、前端對接一直講到部署排錯把每個環(huán)節(jié)的關鍵代碼和思路都梳理出來。1. 系統(tǒng)整體設計與思路拆解1.1 為什么選SpringBootVueMyBatisMySQL這套組合學生選課系統(tǒng)不算復雜但勝在功能典型用戶登錄、角色權(quán)限、數(shù)據(jù)列表、增刪改查、業(yè)務狀態(tài)流轉(zhuǎn)這些幾乎是所有管理系統(tǒng)的共性需求。選這套技術棧不是因為它最花哨而是因為它足夠標準踩坑資料多、上手成本低、維護成本也低。SpringBoot解決了傳統(tǒng)SSH/SSM項目配置繁瑣的問題。不用再寫一堆XML配置文件起步依賴自動管理jar包版本內(nèi)嵌Tomcat讓項目直接通過main方法就能啟動。對初學者來說最大的感受就是原來啟動一個Web項目可以這么快。Vue負責前端頁面。菜鳥教程式的漸進式框架組件化開發(fā)讓頁面拆成獨立的.vue文件路由控制頁面跳轉(zhuǎn)配合Element UI這樣的組件庫表格、表單、彈窗、分頁這些后端管理系統(tǒng)最常見的交互半天就能搭出像模像樣的界面。前后端分離的好處也很明顯前后端各干各的接口約定好調(diào)試互不干擾。Vue 3也可以但考慮到生態(tài)成熟度和學校主流教材Vue 2 Element UI仍然是不少畢設項目的穩(wěn)妥選擇。MyBatis作為持久層框架最大的優(yōu)勢是SQL可以完全自己控制。選課系統(tǒng)里有大量涉及多表關聯(lián)、條件統(tǒng)計、動態(tài)查詢的場景比如查某個學生已選的課程列表、查某門課的已選人數(shù)、按學院/學分/上課時間篩選課程。這些SQL寫起來靈活調(diào)試也直觀比全自動ORM更容易排查問題。MySQL作為數(shù)據(jù)存儲端免費開源性能足夠和SpringBoot、MyBatis的兼容性也經(jīng)過了大量項目驗證。整套組合下來就是一個經(jīng)典到不能再經(jīng)典的中小規(guī)模管理系統(tǒng)標配。1.2 角色權(quán)限與功能模塊的劃分邏輯這個系統(tǒng)的核心角色有三種管理員、教師、學生。為什么分成三種而不是一張用戶表通吃從業(yè)務上來講三種角色的操作邊界完全不同。學生注冊/登錄、瀏覽課程列表、按條件查詢課程、選課、退課、查看已選課程、查看個人成績教師登錄、發(fā)布課程、修改課程信息、查看選課學生名單、錄入學生成績管理員學生管理、教師管理、課程管理、選課數(shù)據(jù)統(tǒng)計、系統(tǒng)公告如果用一張user表加一個role字段去區(qū)分倒也能跑但代碼里到處都要加if (role 1)的判斷邏輯會越來越亂。更合理的做法是獨立出一個角色字段配合后端攔截器做權(quán)限校驗——每個接口在進入Controller之前先判斷登錄用戶角色不符合直接返回403。前端再根據(jù)角色動態(tài)渲染菜單和按鈕做到后端兜底、前端體驗的雙重安全。在實際源碼里用戶表sys_user通常保留username和password再用role字段區(qū)分角色。也有項目把學生、教師、管理員拆成三張獨立表但這樣登錄邏輯就要分別處理反而麻煩?;诮巧膯伪碜侄螀^(qū)分更符合中小型系統(tǒng)的簡潔原則。1.3 版本選型與踩過的版本坑版本選型看著不起眼但在實際開發(fā)中坑不少。這里直接給出一套我驗證過的穩(wěn)定組合照著用基本不會出幺蛾子。組件推薦版本說明JDK1.8兼容性最好網(wǎng)上資料最多不推薦強上JDK 17Spring Boot2.7.x穩(wěn)定版和JDK 8完美配合自帶Tomcat 9MyBatis Starter2.1.x或者2.3.x由Spring Boot 2.7.x自動管理版本MySQL8.0.x 或 5.7建議8.0注意時區(qū)參數(shù)Maven3.6.3避免太老版本導致依賴解析失敗Node.js14.x或16.x跑Vue 2項目的工程化環(huán)境Vue2.6.x Element UI 2.15.x前端框架組件庫穩(wěn)定Axios0.21.x前端HTTP請求庫版本適配是我踩過最慘的坑最開始用Spring Boot 3.0 JDK 17結(jié)果MyBatis的starter版本不兼容、第三方工具類全是基于javax包的而Spring Boot 3把javax換成了jakarta一堆代碼改到頭大。后來全部回退到2.7.x JDK 8幾分鐘就全部跑通了。老實說做這種管理系統(tǒng)真的沒必要追求最新版本——穩(wěn)定跑通、資料好查才是第一位的。2. 數(shù)據(jù)庫設計與持久層實現(xiàn)2.1 核心表結(jié)構(gòu)與建表SQL數(shù)據(jù)庫是整個系統(tǒng)的地基表設計好不好直接決定后面SQL寫起來痛不痛苦。核心表歸納下來是五張用戶表、課程表、選課記錄表、成績表、公告表可選。學生和教師統(tǒng)一放在sys_user表里通過role字段區(qū)分。核心字段要包括id、username、password、real_name、role、create_time。密碼存儲我不建議用明文用MD5加鹽或者BCrypt加密安全性高出一大截。課程表是course字段包括id、course_name、teacher_id、credit、capacity、selected_count、class_time、location。其中selected_count表示已選人數(shù)這個字段在并發(fā)選課的場景下需要謹慎處理后面會專門講。選課記錄表用sc命名student_course主鍵設計為聯(lián)合主鍵(user_id, course_id)防止同一個人選同一門課兩次這是數(shù)據(jù)庫層面最樸素也最有效的防重復手段。下面是精簡版的建表SQLCREATE DATABASE IF NOT EXISTS course_system DEFAULT CHARACTER SET utf8mb4; USE course_system; CREATE TABLE sys_user ( id BIGINT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(100) NOT NULL, real_name VARCHAR(50), role TINYINT NOT NULL DEFAULT 2 COMMENT 0-管理員 1-教師 2-學生, create_time DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE course ( id BIGINT AUTO_INCREMENT PRIMARY KEY, course_name VARCHAR(100) NOT NULL, teacher_id BIGINT NOT NULL, credit INT DEFAULT 2, capacity INT DEFAULT 60, selected_count INT DEFAULT 0, class_time VARCHAR(100) COMMENT 上課時間如 周一3-4節(jié), location VARCHAR(100), create_time DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE sc ( user_id BIGINT NOT NULL, course_id BIGINT NOT NULL, score DECIMAL(5,2), create_time DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (user_id, course_id), CONSTRAINT fk_sc_user FOREIGN KEY (user_id) REFERENCES sys_user(id), CONSTRAINT fk_sc_course FOREIGN KEY (course_id) REFERENCES course(id) );幾個關鍵細節(jié)解釋一下第一字符集必須用utf8mb4不然用戶在備注里輸入個emoji表情就會報Data too long或亂碼。第二聯(lián)合主鍵是防重復選課的底線就算后端代碼有漏洞數(shù)據(jù)庫也會攔住重復插入。第三成績字段直接放進選課表里教師錄入成績其實就是更新sc表的score字段不需要單獨建一張成績表。2.2 MyBatis核心SQL寫法與動態(tài)查詢MyBatis的XML配置和注解方式我都有用過選課系統(tǒng)這種多表查詢頻繁的項目更推薦XML方式。注解方式適合簡單SQL一旦SQL超過三行、里面還有動態(tài)條件可讀性會直線下降。XML把SQL集中管理后期排查問題也方便。課程列表查詢是最典型的場景學生進入選課頁面需要看到課程列表、授課教師姓名、當前已選人數(shù)/容量。這里必然涉及course表和sys_user表的聯(lián)查。select idselectCourseList resultTypecom.example.vo.CourseVO SELECT c.id, c.course_name, c.credit, c.capacity, c.selected_count, c.class_time, c.location, u.real_name AS teacher_name FROM course c LEFT JOIN sys_user u ON c.teacher_id u.id where if testcourseName ! null and courseName ! AND c.course_name LIKE CONCAT(%, #{courseName}, %) /if if testteacherName ! null and teacherName ! AND u.real_name LIKE CONCAT(%, #{teacherName}, %) /if /where ORDER BY c.id /select這段SQL用到了MyBatis動態(tài)SQL的ifwhere標簽。where標簽有個小細節(jié)值得注意它會自動去掉第一個多余的AND/OR避免代碼里拼SQL時還要糾結(jié)前面要不要加WHERE的經(jīng)典問題。這是MyBatis相比直接JDBC拼接SQL的巨大優(yōu)勢。除了動態(tài)條件查詢已選課程列表也是高頻SQL。核心邏輯就是通過sc表反查course表select idselectSelectedCourses resultTypecom.example.vo.CourseVO SELECT c.id, c.course_name, c.credit, c.capacity, c.selected_count, c.class_time, c.location, u.real_name AS teacher_name FROM sc JOIN course c ON sc.course_id c.id JOIN sys_user u ON c.teacher_id u.id WHERE sc.user_id #{userId} /select這里有一個很容易踩的映射問題數(shù)據(jù)庫字段是course_name而Java實體屬性是courseName直接查詢返回的結(jié)果會是null。解決方案是在MyBatis全局配置中開啟駝峰映射mybatis: configuration: map-underscore-to-camel-case: true這個配置我已經(jīng)不知道救了多少人不開它聯(lián)查出來的字段全是空值排查半天往往就是這個原因。2.3 選課容量與并發(fā)控制的常見設計選課系統(tǒng)最容易出問題的場景就是并發(fā)選課高峰時期多個學生同時對同一門課發(fā)起選課請求如果代碼沒有做好并發(fā)控制課程容量只有60人結(jié)果選了65人進去數(shù)據(jù)就臟了。最簡單的方案是先查再插的事務控制選中課程之前查一下selected_count小于capacity就插入選課記錄同時把selected_count加1。但在高并發(fā)下兩個請求同時查到count59然后同時插入最后一個課程就多了一個人。解決辦法有幾個方向第一種是數(shù)據(jù)庫層面的樂觀鎖。在course表加一個version字段更新時帶著version條件影響行數(shù)為0說明version被改了就提示選課人數(shù)已滿。update idincreaseSelectedCount UPDATE course SET selected_count selected_count 1, version version 1 WHERE id #{courseId} AND version #{version} AND selected_count lt; capacity /update這里一定要在WHERE條件里加上selected_count capacity通過數(shù)據(jù)庫行鎖的機制保證只有在未滿員的情況下才會加人數(shù)。Java代碼中判斷update返回的受影響行數(shù)為1就表示搶占成功繼續(xù)執(zhí)行插入選課記錄的SQL為0就說明課程滿了或version沖突直接返回選課失敗。第二種是直接給課程行加鎖SELECT ... FOR UPDATE。這種方式在編寫上更直觀但死鎖風險需要仔細測試性能也有一定消耗。對畢設和中小型系統(tǒng)來說樂觀鎖條件更新的方案最穩(wěn)妥。我的建議是在線程并發(fā)量不夸張的場景下直接把容量判斷和更新人數(shù)合并為一條UPDATE語句配合insert選課記錄再用一個事務包起來基本就夠用了。如果選課系統(tǒng)真的要支撐上千人同時搶課那就要引入Redis分布式鎖或消息隊列了但這就超出了學生選課系統(tǒng)的范疇了。3. 后端核心邏輯與接口實現(xiàn)3.1 登錄認證與權(quán)限攔截的實現(xiàn)思路登錄認證幾乎是所有管理系統(tǒng)的第一道門檻選課系統(tǒng)也不例外。常規(guī)做法有兩種Session方式和JWT Token方式。Session方式是傳統(tǒng)方案登錄成功后將用戶信息存入Session后續(xù)請求通過Cookie攜帶SessionID來識別身份。實現(xiàn)簡單但前后端分離時Session共享和跨域Cookie處理比較麻煩。前后端分離的項目更推薦JWTJSON Web Token方案。用戶登錄成功后后端簽發(fā)一個包含用戶ID、用戶名、角色、過期時間的Token字符串前端拿到后存在localStorage里之后每次請求在請求頭加上Authorization: Bearer 。后端通過攔截器或Spring Security解析Token識別當前登錄用戶身份和角色。對于學生選課系統(tǒng)我認為直接從簡單入手即可不引入Spring Security這種重型框架而是利用SpringBoot的HandlerInterceptor實現(xiàn)一個自定義攔截器。核心邏輯如下public class AuthInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token request.getHeader(Authorization); if (token null || token.isEmpty()) { response.setStatus(401); return false; } try { // 解析token把userId和role放進request屬性方便后續(xù)Controller使用 Claims claims JwtUtil.parseToken(token.replace(Bearer , )); request.setAttribute(userId, claims.get(userId)); request.setAttribute(role, claims.get(role)); return true; } catch (Exception e) { response.setStatus(401); return false; } } }這里把Token解析出的userId和role塞進request屬性后續(xù)Controller方法里直接用RequestAttribute就可以取出來非常方便。角色權(quán)限校驗還可以再寫一個RoleInterceptor按不同接口路徑匹配不同角色實現(xiàn)思路類似都是繼承HandlerInterceptor然后重寫preHandle。為了減少代碼侵入登錄接口本身不需要攔截可以用WebMvcConfigurer的addInterceptors方法配置攔截路徑白名單registry.addInterceptor(authInterceptor()) .addPathPatterns(/api/**) .excludePathPatterns(/api/auth/login, /api/auth/register);這個白名單的設計要仔細。比如教師錄入成績的接口必須要求老師權(quán)限學生選課接口必須要求student角色。如果權(quán)限控制做得比較粗會出現(xiàn)學生直接調(diào)管理員的接口刪課程雖然前端頁面沒這個按鈕但接口是裸奔的——所以一定要在服務端校驗角色不能只靠前端隱藏按鈕。3.2 選課接口的完整處理流程選課是系統(tǒng)的核心接口邏輯上要比普通接口多幾步。我把它拆成四個關鍵步驟第一步從Token或請求參數(shù)中獲取當前學生ID。注意學生ID不能從前端傳來的JSON里讀取否則學號是A的同學可以偽造請求幫學號是B的同學選課。必須通過Token解析出來的身份來確定用戶。第二步校驗課程狀態(tài)。查出課程信息確認課程存在、已選人數(shù)小于容量。同時校驗選課時間是否在系統(tǒng)開放時間內(nèi)如果有的話。第三步執(zhí)行選課。插入sc記錄。這一步要利用數(shù)據(jù)庫的聯(lián)合主鍵防重復。第四步更新課程已選人數(shù)。樂觀鎖UPDATE。如果用事務統(tǒng)一管理核心代碼大致是這樣Service public class CourseServiceImpl implements CourseService { Autowired private CourseMapper courseMapper; Autowired private ScMapper scMapper; Transactional(rollbackFor Exception.class) Override public Result selectCourse(Long userId, Long courseId) { // 1. 判斷是否已經(jīng)選過 int existCount scMapper.countByUserIdAndCourseId(userId, courseId); if (existCount 0) { return Result.error(你已選過該課程請勿重復選擇); } // 2. 樂觀鎖占坑只有未滿才更新成功 int rows courseMapper.increaseSelectedCount(courseId); if (rows 0) { return Result.error(該課程人數(shù)已滿選課失敗); } // 3. 插入選課記錄 scMapper.insert(userId, courseId); return Result.success(選課成功); } }這里有個小細節(jié)步驟1和步驟2在并發(fā)情況下可能會有間隙但并不影響最終一致性。因為即使兩個請求同時通過步驟1步驟2的樂觀鎖UPDATE只會有一個成功另一個rows0直接報滿。所以在高并發(fā)下偶爾會有學生明明沒選過卻提示人數(shù)已滿這并不會造成數(shù)據(jù)錯誤屬于可接受的業(yè)務提示。退課接口的邏輯就相反了先刪除sc記錄再把course表的selected_count減1。刪除時也要判斷記錄是否存在不要出現(xiàn)刪除0行卻返回成功的情況。3.3 Service層與Controller層的職責劃分很多新手寫代碼喜歡把業(yè)務邏輯全堆在Controller里一個接口對應一個方法幾十行邏輯塞進去雖然能跑但后期維護極其痛苦。我更推薦嚴格分層Controller層只做三件事接收參數(shù)、調(diào)用Service、返回統(tǒng)一結(jié)果封裝。Controller里不寫任何if-else業(yè)務判斷。Service層負責核心業(yè)務邏輯事務管理、業(yè)務流程編排、業(yè)務規(guī)則校驗。像選課、退課、成績錄入這些核心操作都放在Service里。Mapper層DAO層只負責數(shù)據(jù)庫交互一個方法對應一條SQL不做業(yè)務處理。統(tǒng)一結(jié)果返回結(jié)構(gòu)也很重要。所有接口統(tǒng)一返回Result對象一般包含code、message、data三個字段。前端根據(jù)code判斷請求成功與否避免出現(xiàn)HTTP 200但業(yè)務失敗還要解析data里的值來猜的情況。public class Result { private Integer code; // 200 成功500 業(yè)務失敗401 未登錄 private String message; private Object data; public static Result success(Object data) { Result r new Result(); r.setCode(200); r.setData(data); return r; } public static Result error(String message) { Result r new Result(); r.setCode(500); r.setMessage(message); return r; } }這個Result類看著簡單實際使用中價值非常大。前端Axios攔截器可以直接根據(jù)code做統(tǒng)一錯誤提示不用每個接口單獨寫一遍你已選過該課程人數(shù)已滿這類提示邏輯。4. 前端Vue實現(xiàn)與接口對接4.1 前端工程結(jié)構(gòu)與路由設計Vue前端項目一般用Vue CLI或Vite創(chuàng)建。以Vue 2為例工程創(chuàng)建命令vue create course-system-frontend創(chuàng)建完成后在項目根目錄安裝Element UI和Axiosnpm install element-ui -S npm install axios -Smain.js中引入Element UIimport Vue from vue import ElementUI from element-ui import element-ui/lib/theme-chalk/index.css import App from ./App.vue import router from ./router Vue.use(ElementUI) new Vue({ router, render: h h(App) }).$mount(#app)路由設計上按角色劃分模塊。為了減少首屏加載時間用Vue Router的懶加載模式。路由懶加載按需加載對應的組件頁面比較多時能顯著提高首屏速度。在路由守衛(wèi)中做登錄校驗是前端控制訪問權(quán)限最直接的方式?jīng)]有token就跳轉(zhuǎn)到登錄頁有token但角色不匹配就跳轉(zhuǎn)到對應角色的首頁。router.beforeEach((to, from, next) { const token localStorage.getItem(token) if (to.path /login) { next() return } if (!token) { next(/login) return } next() })另外導航守衛(wèi)里還可以根據(jù)當前用戶的role動態(tài)生成菜單。比如管理員路由包含用戶管理學生路由沒有這個菜單。雖然真正的權(quán)限控制要靠后端攔截器但前端動態(tài)菜單能讓界面更清爽。4.2 Axios請求封裝與攔截器設計前端所有接口請求都建議封裝在統(tǒng)一模塊中而不是每個頁面直接調(diào)用axios.get。這樣在統(tǒng)一處理Token、統(tǒng)一處理錯誤碼、統(tǒng)一加載狀態(tài)時能省掉大量重復代碼。先封裝一個request.js模塊import axios from axios import { Message } from element-ui import router from /router const request axios.create({ baseURL: /api, timeout: 10000 }) // 請求攔截器自動攜帶token request.interceptors.request.use(config { const token localStorage.getItem(token) if (token) { config.headers[Authorization] Bearer token } return config }) // 響應攔截器統(tǒng)一處理業(yè)務錯誤碼 request.interceptors.response.use( response { const res response.data if (res.code 200) { return res } else if (res.code 401) { localStorage.removeItem(token) router.push(/login) return Promise.reject(new Error(未登錄或登錄已過期)) } else { Message.error(res.message || 請求失敗) return Promise.reject(new Error(res.message)) } }, error { Message.error(網(wǎng)絡連接異常) return Promise.reject(error) } ) export default request封裝好之后頁面里調(diào)用接口就非常干凈了import request from /utils/request export function selectCourse(courseId) { return request.post(/course/select, { courseId }) } export function getCourseList(params) { return request.get(/course/list, { params }) }這種封裝最大的價值在于新增一個接口時只需寫一行函數(shù)定義接口異常統(tǒng)一彈Message提示代碼可讀性也高很多。實際開發(fā)中我還發(fā)現(xiàn)一個細節(jié)baseURL用/api這種相對路徑開發(fā)時通過Vue CLI的proxy配置將/api轉(zhuǎn)發(fā)到后端localhost:8080避免跨域。部署時再用Nginx反向代理到后端服務前端代碼里不需要寫死IP和端口非常靈活。4.3 選課頁面的核心交互實現(xiàn)選課頁面是最核心的前端頁面用Element UI的Table組件展示課程列表加上搜索條件和分頁。table的核心列設計一般包括課程名稱、授課教師、學分、上課時間、上課地點、容量、已選人數(shù)、操作按鈕。操作按鈕需要根據(jù)狀態(tài)顯示不同的文字和樣式如果已選顯示已選并且置灰如果滿員顯示已滿否則顯示選課。具體實現(xiàn)時課程列表接口返回的數(shù)據(jù)里包含一個字段isSelected這是后端在當前用戶登錄狀態(tài)下特別查詢返回的方便前端直接判斷按鈕狀態(tài)。el-table :datacourseList v-loadingloading el-table-column propcourseName label課程名稱 width200/el-table-column el-table-column propteacherName label教師 width150/el-table-column el-table-column propcredit label學分 width80/el-table-column el-table-column propclassTime label上課時間 width180/el-table-column el-table-column propcapacity label容量 width80/el-table-column el-table-column propselectedCount label已選人數(shù) width100/el-table-column el-table-column label操作 width150 template slot-scopescope el-button typeprimary sizesmall :disabledscope.row.selectedCount scope.row.capacity || scope.row.isSelected clickhandleSelect(scope.row) {{ scope.row.isSelected ? 已選 : 選課 }}/el-button /template /el-table-column /el-table選課按鈕點擊后調(diào)用后端接口成功會刷新列表并彈成功提示失敗則彈錯誤消息。我在實際開發(fā)中遇到一個體驗問題選課成功后如果不刷新列表isSelected還是舊的false需要重新拉一遍課程列表。這個小細節(jié)處理好之后選課成功和已選狀態(tài)切換就很絲滑了。頁面加載時調(diào)用分頁接口getCourseList({ pageNum: this.pageNum, pageSize: this.pageSize, courseName: this.keyword }) .then(res { this.courseList res.data.list this.total res.data.total })這里分頁參數(shù)和后端保持一致后端使用PageHelper插件可以非常方便地實現(xiàn)分頁查詢設置PageHelper.startPage(pageNum, pageSize)之后緊接著的SQL查詢就會自動拼接LIMIT語句同時返回的總條數(shù)也會被攔截器自動處理。4.4 我的課程頁面與成績查看功能學生選完課后需要有一個我的課程頁面來查看已選課程列表。這個頁面的表格和選課頁面類似但操作按鈕變成退課和查看成績。退課操作需要一個二次確認彈窗用Element UI的MessageBox做確認防止學生誤點this.$confirm(確定要退掉這門課程嗎, 提示, { confirmButtonText: 確定退課, cancelButtonText: 取消, type: warning }).then(() { cancelCourse(courseId).then(() { this.$message.success(退課成功) this.loadCourses() }) })教師端查看選課學生名單和錄入成績頁面交互邏輯類似只是數(shù)據(jù)源不同。錄入成績用el-input-number或者el-input做成可編輯的單元格或者彈窗表單提交后調(diào)用錄入成績接口。5. 項目部署運行與常見問題排查5.1 本地從零啟動完整流程假如你拿到一套完整的源碼怎么把它跑起來我按實操順序整理一下。第一步準備環(huán)境。安裝JDK 8、Maven 3.6、MySQL 8.0、Node.js 14并配置好環(huán)境變量。第二步導入數(shù)據(jù)庫。用Navicat或其他MySQL客戶端執(zhí)行項目提供的前置SQL腳本。如果沒有現(xiàn)成腳本就按前面的建表SQL手動建庫建表再插入幾條測試數(shù)據(jù)。第三步修改配置文件。打開后端項目的application.yml檢查這幾項數(shù)據(jù)庫地址、端口、賬號密碼。很多新手啟動報錯80%是這一步驟出了問題。server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/course_system?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: your_password driver-class-name: com.mysql.cj.jdbc.Driver mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.example.entity configuration: map-underscore-to-camel-case: true注意url里一定要加上serverTimezoneAsia/Shanghai否則MySQL 8.0會報時區(qū)錯誤。第四步啟動后端。在項目根目錄執(zhí)行mvn spring-boot:run等待控制臺出現(xiàn)Started Application in x.xxx seconds字樣就說明后端啟動成功。第五步啟動前端。前端項目目錄下安裝依賴并啟動開發(fā)服務器npm install npm run serve控制臺會出現(xiàn)訪問地址通常是http://localhost:8081。默認端口如果沖突在vue.config.js里配置devServer.port同時配置代理module.exports { devServer: { port: 8081, proxy: { /api: { target: http://localhost:8080, changeOrigin: true } } } }到這里瀏覽器打開前端地址注冊一個學生賬號就能體驗完整的選課流程了。5.2 常見問題速查表我把反復遇到的幾類問題整理成表格按照排查優(yōu)先級排列問題現(xiàn)象根本原因解決辦法啟動后端報錯ConnectException: Connection refusedMySQL沒啟動或端口不對檢查MySQL服務狀態(tài)確認3306端口可連接報錯Unknown database course_system數(shù)據(jù)庫沒創(chuàng)建或名字不一致執(zhí)行建庫SQL核對application.yml里的庫名報錯Public Key Retrieval is not allowedMySQL 8.0連接參數(shù)缺少allowPublicKeyRetrieval在JDBC URL中追加allowPublicKeyRetrievaltrue前端訪問后端接口報404代理路徑或接口路徑不匹配檢查vue.config.js的proxy配置和請求的baseURL前端接口返回數(shù)據(jù)里外鍵字段為null沒有開啟駝峰映射在mybatis配置中設置map-underscore-to-camel-casetrue中文亂碼數(shù)據(jù)庫字符集不是utf8mb4修改庫/表字符集為utf8mb4端口被占用8080被其他程序占用換端口或殺死占用進程Maven依賴下載失敗網(wǎng)絡問題或倉庫源問題配置阿里云鏡像倉庫這些坑基本覆蓋了我在實際部署中遇到過的情況。其中Public Key Retrieval is not allowed是MySQL 8.0特有的很多人在MySQL 5.7上能跑通的連接配置到8.0就報這個錯解決方案就是URL添加上面說的參數(shù)或者修改MySQL用戶的加密方式。5.3 容易忽略但很實用的幾個細節(jié)第一個是IDE的Maven配置。很多學生遇到依賴下載失敗其實不是代碼問題而是Maven用了默認的中央倉庫國內(nèi)訪問不穩(wěn)定。在settings.xml中配置阿里云鏡像基本能解決mirror idaliyunmaven/id mirrorOfcentral/mirrorOf name阿里云公共倉庫/name urlhttps://maven.aliyun.com/repository/public/url /mirror第二個是Lombok的使用。Lombok能省掉大量getter/setter代碼但需要IDEA插件支持而且IDEA版本和Lombok版本存在兼容性問題。如果實體類上加了Data但項目里調(diào)用getId()卻編譯報錯多半是IDEA的Lombok插件沒裝或版本不對。第三個是前端npm install時報node-sass安裝失敗。老項目里常遇到node-sass它與Node版本綁定Node版本太高太低都會掛。2025年的視角下建議優(yōu)先選sassdart-sass而不是node-sass或者在項目依賴里把node-sass替換成sass。這也是很多Vue 2舊項目的一個歷史包袱。第四個無關技術但非常關鍵密碼處理。我見過很多畢設項目把用戶密碼明文存在數(shù)據(jù)庫里甚至登錄驗證直接SELECT * FROM user WHERE password xxx這非常危險。至少也要做MD5鹽存儲或者直接使用BCrypt。這個習慣不光是項目要求更是未來工作的職業(yè)底線。6. 二次擴展與項目進階方向如果源碼跑通之后想加點亮點讓系統(tǒng)在答辯或?qū)嶋H使用中更有說服力這幾個方向我建議優(yōu)先考慮。第一個是引入Redis做課程緩存和選課計數(shù)器。課程列表是查詢頻率最高的接口用Redis緩存課程列表數(shù)據(jù)可以顯著降低數(shù)據(jù)庫壓力。選課人數(shù)也可以直接在Redis里做原子自增INCR命令選課成功后異步同步到MySQL這樣并發(fā)支持能力會上一個檔次。實際項目里這個方案很常見能讓面試官覺得你理解了緩存和數(shù)據(jù)庫的一致性問題。第二個是使用Spring Boot的定時任務實現(xiàn)選課開放與關閉。比如在配置表中設置選課開始時間和結(jié)束時間然后寫一個定時任務自動切換課程狀態(tài)。這比手動在代碼里判斷當前時間要優(yōu)雅得多也更接近真實教務系統(tǒng)的行為。第三個是增加數(shù)據(jù)導出功能。學生成績單、選課名單用Hutool或Easy Excel直接導出成Excel文件。這個功能很多系統(tǒng)都沒有但實際使用中需求量很大尤其是教師端導出選課學生名單屬于加分項。第四個是引入Logback日志配置。把操作日志、異常日志按級別輸出到文件方便線上問題排查。畢設答辯時面試官問系統(tǒng)出了異常你怎么排查拿出日志文件來談會顯得專業(yè)得多。我自己實際做完這套系統(tǒng)之后的體會是技術本身并不難難的是把邊界情況想全、把每個按鈕的狀態(tài)判斷清楚、把每條SQL在各種場景下都驗證到位。選課系統(tǒng)麻雀雖小五臟俱全做完它你對SpringBoot、Vue、MyBatis、MySQL整套技術棧的理解會從學過變成會做這種轉(zhuǎn)變才是最值錢的部分。最后再分享一個小技巧開發(fā)階段用Postman把每個接口的請求參數(shù)和返回結(jié)果整理成文檔前端對接時會給對方省下大量溝通成本。接口文檔不規(guī)范導致的前后端扯皮是我見過最消耗項目進度的事情沒有之一。把接口定義清楚、狀態(tài)碼約定好你會發(fā)現(xiàn)整個開發(fā)過程順暢太多了。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
极品色www影院| 老司机天天操| 亚洲激情四射| 成人性爱全视频观看| 久久久av爱| av爱爱爱| 日韩丝袜二区| 蜜桃臀一区二区aV| 人人看欧美性爱| 思思热在线cao| 97色在线| 东北女人的毛片| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 婷婷激情五月天小说网| 蜜臀人妻少妇久久在线观看| 69视频入口| 口爆综合网| 欧美色涩| 美美91成人国产精品欧美精品久久久久久久| 上床啊啊啊| 狠狠爱综合| 久久久91| 久久九七| 色婷婷电影| av中亚| 婷婷视频网| 欧美春色| 人妻精品综合中文字幕在线| 中文字幕后石码四区五区| 五月天激情网图片| 另类小说综合网| a片亚洲一本通视频| 亚洲无线码欧洲精品区别| 蜜臀久久一区二区| 国产高清成人mv在线观看| 一区超碰一区| 天天狠| av中亚| 99在线免费观看| 1024精品在线| 东京热熟女亚洲视频网站| 国产一区二区三区视频在线看| 人妻超碰青青草98| 国产乱弄免费在线视频。| 麻豆视频国产一区二区| 激情四射婷婷六月天| 亚洲精品无码成人久久久99 | 国产精品免费日韩| 人妻无码一区二区三区久久99| 91大学精品激情戏| 91色色色| 国产精品自在线发布| 人妻欧美| 伊人一区二区三区| 亚洲成人色情五月天丁香花| 91久久伊人婷婷青青草| 91黑丝在线播放| 国产激情在线| 囯戸精品高潮呻吟旡码| 天天综合亚洲综合| 天天躁日日躁AAA片李宗瑞| 色播五月婷婷| a在线视频免费观看| 精品欧美А∨无码黑人大荫蒂 | 亚洲aw毛茸茸在线| 亚洲日韩肥臀视频在线观看| 亚欧精品久久久久久久久久久| 国模无码一区二区三区在线| 国产高清MV操逼视频| 99热伊人| 亚洲色图超碰在线| 国产97视频| 精品人妻久久久久一区二区三区| 9美女超碰在线免费观看| 四虎免费在线播放| 麻豆视频国产一区二区| 最新三级网址| 7777欧美成是人在线观看| 啊v视频在线观看| 国产成人精品一区| 色色亚洲| 狠狠色婷婷7777久| 性欧美999| 肉丝网站91| 亚热日本熟女| 99无码| 中文久久| 免费综合亚洲中文| 欧苏综合色综合| 九九精品无码专区免费| 五月天大香蕉| 91激情国产| 高清国产无码av| 午夜欧美女人操逼| 亚洲AV免费在线| 国产性感在线观看| 综合大香蕉美。| 黑人免费福利视频| 又黑又大又粗| 国产精品久久久久9999小说| 大香蕉乱级| 九九热在线视频| 99精品在线观看| 亚洲综合69| 天天干天天舔| 一块操欧美性爱| 91狠狠狠| 国产高清MV操逼视频| 另类专区加勒比| 免费亚洲国产精品久久一区| 囯产乱伦一区二区三女 | 啊啊啊啊一区| 不卡av在线中文字幕| 亚洲精品国产av天美传媒| 91美女网站| 亚州国产精品乱| 狠狠久久手机视频精品| 综合九九| 久草视频制服诱惑| 午夜色婷婷| 三级日韩一区二区三区| 好湿好紧视频| ,国产乱人伦精品一区二区三区| 东京热毛片177b2viP| 超碰97在线中文| 亚洲精品久| 8050午夜少妇无码| 中文字幕一区二区日韩网| 九区国产| 日韩人妻精品中文字幕| 在线 亚洲 网爆 自拍| 久久鲁干| 乱伦日本色图AⅤ| 一起草三级AV电影在线观看| 久久久999| 国产久久久| 春色综合免费| 午夜综合在线| 久久综合久色欧美综合狠狠 | 国产风韵犹存熟妇三区| 九九热精彩视频| 欧美激情精品久久久| 日韩精品99999| 亚洲精品国产熟女久久久| av网站免费线看| 久操精品网| 免费国产| 九热大香蕉| 葡萄牙性视频一二区| 殴美,日韩国产伦精品| 中文字幕三四区| 天天操人人操骚逼网站| 综合色图,成人综合网| 乱伦日本中文自拍| 欧美综合中文| 亚洲狼狼干综合1| 强奸乱伦免费网站| 天天操天天日天天干| 操操啪| 超碰无码加勒比| 亚洲精品熟妇1区2区3区。| 日韩欧美国产一区二区三区四区| 亚洲精品久久久久久久蜜桃臀| 91精品婷婷国产综合久久竹菊| 任你草| 欧美专区日本专区| 伊人久久综合影院精品久久久| 老女人碰碰在线碰碰视频| 无码精品一区二区三区潘金莲| 国产高清不卡视频| 日韩丝袜人妻AV| 日韩人妻少妇 一区二区三区| 国内精品嫩模A∨私拍小视频| 超碰97欧美在线| 日本午夜久久电影| 91麻豆天美国产欧美日| 国内91熟女人妻丝袜天天精品视频在线| 亚洲中文字幕三级在线| 九九久久首页| 打av高清| 极品后入免费视频| 久热久操| 日本不卡三级网在线播放| 色五月网址| 99热伊人| 欧美淫乱视频| 97超碰9| 78精品| 强奸乱伦免费网站| 内射小黄片| 99精品综合久久久久五月天| 超碰在线免费一区二区三区| 丁香九月婷婷| 人妻少妇精品久久久久久| 亚洲欧洲综合| 中文字幕国产| 亚洲欲色9532548967一区| 婷婷五月天久久久| 粉嫩AV一区夜夜嗨| 97人肏| 成人片视频| 97色操| 国产精品美女久久久久久网站| 日本中文字幕不卡视频| 五月丁香六月婷| 欧美|91色综合| 久久久久久久久久久久九| 91亚洲人| 久久国产精品91| 久久精品视频28| www.人人摸在线视频| 三级日本一区二区三区| 婷婷影院入口| 亚洲。日韩。欧美| 東南亚性呦成人伦理资源在线视频| 婷婷av在线中文字幕| 人妻天堂综合网| 凹凸视频在线一区二区| www.五月天| 2019天天操天天爽天天拍| 中文字幕AV片| 婷婷亚洲综合| 色网1| …中文字幕亚洲乱,97人妻无码费视… | 91久久青青草原精品| 密乳AV免费观看| 毛片中心9视频99| 天堂网亚洲区手机版| 3PAV乱伦视频| 精品人妻一区二区三区-国产| 曰本熟女视频| 人妻欧美| 国产又大又硬又长又粗| 97在线观| 亚州综合图片| 天天色播| 亚洲97网站| 乱色视频中文字幕| 热热色青青草| 1024日韩| 日本操大逼| 夜夜操夜夜高潮夜夜爽国产精品区| 超97在线精品视频| 亚洲drav色图| 国产尹人在线视频免费| 91看黄片| 日日骚精品视频| 国产超碰| 国产精品女生av| 9久久久久久| 夜夜 中文视频rt| 天天激情干| 欧美第二页午夜| 色婷婷狠狠| 国产女人与拘做受视频免费| 97超碰无码网| 综合亚洲欧美精品日韩?v| 国产亚洲欧洲在线观看| 婷婷丁香六月| 一级毛片久久久久久久女人18| 欧美在线|亚洲| 精品九九九九九| 免费亚洲国产精品久久一区| 九九热九九热| 色色五月婷| 久久九九国产精品| 人妻81p| 日韩一级二级三级免费看完整版| 乱理日韩中文| 宅男91视频在线播放| 毛片一区二区| 欧美成人免费在线观看| 啪啪AV导航| 91性高朝久久久久久久久| 九九九国产精品| 日本熟妇精品九九| 欧美国产视频| 色娱乐色呦呦夜夜夜夜av| 日韩有码免费视频| 99国内精品| 中文字幕 码 自拍 视频 区| 人妻日日干| 国产精选三级在线观看| 一级黄色牲爱A级片| 久久欲| 把腿张开老子CAO烂你| 欧美精品1区2区3区| 天天视频综合在线观看视频| 黄色一区二区秘书性感| 狠狠综合网| 中文字幕成人| 欧美黄色图片| 五十路熟女,国产欧美精品区一区二区三区| 伊人网在线视频| 亚洲天堂美臀在线| 超碰在线91| av激情亚洲五月天| 欧美A片中文字幕| 欧美A片中文字幕| 国产a级午夜毛片| 亚洲国产精品久久久久婷婷青年| 亚州色国| 午夜视频久久久| se吧提供91精品国产91久久久久久| 国产精品一区二区手机看片| 91午夜无码| 婷婷久久综合久| 9久9久| 97精品| 丰满高潮18xxxx| 欧美精品另类人妖xxxx| 天天操狠狠日夜夜干超大胆开放com大香蕉视频在线观看 | 97色色色综合网站| 亚洲中文字幕熟女| 国产精品蜜乳AV| 黄页大片在线观看| 亚洲毛片久久| 天天躁日日躁XXXXYY| 欲色影视综合吧| 国产sv美女内射| 亚洲精品天堂久久A∨51成人漫| 99热精品在线观看| 一区二区无码视频| 日韩精品在线观看网站| 青娱乐大香蕉| TS人妖另类精品视频系列 | 操逼操网| 欧美自拍网| 日本高清免费一本视频在线观看| 先锋色眉乱伦资源| 久污| 久热婷婷| 99在线精品视频| 99婷婷| 久久精品电影| 白丝1区2区3区| 精品久久久久久中文字幕三区| av中文在线| 五十路三区在线| 色嘟嘟人妻天堂网| 思思视频免费看网站| 超碰天天操你比| 熟女自慰久久久| 免费啪啪av| 国产精品久久久亚洲第一牛牛_在线观看| 思思性爱| 欧美乱伦专区| 天天影视之亚洲综合网| 久草国产在线视频| 色婷婷一区二区三区久久| 久久9亚洲| 白嫩国模丰满一二三区| 欧亚性爱在线视频| 欧亚揄拍偷拍精品视频 | 亚州欧美在线| 日韩人妻精品久久久久| 日本高清_区二区三区| 麻豆成人影音在线| 国产妇女精品视频青青草| 欧美后进式| 熟女人妻一区二区三区| 国产精品久久久久久照片| 一级性爱视频免费在线| 女人综合网| 91女日逼| 欧美性色欧美| 一二三四区电影| 69AV女优男人的天堂| 亚洲宗合网| 四虎免费看黄| 伊人国产av| 开心婷婷五月| 老色69| 亚洲欲色9532548967一区| 久久精品小视频| 探花精品视频| 色综合色| 992这里有精品| 免费A V在线播放| 超清福利精品视频在线| 欧美一区二区三区四区综合| 欧美日本中字另类在线| 伊人久久大香线蕉无码| 日韩人妻免费精品| 久热超碰| 色一射色一射| 欧美日本久久精品一区 | 亚洲最大成人a毛毛片| 囯产精品久久久久久久久久梁医生 | 青青草视频爽一爽| 91丝袜美女| 亚洲激情色片| 澳门色噜噜色噜噜色噜噜色噜噜色噜噜| 97亚洲中文| 国产精品日韩在线一区| 丁香五月天激情| 躁躁日曰躁2020| 中文子幕一二三| 欧亚日韩中文在线| 久久久久久电影| 久久婷五月| 男人久久精品| 国产免费黄色一级大片| 韩日精品四区| 亚洲操操操无码| 亚洲精品三区在线观看| 亚洲第一页欧美| 欧美成人贴图| 色99在线| 欧美综合91| 4141514逼喷水三级片| 久久成人东京热人妻| 国产无码久久高清| 色妹子A V| com 首页 18岁 禁区 女优 免费 精选 同城| 清纯唯美亚洲综合| 丁香五月天视频| 亚洲加勒比色图| 十八禁视频网站| 997色在线| 黄片免费久久久久久久| 香蕉色网| 九九色图| 欧美综合亚洲综合| 打av高清| 综合五月婷婷亚洲一区| 97国产中文| 激情啪啪拍91| 欧美色综合网| 97综合在线观看| 最新无码国产| 俺也射| 国产亚洲99久久精品| 思思久热在线精品66| 伊人操操| 伊人久久88国产女| 在线播放免费av福利片| 粉嫩久久久极品| 天天综合在线4| 亚洲囯产精品女人久久久| 久久9免费视频| 国产这里只有精品| 加勒比久久综合网高清| 亚洲脚交| 爽爽淫人网| 国产亚洲精品农村妇女| 91精品丝袜久久久久久| 天天α片| 极品粉嫩一区二区| 色婷婷亚洲婷婷| 风流老熟女一区二区三区l| 91精品导航| 美女大乳久久久久久久女人18| 免费在线观看AV无码网站| 欧美Ⅴ性爱| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 女同在线视频一区| 久久精品国产亚洲AV高级北京| 日曰骚久久精品| 亚洲熟女乱综合一区二区三区| 日韩草久视频| 色色五月婷婷| 欧美激情综合| 国产成人精品日本亚洲语言| 天天干夜夜一操| 欧美日韩不卡a片| 人妻9117c| 麻豆久久精品亚洲精品88| 婷婷五月天激情四射| 一区二区视频在看| 亚洲欧美综合| 午夜视频黄| 欧美视频一| 国产精品视频内谢女人| 日韩成人性日韩成人性爱视频在线免费观看 | 黄资源| 日韩在线97| 精品九九九九九九九| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 色综合一区二区三巨| 欧苏综合色综合| 婷婷激情啪啪| 黑人与人妻| 亚洲精品国产av天美传媒| 伊人久久大香蕉线AV五月天| 中亚黄色三级大片| 操一对老熟妇爽上天视频| 蜜桃av色偷偷av老熟女| 超97在线精品视频| 婷婷九月色| 色九月综合| 歐美性天天| 日韩91网| 午夜亚洲国产理论秋霞| 天天插天天插| 亚洲激情深爱文学小说网站| 国产suv精品一区| 另类天堂| 992这里有精品| 亚洲人91| 免费福利视频中文字幕| 色呦呦、国产精品| 男人天堂导航| 肉嘟嘟www视频在线观看高清| 五月激情综合网| 青娱乐手机日韩在线视频| 欧美人妻少妇| 亚洲丝袜色| 大香蕉99999| 五月激情小说| 熟妇高潮二区三区| 亚洲精品无码久久AV| 极品丝袜无码| 影音先锋少妇| 在线 制服丝袜中出 人妻| 91欧美情色| 自拍偷拍2025在线观看| 成年人免费观看网站| 久久久一区二区三区三州| 熟妇人妻精品一区二区视频色欲| 在线中文字幕视频| 999日韩中文精品观看视频。| 女优大全 - 91n| 天堂精品小草| 亚洲无码一二三区| 超碰无码五月97| 日本一区二区不卡精品| 亚洲欧美日韩中文久久自慰| 蜜桃av综合网发布| 久操免费在线| 97久久久精品| 亚洲日韩精品在线播放| 久久久久久久97| 中文字日本乱码| 日韩无码黄色片| 日少妇视频| 久久最新视频免费观看| 成人无码影片视频在线| 東南亚性呦成人伦理资源在线视频| 久9热| 精品丝袜无码一区二区三APP| 老熟妇一区二区三区啪啪| 第一高清av中文字幕| 亚洲成a人v欧美综合天堂下载| 操B久久| 综合色99| 天天视频黄网站| 亚洲精品九九九| 骚鸭AV| 青青草国产盗摄一二三区| 成人综合久久精品色婷婷| 成年人黄色视频免费| 91n.欧美| 91青青在线视频| 欧美午夜色妇色鬼| 日韩精品三区四区| 91狼人| 99国产精品视频尤物| www国产无码| 精品日韩产品在线,日韩在线不卡视频,欧美日韩免费专区/久, | 久久精品老司| 伊人网在线观看| 超碰中文字幕人妻草一区| 天综合网| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 午夜福利合集| 日日夜夜骑| 久久超碰com| 色噜噜国产精品视频一区二区| 欧美一二在线| 福利一级版子| 九九九精品色乱九九九| 夜夜黄| 中文字幕蜜乳av| 欧美极品美女aaaaaa级黄片| 熟妇综合一区二区三区| 无码137片内射在线影院| 成人精品无码| CCYY草草影院地址入口| 欧美另类精品xxxx| 国产亚洲日本精品在线| 天天干少妇| 麻豆影音天美视频| 青木玲在线不卡| 96久久久久久久| 国产精品亚洲色婷婷久久久| 奇米狠999| 亚洲 欧美 手机在线观看| 日本一本道A级黄色毛片试看60分钟| 91狼人| 亚洲中文字幕妇伦久久| 久久久久921| 亚洲天堂男人天堂网| 午夜120视频在线观看| 国产超碰| 久久久久ab| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区 | 日韩在线地址一| 巨爆乳肉感一区二区三区竹菊影视| 欧美图片偷拍| 亚洲午夜精品久久久中文影院| 欧美Ⅴ性爱| 日韩成人性爱AV| 一区二区三区日韩欧美 | 久久久久久久78| 久久专区| 午夜精品久久久久久久男人的天堂| 骚逼一区二区| 中文字幕AV乱伦| 高清不卡一二三区视频......| 台湾佬大香蕉| 久综合网| 中文字幕成人乱码熟女精品国50 | 国产呦精品系列在线观看| 日韩中文字幕二区| 久久精品国产97欧美精品亚洲| 午夜激情成人在线观看| 欧美亚洲厕所精品偷拍91| 黑人白女精品一区| 亚洲网自拍| 为用户提供免费看黄网址在线观看| 蜜桃在线观看一区二区三区 | 人妻精品一区一区三区蜜桃91| 日本东京热加勒比久久| 97久久精品国产| www..com操老师| 国产AV天美传媒一区二区三区 | 欧美乱伦专区| 亚州 综合 色图| 操比国产| 91精品国产91久久福利| 超碰97首页| 亚洲国产欧美中文永久| 91成人无码| 91美女视频在线| 色综合五月天| av日韩国产一区二区| 91男人天堂网| 久久久97| 国产操偷| 欧美天天弄| 蜜臀久久99精品| 翔田千里av一区二区三区| 国产精品无码成人精品| 中文字幕精品码亚洲| 韩国三级三级BD在线| 大黄片做爱的大的| 9久在线视频只有精品| 天堂综合| 呦女网站| 超碰人人乐97| 91人妻精华帖| 日本人妻最新在线中| 国产suv精品一区二六| 亚洲综合性网址| 91网亚洲| 久久久久9久久久久| 郑州宾馆老熟女露脸啪啪| 亚洲一区日韩精品中文字幕| 99rre在线精品99re8| 狠狠五月天| 不卡超碰护士AV在线免费播放| 日本操BAV| 日韩黄色一区二区三区| 午夜一区二区三区国产| 青椒国产97在线熟女| 一二三四视频中文字幕在线看| 97超碰人人操人人操| 久热最新在线杭州| 黄色AV免费| av影片在线观看不卡| 日韩欧美亚洲自拍偷拍| 国产白丝AV| 999综合网| 国产激情视频一区区三区| 成人精品无码| 日韩中文字幕人妻视频| 久久精品中文字幕观看| 亚洲成人黄色在线观看| 黄色人人| 色婷婷色99国产综合精品| 激情AV| 91九九九小逼| 秋霞午夜视频一区二区| 国产女人9999| 久久久精精精| 波多野结衣AV无码一区| 亚洲啪啪性视频| 久久精品小视频| 夜夜操老骚逼视频网站| 婷婷九月国产| 精品综合久久久久久五月天| 久久久久亚洲Aⅴ无码| 欧亚在线视频| 青青操97| 天天日天天舔东京热 | 72av视频| 老司机射| 另类视频在线| 国产亚洲精品A在线观看下载| 国产av强奸美女| 五月丁香六月激情| 精品十八在线观看| 日韩亚洲国产视频| 日韩熟妇二区| 午夜一区| 亚洲成A∨人影院在线欢看| 久久久久久久久九九久孕交| 亚洲中文字幕一区| 久久av成人无码免费| 玖玖资源中文字幕制服丝袜| 青青草毛片| 国产成人精品日本亚洲语言| 爱妻综合网| 亚洲无码国产精品久久| av天堂影视中文在字幕在线中文 | 亚洲熟女少妇免费视频| 欧美日韩国内不卡| 亚州综合AⅤ| 无码人妻一区二区三区色欲aⅴ| 久久蜜桃综合网| 午夜小电影在线插入淫高潮| 99热自拍| 十八禁黄色| 精品伊人久久久大香线蕉小说| 天天夜夜rb| 亚洲限制级在线| 在线毛片片免费观看| 色综合中文字幕不卡| 亚洲一区在线观看欧洲| 夜夜高潮夜夜爽高清视频一 | 龙兴卡官方查询| 日本五十路熟女一区二区| 亚洲人妻一区二区三区| 99re视频在线播放青草| 亚洲男人天堂2016| 超碰在线欧美性爱激情| 黑人精品久久97| 无码 黑人一区二区三区| 一区,二区,三区视频| 日韩不卡a级视频专区| www被窝色com| 色五月综合| 最新中文字幕在线亚洲| 999热这里只有精品| 欧美激色| 亚洲国产综合久久天堂| 婷婷AV一区二区三区| 色97综合中文字幕| 一本一首道人妻少妇免费久久| 国产专区第一页| 校园春色 亚洲| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 婷婷超| 91 偷| 午夜亚洲| 国内一区二区三区| 97爱亚洲综合色| 九色97| 99热成人| 五月综合视频| 久久婷婷综合国际产色怕| 美女诱惑久久| 国产成人精品网站| 欧美96交| 亚洲日韩电影| 校园春色五月天| 欧美翘臀视频网站一区二区三区| 51一区二区三区| 九久久九九久视频| 久久精品国产精品亚洲艾通辽熟妇| 成人午夜无码视频| 超碰超碰超碰超碰的大鸡吧操黑丝袜 | 久久久久久97| 亚洲情色五月天 | 欧美色五月| 日韩99999| 不卡码视频| 精品对白久久不卡| 欧美极品女人的天堂| 久久精品黄色| 日韩av色图综合| 思思热久久成人| 97干综合网| 人人射人人操人人摸| 99精品综合久久久久五月天| 国产毛片精品一区二区色欲黄A片| 亚洲激情在线观看一区| 9999九九九久久久| 国产少妇与亚洲av| 人人贴人人摸| 黄片免费日韩| 美女AV一区二区| 大香交伊人网| 操逼操网| 国产毛片在线| 大香蕉综合网| 加勒比av网| 亚洲情色一区综合| 操狠狠| AV一区观看| 欧美天天综合网版| 少妇熟女视频一区二区三区| 欧美 亚洲 另类 综合| 五月天社区| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 夜夜嗨免费视频| 又黄又粗又硬又长又大| 国模一区二区三区| 国产92麻豆天美精品色欲5| 亚洲图片色图欧美另类| 亚洲欧洲自拍图片专区满春格| 91色s| 中出789在线视频| 欧美一区二区在线资源| 亚洲人在线| 久久精品国产99国产精品亚洲| 这里只有精品久久| 啊视频在线| 亚洲成人免费在线| 夜夜草网站| 国产亚洲 中文欧美久久| 亚洲五月婷婷| 天天射,天天操,天天爽-国内精品一区二区三区-成人AV | 殴美大黄片| 六月色婷婷| www…国产操逼| 强奸乱伦日韩AV| 国产成人精品亚洲日本| 日本精品一区三区| 久操综合在线| 97视频在线观看高清资源| 日韩精品国模| 亚洲中文字幕一区二区| 噜噜噜亚洲精| 欧美成人一级麻豆| 国产女人和拘做爰视频 | 加勒比少妇AV婷婷六月天超碰超碰| 亚州欧美综合| 老熟女网站| 伊人久久婷婷| 国产精品熟女九九九| 亚洲欧美日韩中文久久自慰| 欧洲精品一级二级精品综合视频综合| 欧美黄页| 亚洲欧美在线观看2021| 一起草av| 人妖欧美一区二区| 国产精品视频麻豆入口| 欧美日韩国产在线| 国产精品色约约| 黄片国产精品一区二区| 婷婷丁香六月天| 久9久9精品| 国产乱伦视频污| www.超碰| 人妻激情在线视频| 无码一区二区精品视频久久久春药| 超碰在线国产| 老熟女91av| 亚洲久久天堂| 久精品无码av一区二免费国产在线观看| 啊啊啊啊嗯嗯嗯用力好爽 | 色官网在线| 俺去啦自拍| 人人操人人大香蕉| 91激情国产| 3p国产欧美99热| 国产91美女视频| 九九色热| 亚洲天堂一区二区| 久久久国产三级黄色片| 破处bbq| 强奸乱伦大香蕉网| nuu12国产麻豆精品| 欧美一级A片在线看视频性色| 啊啊啊啊啊啊啊在线| 99久国产精品午夜性色福利| 三级片网站在线播放| 极品人妻少妇综合| 欧美精品成人亚洲| 免费a v| 77国产精品| 国产自偷自拍一区| 97超级久久| 91色艳| 国产三级资源在线观看| 欧美高潮| 丁香婷婷久久 | 欧美色就是色| 亚洲天堂人妻一区二区| 亚洲美女AV无码| 色老牛| AV九九| V A在线| 色综合久久夜色精品国产天堂| 精品亚洲国产成人精品| 美女主播色欲91抠b在线播放| 天天做天天爱夜夜爽毛片试看| 乱久久久| 伊人色综合超碰| 91蜜桃婷婷狠狠久久综合9色| 欧美加勒比| 骚女高跟AV在线| 东北丰满熟女国产一区| 久久欧美激情| 国产精品动态一区二区三区四四| 精品熟女一区=区三区| 99久久久99久久91熟女| 操b在线观看| 国产美女高潮视频| 91精品人妻一区二区-全集完整版免费正片国语-B02AV | 欧美日韩另类激情图片| 三上制服丝AV| 色婷婷电影网| 精品一区二区人妖| 色哟哟综合| 蜜桃狠狠色伊人亚洲综合网站| 国产日本顶级一区二区三区| 东方亚洲在线操逼天堂| 伊人天堂在线| www超碰| 色情五月综合婷婷| 久久精品欧美一区二区三区不卡| 91久久久亚洲| 久久男人天堂| 色吧5亚洲| 日韩欧美亚欧在线视频| dy888午夜老子影视达达兔| 热热色91| 亚洲国产精品9999在线观看| 日本爽爽爽爽爽爽免费视频| 夜夜天天噜狠狠爱2021| 十八禁成人网站在线观看| 色哟哟 日韩精品| 亚洲欧洲日韩天堂av| 国产综合久| 天天综合网91| 日本性交操一区二区不卡系列| 亚洲国产精品有声| 日本一级性爱| 久久人妻办公室视频| 欧美老熟另类| AV色五月| 91成人18| 人妻中文字幕日韩电影| 日本免费不卡二区| 久久久久9999精品九九九| 青青草导航在线视频| 日韩国产精品人妻无码久久久| 熟女五十路一区二区三| 亚洲天堂AV在线播放| 中文一区二区婷婷视频| 久久久久密臀视频| 久久三区四区| 网页导航五月天免费一二三区| 福利色色| 欧美后入视频| 神马久久久久久| 在线看的av| 江都AV在线| 久久精品视频一区三区小泽玛利亚| 亚洲诱惑天堂| 麻豆AV一区二区天美传媒| www.91理论| 天美传媒AV国产在线| 欧美日韩亚洲天堂| 亚洲成?V人片在线观看福利| 中文字幕视频一区视频二区| 色爽——AV| www久久国产精品| 欧美人妻精品| 大香蕉狠狠爱| 波多野42部无码喷潮在线观看| 国产有码一区| 乱伦熟女论坛| 亚洲天堂人妻一区二区| 欧美亚洲天天| 无码伊人久久大杳蕉中文无码| 国产AV天美传媒一区二区三区 | 婷婷超| 激情色色| 免费成人自拍视频在线| 91精品电影18| 午夜九九九九九九| 伊色综合天堂色97| 亚洲激情视频| 国内91熟女人妻丝袜天天精品视频在线| 色色九区| 久久a久久| 伊人久久综合影院| 国内黄色精品| 欧美五十路熟| 中文字幕视频免费| 五月香婷婷| 精品久久久av无码免费| 欧美中文字幕一区 | 五月丁香激情综合| 四虎884| 自拍偷拍亚洲熟女妇人精品| 91少妇香蕉久久精品| 约操熟妇| 亚洲Av诱惑| 天天干天天日天天射黄色片| 超碰97精品| 亚洲一二三| 十八禁网站在线| 九九九精品成人免费视频小说| 老熟妇一区二区三区啪啪| 伊人色综合网| A级国产欧美激情在线| 97操碰| 亚州色国| 中文字幕高清20页视频| 免费啪啪一级视频| 怡红院成人视频| 91国产大片| 国产精品熟女AV中文字幕在线播放| 中文字幕乱在线伦视频中文字幕乱码在线 | 九九国产| 91麻豆天美传媒HD| 亚洲欧美国产日本一区二区三区| 亚洲综合第一页| 91 丝袜在线播放| 97jingpin| 搞中出视频在线观看| 67914在线精品观看| 日本网色| 精品一区二区综合熟妇| 乱伦Av网| 久久精品国产AV一区二区三区| 蜜臀久久99精品久久久久| 国产精品农村妇女精品| 欧美色图91p| 国产精品夜夜夜| 欧美午夜视频| 内射卯月麻衣| 欧美综合网站999| www.操| 色臀aV| 亚洲麻豆18发?| 欧美暴力猛交| 亚洲国产精品久久久久婷婷老年| 色欲人妻一区二区在线| 青青操青娱乐| 亚洲人妻熟妇三十三区| 日韩精品人妻系列无码天堂| 久久鲁夜| 日韩在线人妻网站| 免费草草草草草视频| 一区二区三区看视频| 熟女熟妇一区二区三四区| 清纯唯美亚洲综合| 美女高潮国产高清| 亚洲AV麻豆Aⅴ无码电影一| 亚洲成人免费中文字幕| 国产操操日韩三级黄| 久久久草成人网站久久久草成人久久久草久久久 | 超碰95| 日本女优在线视频福利| 久操热| 超碰97最新人妻| 欧美在线|亚洲| 啊啊嗯嗯好爽| 这里只有精品视频在线观看麻豆| 99在线免费公开视频| 无码国产精品午夜不卡(| 久久精品欧美一区蜜桃| 欧美人人天天网| 可以免费看黄片的视频| AV电影在线播放| 一区二区三区网站日日骚| 亚洲天堂久久| 人人操肉肉| 看看小穴| 日本幼女18+| 岛国在线一区二区三区| 国产无马av| 精品国产国产AV| 99这里只有精品国产| 99热色精品| 欧美后入式| 国产AV久久久蜜爱影集| 欧美色图97| 婷婷色色五月天福利| 婷婷五月天在线观看| 人妻91少妇| 久精品无码av一区二免费国产在线观看 | 蜜臀久久99'精品久久久| 操久久久久| 黄色片大香蕉| 麻豆久久久久久久久丝袜| 大香蕉中文网| 少妇蜜汁| ji熟女.com| 中文字幕久久亚州无码| 中文字幕乱码人妻二区三区| 久久久久久久久久久久久久久久9| 中文乱码字幕观看| 99性爱| 九月伊人中文字幕| 日韩欧美国产一区二区三区四区 | 亚洲成人精品在线一区| 亚洲宗合网| 综合久久六月久久婷婷| 超碰在线成人电影| 依人大香蕉| 艹我哪美一区无码| 超碰九7免费| 精品网站99999| 91GD.COM| 91一区二区三区蜜桃| 天天欧美欧美亚洲网| 97爱| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 日韩性爱1级片视频| 超碰97国产欧美| 中文字幕一区二区三区视频播放| 不卡在线观看视频| 久草精品一区 | 思思99热| 怡红院成人视频| 欧美在线啊啊啊| 五月丁香综合| 色嗨嗨在线| 亚洲男人天堂视频| 婷婷丁香六月天| 丁香成人五月天| 中国一级操逼视频| av中亚| 97久久国产亚洲精品超碰热| 日本99一区二区| 婷婷色一区| 丁香九月婷婷| 99亚洲天堂| 无码伊人久久大杳蕉中文无码| 琪琪精品免费一区二区三区| 国产久久久久久| 日本男人天堂| 欧美色图99| 日韩综合97P| 日日噜噜夜夜久久亚洲一区二区 | 首页中文字幕中文字幕免费| 免费αⅴ在线观看| 亚洲成人性爱网站在线播放| 操婢日韩| 久久久亚洲欧美综合| 国产精品久久蜜乳av| 97超碰9| 久久久久久九九九九| 少妇天堂| 射综合网| 极品销魂美女一区二区| 欲香欲色| 国产精品欧美日韩久久| 久久av一级av少妇av高潮 | 国产67194| 尹人大香蕉视频在线| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 欧美日韩人人早|