久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码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
返回資訊列表
青青草啪啪网| 五月天激情影院| 国产丰满熟夫69mpp| 亚洲啪啪视频免费| 天天看特黄的免费网站| 亚洲乱熟女一区二区三区大香蕉| 国产无码三级视频在线观看| 亚洲色电影在线| 欧美v日韩欧亚洲电影天堂色诱,国产传媒| 色色色日本| 大干人妻| 欧美国产成人在线| 人妻啊啊人妻啊啊| 操逼视频亚洲| 日韩中文字幕国产| 五十路熟女人妻一区二区在线观看 | 天天操天天插| 日本国产高清色www视频在线| 超碰97久久| 91亚洲欧美综合高清在线| 欧美日韩夜夜| 睡产熟女乱伦| 国产色精品午夜大片| 亚洲成人ab| 老女人老91妇女老热女| 91啪啪| 色噜噜综合网| 午夜黄色免费在线观看| 日本日逼高清| 99亚洲国产精品色一区二区三区| 伊人午夜福利视频| 熟妇人妻一区二区三在线| 日韩人妻资源在线看| 日本午夜福利影院| 久久精品国产亚洲AV无码电影| 伊人91| 欧日韩在线观看| 亚洲。日韩。欧美| 亚洲国产精品久久久久婷婷青年| 99精品无码| 色噜噜精品一区二区三| 秋霞欧美性爰视频| 五月色网| 婷婷五月天社区| 性做久久久久久免费观看软件| 免费的黄片有限公司| 天堂v无码免费视频| 亚洲图片小说欧洲| 三上悠亚在线毛片91| 99中文字幕| 欧美色图亚洲色| 91情色在线| 蜜桃色院一区久久| 久热大香蕉网站| 粉嫩少妇自慰在线| 国产午夜福利合集| 国产日韩美女小穴视频网站不卡| 久久久久久久久久9| av日韩中文字幕| 五毛骚逼极品美女怕怕| 亚洲好色人妻| 亚洲熟妇一,二,三期| 欧美日韩国产成人高清| 欧美精品一区二区少妇免费A片 | 国产9 9在线 | 亚洲| 超碰国产精品无码| 亚洲成?V人片在线观看福利| 丁香五月成人| 污到发麻的视频 国产| 黑丝91视频| 99热只有这里有精品| 亚洲乱熟女一区二区三区大香蕉| 亚洲不卡不卡中文字幕不卡| 97操在线| 欧美色狠| 国产精品午夜高潮呻吟久久av| 日本3级一区二区免费| 五月综合久久| 色五月天AV| 天天操天天7| 男女啊啊啊啊啊| 综合久久久久久久久91| 亚洲精品一二牛牛| 操操操日本的逼| 综合欧美日本三级| 啊啊啊啊二区好大| 丰满少妇精品一区二区| 麻豆国产97在线| 国产www色在线观看| 国产激情av女片自拍| 欧美美女自慰一区二区三区| 一区二区视频你懂的| 欧美日韩制服| 欧美亚洲色图另类国产| 欧美成人都市人妻| 日韩精品大香蕉伊人在线| 97av在线观看| 5278欧美一区二区三区| 91精品成人| sewuyueav| 久操com| 久久久久人妻| 日韩91网| 亚洲无码?第一页| 国产按摩一区二区三区| 九九九九一区| 亚洲国产精品成人无码久久久| 亚洲男人天堂Av| 91影视亚洲| 欧美色www亚洲国产阿娇要播| 偷窥自拍A片| 免费看污网站| 日产操逼| 日韩三级网址| 成人怡红院| 伊人专区一区二区三区| 色网在线| 国产精品午夜高潮呻吟久久av| 大香蕉啪啪啪啪在线| 伊人91| 五月天婷婷基地| 人妻少妇久久中文| 亚洲成a人片在线观看中文!!!| 九月丁香婷婷| 农村妇女精品一二区| av无码精品久久久久| 少妇一区二区三区在线观看| 久久少妇| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 色踪合AV| 无码日韩人妻av一| 青青伊人加勒比海| 亚洲精品官网在线观看| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 亚洲丁香花色| 日韩99999| 亚洲激情久久| 美女黄网| 欧美日韩另类字幕中文| 激情色播| 热热色中文无码| 7月婷婷综合| 欧美夜夜草视频| 亚洲自拍欧美国产首页网曝| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 三级三级三级a级全黄三| 熟妇艹鸡八| 中文字幕,人妻,日韩| 97精品97| 在线观看综合精品亚洲| 久久九操在线观看| 免费视频a级毛片免费视频| 大香蕉92| 超碰在线91| 欧美另类丝袜熟女| 97视频在线观看播放与子乱对白在线……| 免费操逼91| 色综和网| 亚洲成人av色网| 狠狠爱综合网| 青青草在线视频美女| 五月丁香六月激情| 在线观看中文字幕| 男人天堂久久精品不卡| 蜜桃色色网站视频三区| 欧美日韩97| 96AV久久久| 国产免费操逼| 欧洲站一级二级三级h| 夜夜操天| 色五月大香蕉| 制度丝袜99| 理论久久婷婷网8| 精品国产乱码久久久久久影片| 毛片久久| 超碰 欧美| 色五月婷婷网| 欧亚性爱啪啪| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 粉嫩AV输入| 综合熟女| 强奸抽插av| 亚欧操逼片在线观看| 欧美亚洲激情小说| 婷婷色婷婷| 国产野战露脸在线播放| 精品国产Av无码久久久伦古装| 91丝袜在线视频| 嗯嗯嗯好爽| 久久国产AⅤ| 超碰色美女| 超碰97资源中文字幕| 亚洲国产无码精品首页久久久| 草草电影院| 国产AB视频| 亚洲淫乱骚妇AV| 欧插网站| 五月婷婷激情网| 日韩精品1区2区中文字幕| 日韩一级欧美一级国产一级台湾| 久久伊人在线五区| 色情五月综合婷婷| 性爱综合一区二区| 超碰97亚洲| 操死我了嗯嗯嗯| 在线 制服丝袜中出 人妻| 曰韩操B| 97欧美视频| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | 在线天堂999| 色婷婷丁香五月| 18禁的网站在线| 内射夫妻三片| 欧美日韩国产另类综合| 男人a天堂手机在线版| 96久久久久| 久热这里| 超碰97人人乐| 欧美亚洲首页| 久久综合97| 91模特在线观看| 黑人干亚洲| 在线小说视频一区| 青青伊人加勒比海| 日韩人妻精品| 九一综合网| 射 色综合| 男人的天堂亚洲| 午夜免费视频1000| 国产高清成人传媒影视| 91色情黑丝搞鸡在线观看一区二区三区三州| 国产成人www免费人成看片| 黄色在线网站| 精品中文字幕第一页| 欧美aa一级片| 日韩精品永久在线观看| 国产99 中文字幕日韩小视频| 日本性爱不卡视频| 午夜色婷婷| 色婷久久| 91亚州欧美| 污污污8888| 91网站视频在线观看| 国产精品在线网站| 三四中文字幕| 91老熟女| 免费一级a毛片久久久久久鸭绿欲| 日本淫乱女一区二区三区视频| 自拍偷拍第26| 亚洲AV免费在线| 麻豆亚洲Av成人无码一区精品| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 成人小说视频在线精品欧美| 久久av成人无码免费| 天天日天天色| 九九亚洲精品| 久久九九97| 91欧美亚洲| 国产1024在线播放| 九九探花视频在线观看| 久久手机视直播| 亚洲一二三| 国产尤物在线三区| 92性色国产午夜福利在线661| 日韩欧美tv一区二区在线观看| 精品亚洲国产成人AV制服丝袜 | 精品人妻一区二区三区-国产精品 一个人在线看的黄色电影网站 | 神马午夜久久久| 丁香7月婷婷| 亚洲欧美另类小说| 91精品久久久久久77777| 北京专精特新企业招聘信息| 欧美日本视频一区| 九九九九热| 久久久久久AⅤ无码免费肉站 | 羞涩视频| 开心五月天激情网| 欧美日日人人天天| 天天插夜夜操| 亚洲、日韩、综合、另类| 亚洲色图第一页| 男女国产精品| 91美女丝袜诱惑视频| 日韩人妻精品| 欧美色性爱| 欧美久久草熟女| 男人天堂最新手机版在线青青草| 毛片久久| 操人妻丝袜高跟| 欧美综合色,www| 日本高清_区二区三区| 超碰97资源大奶| 国产一区在线播放| 五月色综合| 少妇特黄一区二区三区| 老司机深夜影院18未满| 日韩操呦呦影院在线观看| 欧美性性性| 激情五月丁香五月| 天堂亚洲精品| 成人丁香五月| 色综合大香蕉| 又黄又爽在线观看视频 | 免费自拍三级综合| 黑人与人妻| 91久久精品中文字幕| 中文字幕一区 二区三四五 区日 日骚| 久久久久深夜无码| 国产精品熟女乱伦| 新怡红院| 色99在线| 午夜爽爽爽| 久久超碰爱| 老熟女91| 欧美内射少妇| 久久久精品视频免费观看| 性九九九九九九| AV免费在线播放一区| 激情婷婷丁香| 能看的av| 国内精品嫩模A∨私拍小视频| 欧美少妇一区二区三区| av无线看| 激情图片伦理国产一区二区日韩| 9久久久久久| 中文字幕日韩国产传媒欧美精品| 国产精品成久久久久午夜午夜| 曰本精品久久久| 国产精品亚洲高清在线| 97精品中文字幕| 操逼网免费无码视频| 97综合激情| 久久久九97| 囯产精品久久久久久久久久梁医生 | 国产少妇与亚洲av| 国产精品久久久久无码Av网曝门| 人妻丝袜肏逼| 欧美麻豆成人同性GⅤ在线| 欧美,日韩,中文,另类| 色色色色电影网| 亚洲国产熟妇综合色专区| 男人下部插入女人下部| 亚洲无码AV九九九| 伊人天天久久动态图| 天天爽夜夜欢视| www.国产高潮精品| 欧美亚洲国产91在线| 韩国国产欧美情侣视频在线| 亚洲激情综合| 久久成年片色大黄全免费网站| 日韩精品国模| 天天射网| 国产成人精品日本亚洲语言| 97超碰人人操人人操| 四虎在线免费视频| 天天摸天天插天天日| 亚洲无992tv| 天天综合网~91综合网| 日韩乱码Av| 人人干人人搞人人摸| 日本韩高清无砖码22o| 亚洲日产专区婷婷| 青青草国产亚洲精品久久| japan日本高清乱xxxx| 60秒不遮不挡| 97精品视频在线| 国产一区麻豆免费观看| 天天射,天天操,天天爽-国内精品一区二区三区-成人AV | 国产 无码 一区二区| 亚洲97| 人妻激情视频| 97国产中文| 大香蕉色网| 天天射影院| 5278欧美一区二区三区| 国产欧美日本亚洲精品| a级免费在线观看| 精品玖九九久| 天天在线91| jiujiujiujingpin| 殴美牲| 日日干日日| 操逼日韩无码| 一级A啪啪啪啪| 青青久久手机线视频| 熟女激情综合网| 亚洲日韩电影| 少妇淫妇久久久久久久| 精品无码少妇| 78精品| 九九九不卡| 精品女同一区| 四虎精品亚洲| 国产精品女aA片爽爽视频| 超碰诱惑| 另类欧美色| 亚洲欧美激情小说| 欧美高清91| 日韩精品人妻中文字幕不卡乱码| 日韩精品影视| 美女91网址 | 凹凸视频特色日本特黄| 另类天堂| 中文字幕大片三级狠狠干| 大香蕉婷婷| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 日韩有码专区| 亚洲AV无码乱码| 91亚洲人| 欧美性爱18观看| 日韩性爱毛片操骚逼| 人人操人人搞人人草| 强奸乱伦中文字幕AV| 最新中文字幕精品在线| 国产一区二区三区精品观看啪| 囯产操逼片| 丰满的三级少妇欧美久久久| 97视频观看| 91网亚洲| 亚洲诱惑天堂| 无码人妻精品酒店| 在线国产福利网址导航| 亚洲色五月| 国产精品一二三区福利| 裸模AV女优| 九九九九九九九九九五码| 天天摸天天舔天天操| 国产av色网| 91老熟女| 熟女人妇一区二区三区| 日本 欧美 亚中文字幕| 女人的天堂大香蕉网| 男人天堂毛片| 亚洲天堂五月天国产| 91丨熟女丨丰满熟女| 天天色粽合合合合合合合| 欧美大香蕉97| www欧美91| 久综合国内精品自在自线| 免费在线观看AV无码网站| 97久精品| 国内外毛片在线观看| 91操操操操| 郑州宾馆老熟女露脸啪啪| 伊人激情| 久久精品99久久久久久| 亚洲情色综合| 91粉嫩萝控精品福利网站_精品影音先锋国| 欧美另类色图片| 日韩 成人 有码| 亚洲黄色| 91精品国产高清久久久久久,亚洲成人 | 成人三一级一片aaa| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 精产国品一区二三产品| 欧美色网络| 国产第25页在线观看| 中文一区二区婷婷视频| 国产97免费视频| 思思在线免费视频| 九九九九九九九九九九九九九九九女| 97综合| www.91色| 欧美激情亚洲| 精品一区二区成人动漫| 操少妞在线视频| 91大神精品长腿在线观看网站| 91蜜桃婷婷狠狠久久综合9色| 日韩欧美偷拍美女视频| 人人看人人插| 强上我不卡卡| aa片毛片| 乱日视频| 色吧5亚洲| 午夜呻吟欧美| 蜜乳成人AV| 91丝袜美腿网站| 九九热九九| 97色色视频| 91精品在线播放| 日韩性爱小视频在线观看| 亚洲精品一区二区免费在线观看| 国产女同视频在线播放| 欧美日韩少妇色情| 国产女人和拘做爰视频 | 亚洲视频1区| 啊啊啊啊啊在线视频| 人妻天天爽天天爽三区| AND人妻系列| J?P?NESEHD熟女熟妇伦| 淫色网综合| 激情五月综合开心五月| 国产天天看| 久久久久久精| 国产传媒美日韩av| 中文字幕一区电影在线观看 | 日韩 欧美 另类 人妻| 九九九九免费视频| 小情侣高清国产在线视频| 天天综合站| 立川理惠无码一区二区| 国产97亚洲| 天天色香欲综合网| 日本高清免费一本视频在线观看| 看黑人AV不卡| 黄网色一区二区三区四区精品| 久草综合网| 偷拍 精品另类 凸凹了四区| 欧美人人操人人插| 亚洲情色综合网| 97人人超| 啊啊啊网站| 中文字幕十五区| 另类小说综合网| 欧美色吧综合| 国产婷婷一区| av天堂5| 97精品视频| 男人的天堂日本东京热| 丁香五月激情综合| 影音先锋视频在线| 欧美综合亚洲综合| 亚洲美女 晚间男人天堂| 超碰成人最新最好看| 好吊色综合| 亚洲欧美setu| 久久人妻精品| 久久久久久久国产视频| 久久久久久久97| 久久熟女久| 综合五月天| 极品综合| 精品日日人妻| 亚洲AV不卡在线观看尤物| 又黄又爽在线观看视频| 人人干人人操人人..com| 久久只有精品| 桑老女人九区| 九九九九欧美| 欲色影视综合吧| 婷婷综合网站| 亚洲1区2区三区高清中文字幕| 国产深夜福利| 国语精品对白| 伊人精品国产| 伊人久久大香蕉线AV五月天| 精品国产乱码久久久久久影片| 国产三级多多影院2022国产AA一级毛片无码| 欧美亚洲今日在线| 久久久成人免费av电影| 久久人妇| 97久久免费| 99青草| 六月激情网| 婷婷激情五月天小说网| 亚洲AV无码翔田千里网站| 综合网91| 舔足天天操天天射| 亚洲图片 欧美电影| 日韩亚洲97| 精品国产72| 日本精品88888888| 91久久久久久久久久久| 日韩精品99999| 综合激情五月丁香| 中文字幕日韩综合| 中文字幕五区| 夜色五月天| 男人的天堂亚洲| 丁香六月综合激情| 九久9精品| 99热日本| 久久超碰爱| 91爽啪| 91碰碰碰| 日韩美脚一区二区网站| 蜜色网色哟哟| 美女久久久久久久| 国产极品久久久| 蜜桃色院一区久久| 欧美在线中M| 91欧美丝袜| 少妇久久久免费| 性感美女啊啊啊在线| 亚洲欧美变态| 久9无限国产| 97久久久| 日韩图区 偷拍| 视频在线观看免费一区二区三区 | 99国产精品在线观看| 一区,二区,三区网站| 久草资源在线视频官方总站日韩丝袜美腿 | 日本一区二区三区四区免费观看| 久久香蕉综合一本到3atv| 日本一级性爱| 欧美|91色综合| 中文字幕av久久爽Av| 色综合20p| 96国产精品| 九九九久久久| 亚洲中文一区二区三区| 亚洲五月婷婷| 干B| 强乱老妇中文字幕| AAAA级日本片免费视频| 口爆吞精在线观看| 超碰人人妻| 欧美日韩少妇色情| 亚洲天在线| 97啪啪| 乱伦1色页| 亚洲av在线免费观看| 97免费视频网| 人妻夜爽夜夜爽| 亚洲欧美国产va在线播放频| 亚洲欧美日韩精品久久久一区二区| 丁香五月影院| 91爰爱欧美| 欧美日韩精品久久久久久久久东北老熟妇| 色欲三区| 欧美日不卡| 中文字幕午夜精品久久久| 精品国产一区二区三区久久久蜜臀| 久久一二三四五六七八九区区区 | 欧亚揄拍偷拍精品视频 | 日本国产欧美一区三区二区| 懂色AV蜜臀无码精品APP| 欧美精品成人亚洲| 久久网亚洲| 成年人黄色视频免费| www.色婷婷色综合| 曰本91情色| 国产呦精品系列在线观看| 九九碰九九爱97超碰| 手机久操欧美综合色码| 国产97色在线| 3p国产色噜噜一区| 国产午夜视频| 黑人免费福利视频| 色色色网站| 欧美综合传媒| 欧美亚洲另类在线蜜桃| 大香蕉琪琪日本女优不卡| 立川理惠被中出无码 | 中国熟女91| 日小BB小视频| 欧美久久毛片基地| 色呦呦国产精品免费看| 极品五月天噜噜| 97日韩欧美亚洲| 日韩精品永久在线观看| 伦在线97| 久久黄色性爱视频| 国产成人AV麻豆| 亚洲美女AV无码| 嗯嗯啊啊视频在线看| 熟妇女伦乱视频| 99久在线精品99re8热| 曰本道人妻久久久在线不卡色视频| 国产成人综合在线播放| 免费网站观看www在线观| 熟女激情综合网| 国产白领连续中出在线观看| 啊啊啊想要| 超碰公开久久网| 不卡中文字幕aⅴ在线| AV老汉| 精品国产无码中文| 大香蕉综合久久| 成人一级性爱| 东北女人操比视频| 国人欧美精品一区二区| 中韩中文字幕在线观看| 亚洲最大91网| 网站A V在线| 亚州久久9| 人妻系列无码专区中文有码| 午夜九九| 天天射影院| 韩国一级做a久久久久| 97精品视频免费| A片A5445444| 亚州九九九精品视频| 久久久久国产一区二| 日韩无码第3页| 一本一道人妻久久一区二区三区 | 久久综合乱子伦国产免费| 国产无码三级视频在线观看| 欧美韩国你懂得在线 | 欧美爆操91| 东北丰满熟女国产一区| 精品少妇高潮久久| 日韩精品区二区三区不卡| 欧美黄色手机在线观看| 激情五月天校园春色网| 99九九精品| 九九视频黄色片| wuyechaopeng| 成人欧美一区二区三区黑人一| 综合伊人网12色| 91路www| 天天天天干| 欧美日韩国产一区二区小黄片大全| 99精品久久久久久| 999岛国大片| 在线中文字幕| 婷婷人妻激情| 97 国产一区| 大香蕉久操| 欧美精品23| 亚洲性刺激| 91欧美成人色站| 免费视频a级毛片免费视频| 黄片免费视频2019| 一卡二卡三卡| 成人五月天色网| 五月天成人综合| 欧美精品一区二区少妇免费A片| 精品成人久久久人人亚洲| 国产精品肉丝自拍| 91精品国产高清久久久久久,亚洲成人| 九九热re99re6在线精品| 日韩中文字幕宗合在线| 久久天天摸| 3p国产色噜噜一区| 日本欧美韩国国产在线| 国产精品乱码久久久久| 九九九九九九九九九九九蜜桃 | 免费操逼91| 素人伊尹大香蕉免费下载视频| 日韩人妻无码精品系列| 在线黄页看毛片| 日韩乱伦视频| 26UUU欧美激情一区二区| 国产精品九九九| 热热色中文无码| 久久精品一区一起草| 天堂伊人久久| 91偷拍欧美亚洲| 色久综合| 国产又色又爽又舒服的三级视频| 亚洲阿v天堂无码z2018| 春色91| 91欧美经典| 人人操人人精品影片| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 色嘟嘟人妻天堂网| 午夜免费福利视频一区| 日本国产欧美高清在线| 无码高清国产AV| 中文字幕五月婷婷免费| 美国日韩黄片| 中文字幕av亚洲精品| 日夜伊人网| 国产又粗又长的视频| 亚洲色图日韩丝袜制服一区二区五月在线| 亚洲大色鬼| 秋霞福利网| 97国产伦理| 青青伊人久久| 亚洲性少妇| 少妇内射www在线观看视频| 青青草在线视频欧美| 东北老女人的激情视频| 高清肉丝中文无码| 亚洲国产丝袜在线观看| 日韩不卡网操逼中文字幕日韩| 日日夜夜噜| 福利在线视频一区二区| 亚洲天堂电影网| 天天综合网合集91| 亚洲激情欧美色图| 欧美色蜜桃97| 人妻夜夜爽天天爽三区麻豆AV网站| 超碰在线一区二区三区| 女人天堂av在线播放| 国产成人超碰在线| 中文字幕精品亚洲熟女| 国产精品久久久久久久久久久久久久久| 欧美曰韩国产精品| 欧洲精品欧洲精品| 亚洲中文sv| 2019天天干| 国产福利在线视频网站| 操逼逼无码| 日本色婷婷| 中文字幕片| 男人的天堂久久狠| av天堂电影网| 日本操逼视频免费| av绯色| 91精品综合久久久久久五月丁香| 久久国色天香香蕉| 精品久久大胆人体| 亚洲天堂一区二区| 五月婷亚洲精品天堂| 一级性爱啪啪视频| 精品黑人一区二区| 亚洲不卡av在线| 久久精品成人一区二区三区蜜臀| 啊啊啊好舒服视频| 日日噜噜夜夜狠狠视频无| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 色五月AV| 成人八戒网站| 青草青青久久久久久国产| 自拍视频大全亚洲专媒视频/一区二区三区| 亚洲色图综合网| 九九亚洲| 国产亚州精品美女久久久免费| 色婷五月天| 97精品97久久| 人人搞人人插人人操| 欧美成人性爱视频免费观看| 久久黄黄| 久久久久久裸体| 亚洲性爱成人| 一起草av| 208天天久久九九九| 加勒比在线观看一区二区| 中文字幕永久在线| 在线观看午夜婷婷久久久久清性观看| 日日摸天天爽夜夜欢| 国产高清精品福利| 国产精品久久久777| 91美女视频在线观看| 91日本在线观看| 国产视频大全| 亚洲春色一区二区三区| 国产精品交换一区二区| 亚洲做性| 黄片aaaaa一区| 久久仑合| 九九九九精品精| 亚洲啪啪性视频| 欧洲精品欧洲精品| 国产精品久久妻无码网站| 欧美日韩性感| 东北熟女91| 开心五月激情网| 91网站视频在线观看| 蜜臀AV秘一区翔田千里| 日韩伦理久 久久 清纯| 97超碰中文在线| 120分钟婬片免费看| 久久精品六区| 免费在线观看国内色片网站网址 | 超碰97人妻在线| 精品一区二区三区蜜桃臀赵总 | 欧美国产精品| 一区二区三区四区久久视1| 日本影视久久免费| 九九热免费国产视频婷婷伊人五月 | 亚洲全色网| 97超级久久强资源| 人人操人人色网| 五月天伊人| 精品人妻中文字幕高清| 艳美熟妇先锋一二三区| 97视频网站| 91在线美女| 夜夜草天天| 欧美午夜色妇色鬼| 青娱乐国产剧情av一区| 亚洲三级网址久久最新| 51久久夜色精品国产麻豆| 麻豆婷婷成人一二三| 一个色导综合| 日韩精品电影| 天天天天天天天天天天干美女| 亚洲图片在线| 久操网线| 国产精品久久蜜乳av| www.91色综合| 男女啪啪网站免费视频| 91久久18禁| 中文字幕一二区二三区人妻专区| 欧美大色交| 久热91| 欧美大波激情xxxx| 我爱搞逼综合网| 岛国成人av在线播放网址| 无人区高清电影免费观看一区二区三 www.qmcai2.com | 久久综合婷婷| 波多野结衣之双飞调教在线播放 | 情色图区| 中文字幕55555| 亚洲黄色a级片| 人妻娇喘 激情视频| 按摩中文字幕| 日韩一区二区高清在线观看的| 久久人妻熟女一区二区| 亚洲蜜臀懂色| ?亚洲伊人伊成久久人综合网| 人妻少妇精品久久久久久| 91丝袜美腿网站| 国产www色在线观看| 欧美天天综合在线| 国产美脚女优尤物在线观看| 高清国产av无码| 中文字幕久久婷婷丁香五月天| 欧美最大综合网| 青青草视频久久| 曰韩操B| 香蕉综合网| 色男人色天堂东京热| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 91久久青青草原精品| 经典丝袜一区| 精品国产自在在线99| 免费伦费视频在线观看| 大学生美女口爆| 精品久操| 超碰综合色| 天天综合网站| 约操熟妇| 亚洲人妻在线精品| 安微少妇操BBB| 国产极品久久久| 亚洲男人天堂Av| 国产三区免费在线观看| 国产精品96久久久久久| 欧美 日韩第一性色| 久草色悠悠在线视频| 色久综合| 日韩激情啪啪| 日本熟女免费視颖| 亚州熟女乱伦| 精品久| 天天干18禁| 99re在线视频这里只有精品| 曰本熟女视频| 人妻精品综合中文字幕在线 | 2017天天透天天通天天擦| 久久久av爱| 人妻天天爽夜夜爽爽| 婷婷激情五月| www.人人cao| 日日操丁香五月天| 在线无码视频| 好色综合| 性无码专区2020| 夜夜精品视频| 人人妻人人爽| 乱人乱色一区二区三区免费| 日产成人久久| 99日免费视频中文字幕| 九九热在线精品视频| 青青欧洲黑| 欧美A√综合网 | 国产97色在线| 97这里有精品| 欧美色图20P| 国产美女91| 91麻豆天美国产欧美高潮| 91女优在线观看| 综合一区二区影视| 天天操天天日天天干| 新视频sss国产| 久久久久久久六六 | 亚洲中文国际强奸字幕| 无色无码| 人人摸.人人色| 色乱二区| 久草视频分类在线| 九九综合色| 天天操夜夜操| 91九久| 亚洲s在线观看| 91红杏| 日韩美女高潮喷水视频| 国产精品午夜福利视频| 久草线上视频免费看| 9美女超碰在线免费观看| 老鸭窝日丰县女人| 亚洲一区二区av| 国产精品视频在线观看| 欧美一区二区三区不卡高清视频| 日韩免费簧片| 强奸乱伦亚洲第一页| 在线性黄高清免费视频| 91麻豆天美国产欧美| 色好看av| 色色青青久久| 久久精品国产亚洲av水密被窝| 男人天堂网站| 天天色,天天干,天天干| 欧美性爱十八禁| 亚州国产精品乱| 国产有码一区| 日韩不卡一二三四| 少妇天堂| 最新国内自拍av免费| av资源在线观看少妇| 久久久精品国产亚洲伊人| 日韩ab网 | 97久久国产| 国产精品成人无码a v毛片| 无套内射性感少妇视频| 插入综合网| 精品国产污一区二区三区| 日本黄页视频在线观看| 亚洲色图欧洲| 午夜舔阴达高潮视频免费看| 每日更新AV| 天天综合精品| 偷拍亚洲视频一区二区三区四区| 天堂无码| 欧美刺激色黄片免费看| 午夜福利久久久噜久噜久久综合| 九一国产精品| 国产Av超碰| 水野优香在线观看| 青青草字幕AV| 国产高清成人免费视频| 自拍偷拍2025在线观看| 97 国产一区| 天天影视亚洲| 视频国产精品未满十八禁止在线观看| 啊啊啊好爽快点啊啊啊嗯嗯| 偷拍片久久| 亚洲情色综合| 天天插天天插| 超碰到97情色| 大香蕉视频一二三区| 六月婷婷激情| 熟女精品一区二区在线观看| 国产美女口爆吞精视频| 啊灬啊灬啊灬好深灬快高潮了动漫-国产字幕国产在线观看-B049AV | 99九九久久| 亚洲综合九九| 激情深爱五月天| 午夜精品人妻二区三区| 久久透逼视频| 色一射色一射| 色妇综合网| 激情五月天社区| 日本999精品| 搡老熟女免费视频 | 91网18| 人妻色偷色噜| 久久久久久久久久久久久久久性生活视频| 大香蕉2017| 亚洲一区二区久久久久| 亚洲欧洲日产国产综合网| 97超碰人人操人人操| 亚洲熟妇极品| 少妇熟女一区二区三区| 秋霞一级视频在线观看免费| 亚洲黄a三级三级三级看三级| 香蕉黄色一级视频| 中文字幕av久久爽Av| 亚洲欧美另类激情小说| 欧美日韩国产中文精品字幕自在自线,| 怡春院久久| 91狠狠综合久久久久久| 欲色综合| 69人妻精品一区二区绯色| 女人天堂网| 亚洲精品日日夜夜52| 久久久91福利姬| 亚洲一区二区中文字幕| 伊人96在线| 开心五月婷婷激情| 97中文热色| 亚洲男人天堂Av| 91老司机精品| 欧美极品女人的天堂| 国产精品白丝在线播放| 91九九九小逼| 亚洲成人无码影院| 日日嗷| 成人aⅴ一区二区三区| 色69大色97香蕉| 国产亚洲在线观看| 日日夜夜摸| 久久精品72| 国产 丝袜 欧美中文 另类| 日本高清视频在线观看黄已三辽| 九九99精品| 欧美少妇人妻| 欧美日韩国产男人| 国产尹人在线视频免费| 97在线免费视频观看| 国产精品肉丝自拍| 可以在线观看的黄色网址| 妇女视频网站| 亚洲精品久久久久久久蜜桃臀| 久久久久久综合久久伊人蜜月| 东京太热久久久| 欧美日韩日产免费网站看| 加勒比东京热五月天天堂网| 曰韩av中文字幕专区| 欧美色乱| 粉嫩少妇自慰在线| 日本道久久综合色色| 综合久久少妇中文字幕| 青草视频人妻在线观看| 六月婷婷五月丁香| 国产精品第一区第一页| 久久后入制服| 久九干| 天天日天天干天天整| 亚洲精品久久久久毛片A片拉屎| 神马久久啊啊| www.99热| 高清无码在线播放网站| 欧美在线电影| 亚洲中文字幕有码视频一区二区三区| 亚洲成a人片在线观看中文!!!| 男人的天堂一区三区| 亚洲资源站| 美骚妇av高清在线| 婷婷色综合| 强奸国产在线| 日日骚网站| 金典av| 久久人人妻| 国产午夜无码片在线观看影视| 91福利网在线观看| 五月天日日操夜夜操| 96免费视频在线| 26uuu国产| 思思热影视| 日本成人A片网站| 97免费视频在线| 日本不卡一区二区三区| 免费看污网站| 亚洲情色电影网| 天天看,天天做| 91深夜夜| 日本一区二区亚洲综合| 中文字幕av一区二区三区人妻少妇 | 青青草原成人| av72网| 亚洲色图a| 五月综合激情| 青娱乐亚洲自拍| 人人么人人操| 色九久| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 日韩三级av片| 91M一社| 视频二区熟女人妻| 丁香婷婷激情五月天无毒不卡| 蜜桃传媒一区二区亚洲| 亚洲熟妇自偷自拍另欧美| 久久亚洲av成人无码国产| 欧美日本一区二区a人| 欧美性生活男人的天堂| 射久久| 蜜桃传媒视频第一区入口在线看| 大香蕉之青青草原| 粉嫩AV一区夜夜嗨| 中国黑人三级片网站上区| 日韩亚洲美女一区久久| 91欧美高清| 天天日B狠狠操| 天天影视网综合少妇| 国产 日韩 欧美 人妻 熟女 中文 69人妻精品一区二区绯色 |