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

ARTICLE DETAIL

資訊詳情

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

Java Swing + MySQL 學(xué)生選課成績(jī)管理系統(tǒng)完整實(shí)現(xiàn)與避坑指南

Java Swing + MySQL 學(xué)生選課成績(jī)管理系統(tǒng)完整實(shí)現(xiàn)與避坑指南 簡(jiǎn)介這是一套基于Java Swing與MySQL實(shí)現(xiàn)的學(xué)生選課及成績(jī)管理系統(tǒng)課程設(shè)計(jì)源碼包適合Java初學(xué)者、畢業(yè)設(shè)計(jì)及課設(shè)學(xué)生使用。系統(tǒng)覆蓋登錄注冊(cè)、管理員/教師/學(xué)生三類(lèi)角色權(quán)限包含學(xué)生信息管理、課程管理、選課操作、成績(jī)錄入與查詢等完整業(yè)務(wù)模塊數(shù)據(jù)庫(kù)腳本和初始賬號(hào)管理員admin、教師tch、學(xué)生stu密碼均為123已內(nèi)置下載后修改JdbcConfig即可運(yùn)行。壓縮包共53個(gè)文件以16個(gè)Java源碼文件為主輔以MySQL建表SQL腳本、IDEA配置、外部Jar驅(qū)動(dòng)以及20張界面運(yùn)行截圖和E-R圖整體大小8.63MB結(jié)構(gòu)清晰便于對(duì)照開(kāi)發(fā)。目前已有219人學(xué)習(xí)下載適合作為課程設(shè)計(jì)、大作業(yè)或初期項(xiàng)目立項(xiàng)的參考模板能夠幫助理解Swing界面編程與JDBC數(shù)據(jù)庫(kù)操作的完整流程。1. 基于 Java Swing MySQL 的學(xué)生選課及成績(jī)管理系統(tǒng)先別急著說(shuō)它老很多人一聽(tīng)“基于 Java Swing MySQL 的學(xué)生選課及成績(jī)管理系統(tǒng)”就皺眉覺(jué)得 Swing 是十幾年前的老古董。但課程設(shè)計(jì)答辯現(xiàn)場(chǎng)恰恰是這種組合最穩(wěn)界面用 Swing 組件拖出來(lái)數(shù)據(jù)落在 MySQL 里中間用 JDBC 串起來(lái)邏輯清楚評(píng)委提問(wèn)也有抓手。這個(gè)系統(tǒng)要解決的是學(xué)生登錄、瀏覽課程、選課退課、查成績(jī)以及老師錄入成績(jī)這些典型管理場(chǎng)景。它適合第一次做完整工程的人也適合想在短時(shí)間內(nèi)交付可演示結(jié)果的在職讀者。下面這套落地步驟是我?guī)н^(guò)三輪課程設(shè)計(jì)輔導(dǎo)以后沉淀下來(lái)的照著走新手能跑通熟手能避坑。2. 先把地基打牢環(huán)境變量、建表設(shè)計(jì)和項(xiàng)目骨架2.1 Java 環(huán)境變量配置與 MySQL 安裝裝完先驗(yàn)證三條命令課程設(shè)計(jì)翻車(chē)最多的地方往往不是代碼而是環(huán)境。JDK 裝了一半MySQL root 密碼忘了驅(qū)動(dòng) JAR 沒(méi)放進(jìn) lib這些問(wèn)題在教室演示時(shí)一碰一個(gè)準(zhǔn)。網(wǎng)上很多 java 環(huán)境變量配置和 mysql 安裝教程都寫(xiě)得很詳細(xì)但我要提醒的是裝完以后一定要用命令行驗(yàn)證一遍別等雙擊 Main 才報(bào)錯(cuò)。java -version javac -version mysql --version邏輯說(shuō)明第一條驗(yàn)證 JRE第二條驗(yàn)證 JDK 編譯器第三條驗(yàn)證 MySQL 客戶端是否在 PATH 中。前兩條命令都來(lái)自 JDK如果 javac 提示找不到命令說(shuō)明環(huán)境變量沒(méi)配好而不是 JDK 沒(méi)裝上。參數(shù)說(shuō)明JAVA_HOME 必須指向 JDK 安裝根目錄比如C:\Program Files\Java\jdk-17不能只配到 bin 目錄。Windows 的 Path 里追加%JAVA_HOME%\binLinux 或 macOS 追加$JAVA_HOME/bin。MySQL 8.0 安裝時(shí)默認(rèn)選 caching_sha2_password 插件如果后面 JDBC 連接報(bào)錯(cuò)再回來(lái)改配置或換舊版驅(qū)動(dòng)。提示本地課程設(shè)計(jì)用 MySQL 5.7 或 8.0 都可以但連接驅(qū)動(dòng) JAR 要和 MySQL 版本對(duì)應(yīng)別拿 5.1 的驅(qū)動(dòng)連 8.0 的庫(kù)否則大概率報(bào) “Unsupported major.minor version”。數(shù)據(jù)庫(kù)連接測(cè)試建議用 MySQL Workbench。mysql workbench 使用教程里經(jīng)常有人卡在連不上 localhost其實(shí)先檢查服務(wù)有沒(méi)有啟動(dòng)就行。Windows 下 Win R 輸入 services.msc找到 MySQL80確認(rèn)狀態(tài)是“正在運(yùn)行”。Workbench 里連接 root 的時(shí)候如果提示 Access denied就是密碼不對(duì)沒(méi)有快捷辦法只能重置密碼。2.2 建庫(kù)建表學(xué)生、課程、選課成績(jī)?nèi)龔埍碜侄尉驮撨@樣定表結(jié)構(gòu)是系統(tǒng)的地基。我的建議是三張表student、course、student_course。student_course 同時(shí)承擔(dān)“選課關(guān)系”和“成績(jī)表”兩個(gè)職責(zé)成績(jī)字段直接掛在選課記錄上這是最省事也最容易被評(píng)委接受的做法。CREATE DATABASE IF NOT EXISTS course_system DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci; USE course_system; CREATE TABLE student ( id INT PRIMARY KEY AUTO_INCREMENT, sno VARCHAR(20) NOT NULL UNIQUE COMMENT 學(xué)號(hào), sname VARCHAR(50) NOT NULL COMMENT 姓名, password VARCHAR(64) NOT NULL DEFAULT 123456 COMMENT 登錄密碼, class_name VARCHAR(50) COMMENT 班級(jí) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE course ( id INT PRIMARY KEY AUTO_INCREMENT, cno VARCHAR(20) NOT NULL UNIQUE COMMENT 課程編號(hào), cname VARCHAR(50) NOT NULL COMMENT 課程名, credit DECIMAL(3,1) NOT NULL DEFAULT 2.0 COMMENT 學(xué)分, capacity INT NOT NULL DEFAULT 30 COMMENT 選課容量 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE student_course ( id INT PRIMARY KEY AUTO_INCREMENT, student_id INT NOT NULL, course_id INT NOT NULL, score DECIMAL(5,1) DEFAULT NULL COMMENT 成績(jī)未錄入為 NULL, UNIQUE KEY uk_student_course (student_id, course_id), CONSTRAINT fk_sc_student FOREIGN KEY (student_id) REFERENCES student(id), CONSTRAINT fk_sc_course FOREIGN KEY (course_id) REFERENCES course(id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;邏輯說(shuō)明student 表的 id 是代理主鍵sno 是業(yè)務(wù)主鍵登錄用 sno。course 表同樣用 id 做主鍵cno 做唯一編號(hào)。student_course 表的 score 設(shè)置為 NULL表示老師還沒(méi)錄入成績(jī)不要用 0 或 -1 去代替。UNIQUE KEY 加在 student_id 和 course_id 上數(shù)據(jù)庫(kù)層面直接攔住重復(fù)選課。參數(shù)說(shuō)明DECIMAL(3,1) 表示最多三位數(shù)字、一位小數(shù)能存 0.0 到 99.9課程學(xué)分和成績(jī)都?jí)蛴?。外鍵約束在課程設(shè)計(jì)里建議保留雖然很多人說(shuō)生產(chǎn)環(huán)境不用外鍵但答辯時(shí)“數(shù)據(jù)完整性”是一個(gè)重要加分點(diǎn)。所有表顯式指定 utf8mb4是為了和后面 JDBC 連接串里的 characterEncodingUTF-8 對(duì)齊避免中文亂碼。建完表后再補(bǔ)幾條測(cè)試數(shù)據(jù)后續(xù)界面調(diào)試會(huì)舒服很多INSERT INTO student (sno, sname, class_name) VALUES (2023001, 張三, 計(jì)科2301), (2023002, 李四, 計(jì)科2301); INSERT INTO course (cno, cname, credit, capacity) VALUES (CS101, Java程序設(shè)計(jì), 3.0, 30), (CS102, 數(shù)據(jù)庫(kù)原理, 2.5, 30); INSERT INTO student_course (student_id, course_id) VALUES (1, 1), (1, 2);這段 SQL 的用意是給登錄和查詢頁(yè)面留好基礎(chǔ)數(shù)據(jù)。張三有兩門(mén)選課且都沒(méi)成績(jī)正好用來(lái)測(cè)試“未錄入”的展示邏輯。2.3 項(xiàng)目骨架普通 Java 工程加 lib 目錄不折騰 Maven 也夠用很多 java 課程設(shè)計(jì)案例源碼喜歡上 Maven但對(duì)課程設(shè)計(jì)來(lái)說(shuō)Maven 第一次下載依賴就可能勸退一半人。我更推薦普通 Java 工程把 MySQL 驅(qū)動(dòng) JAR 放進(jìn) lib 目錄五步就能跑起來(lái)course-system/ src/ com/example/ Main.java util/DBUtil.java dao/CourseDao.java dao/StudentDao.java model/Course.java model/ScoreVO.java view/LoginFrame.java view/MainFrame.java view/CoursePanel.java view/SelectedCoursePanel.java view/ScorePanel.java lib/ mysql-connector-java-8.0.x.jar入口類(lèi)不需要任何花哨寫(xiě)法public class Main { public static void main(String[] args) { new LoginFrame().setVisible(true); } }邏輯說(shuō)明main 方法只做一件事創(chuàng)建 LoginFrame 并顯示。至于 LoginFrame 構(gòu)造方法里要初始化組件、注冊(cè)監(jiān)聽(tīng)器那是 view 包自己的職責(zé)。這種寫(xiě)法雖然簡(jiǎn)單但答辯時(shí)可以順手提一句“單層入口組件自包含”。參數(shù)說(shuō)明這里不能忽略 IDEA 的類(lèi)庫(kù)添加操作。寫(xiě)完代碼后右鍵 lib 目錄并選擇“Add as Library”再運(yùn)行。如果漏了這一步控制臺(tái)會(huì)報(bào)ClassNotFoundException: com.mysql.cj.jdbc.Driver。Eclipse 用戶則要 Build Path - Configure Build Path - Add JARs。在正式寫(xiě)功能前建議先用一個(gè)測(cè)試類(lèi)確認(rèn)驅(qū)動(dòng)能加載排除環(huán)境問(wèn)題再往下寫(xiě)public class TestDriver { public static void main(String[] args) throws Exception { Class.forName(com.mysql.cj.jdbc.Driver); System.out.println(驅(qū)動(dòng)加載成功); } }邏輯說(shuō)明MySQL 8.0 的驅(qū)動(dòng)類(lèi)名是com.mysql.cj.jdbc.Driver舊版本是com.mysql.jdbc.Driver。寫(xiě)死這個(gè)類(lèi)名跑通就說(shuō)明 JAR 和環(huán)境變量都沒(méi)問(wèn)題。這里先走一遍能幫后面省掉大量無(wú)關(guān)報(bào)錯(cuò)。3. JDBC 連接層寫(xiě)好了后面所有功能都是照著填 SQL3.1 DBUtil 工具類(lèi)連接串、驅(qū)動(dòng)加載和資源關(guān)閉Swing 每個(gè)窗口都可能要查庫(kù)所以連接邏輯必須收斂到一個(gè)工具類(lèi)里。一個(gè)合格的 DBUtil 至少要做到三件事加載驅(qū)動(dòng)、獲取連接、釋放資源。我的習(xí)慣是用靜態(tài)塊加載驅(qū)動(dòng)用可變參數(shù)關(guān)閉資源。package com.example.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DBUtil { private static final String URL jdbc:mysql://localhost:3306/course_system ?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingUTF-8; private static final String USER root; private static final String PASSWORD 123456; static { try { Class.forName(com.mysql.cj.jdbc.Driver); } catch (ClassNotFoundException e) { throw new ExceptionInInitializerError(MySQL驅(qū)動(dòng)未找到請(qǐng)檢查lib目錄); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } public static void close(AutoCloseable... resources) { for (AutoCloseable r : resources) { if (r ! null) { try { r.close(); } catch (Exception ignored) {} } } } }邏輯說(shuō)明靜態(tài)塊在類(lèi)加載時(shí)執(zhí)行一次Class.forName的作用是觸發(fā)驅(qū)動(dòng)注冊(cè)到 DriverManager。getConnection 每次調(diào)用都返回一個(gè)物理連接課程設(shè)計(jì)階段沒(méi)必要做連接池。close 方法接收可變個(gè)數(shù)的 AutoCloseableConnection、Statement、ResultSet 都實(shí)現(xiàn)了這個(gè)接口finally 里一次調(diào)用就能全部關(guān)掉。參數(shù)說(shuō)明URL 里有三個(gè)高頻坑別刪。useSSLfalse 關(guān)掉 SSL 握手本地開(kāi)發(fā)能少一個(gè)證書(shū)報(bào)錯(cuò)serverTimezoneAsia/Shanghai 解決 MySQL 8.0 的時(shí)區(qū)校驗(yàn)characterEncodingUTF-8 和建庫(kù)的 utf8mb4 配套防止中文亂碼。USER 和 PASSWORD 要改成你自己安裝 MySQL 時(shí)的賬號(hào)密碼。接著寫(xiě)一個(gè)查詢方法看看 DBUtil 怎么用public ListCourse findAllCourses() { ListCourse list new ArrayList(); Connection conn null; PreparedStatement ps null; ResultSet rs null; try { conn DBUtil.getConnection(); ps conn.prepareStatement(SELECT id, cno, cname, credit, capacity FROM course); rs ps.executeQuery(); while (rs.next()) { Course c new Course(); c.setId(rs.getInt(id)); c.setCno(rs.getString(cno)); c.setCname(rs.getString(cname)); c.setCredit(rs.getDouble(credit)); c.setCapacity(rs.getInt(capacity)); list.add(c); } } catch (SQLException e) { e.printStackTrace(); } finally { DBUtil.close(rs, ps, conn); } return list; }邏輯說(shuō)明先拿連接再預(yù)處理 SQL然后執(zhí)行查詢。rs.next()每調(diào)用一次就向下移動(dòng)一行返回 false 表示沒(méi)有更多數(shù)據(jù)。最后 finally 里關(guān)閉三個(gè)資源順序從 ResultSet 到 Statement 再到 Connection正好是反向創(chuàng)建順序。參數(shù)說(shuō)明rs.getInt(id)是按列名取數(shù)據(jù)比rs.getInt(1)更不容易出錯(cuò)SQL 里一旦改字段順序按列名取就依然安全。3.2 PreparedStatement 登錄校驗(yàn)為什么不用 Statement 拼接登錄功能是評(píng)委最?lèi)?ài)問(wèn)的地方。網(wǎng)上很多舊教程還在用字符串拼接 SQL看著簡(jiǎn)單其實(shí)一個(gè)大坑。只要學(xué)生在學(xué)號(hào)框里輸入 OR 11拼接出的 SQL 就變成了恒真條件密碼直接繞過(guò)。最典型的反例長(zhǎng)這樣// 反例別這么寫(xiě) String sql SELECT * FROM student WHERE sno sno AND password password ;所以我從第一版開(kāi)始就只用 PreparedStatementpublic boolean login(String sno, String password) { String sql SELECT id FROM student WHERE sno ? AND password ?; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setString(1, sno); ps.setString(2, password); try (ResultSet rs ps.executeQuery()) { return rs.next(); } } catch (SQLException e) { e.printStackTrace(); return false; } }邏輯說(shuō)明占位符?只代表參數(shù)位置驅(qū)動(dòng)會(huì)把 setString 傳入的值轉(zhuǎn)義后再放進(jìn) SQL 中因此即使用戶輸入引號(hào)或關(guān)鍵字也不會(huì)改變 SQL 結(jié)構(gòu)。只要rs.next()能返回 true就說(shuō)明找到了匹配的學(xué)號(hào)和密碼。參數(shù)說(shuō)明這里沒(méi)有做密碼加密因?yàn)檎n程設(shè)計(jì)一般不需要但答辯時(shí)最好加一句“生產(chǎn)環(huán)境應(yīng)該存加鹽后的哈希值”。sno 和 password 都通過(guò) setString 傳入數(shù)據(jù)庫(kù)字段長(zhǎng)度要留夠sno 用 20password 用 64足夠裝下常見(jiàn)的哈希串。3.3 DAO 接口與實(shí)現(xiàn)類(lèi)把 SQL 從界面里趕出去Swing 界面里不能直接寫(xiě) JDBC 代碼否則按鈕監(jiān)聽(tīng)器會(huì)變得又長(zhǎng)又亂。常見(jiàn)做法是拆出一個(gè)數(shù)據(jù)訪問(wèn)層接口定義行為實(shí)現(xiàn)類(lèi)寫(xiě) SQL。接口是“合同”實(shí)現(xiàn)類(lèi)才是“施工”。public interface CourseDao { ListCourse findAllCourses(); boolean selectCourse(int studentId, int courseId); boolean dropCourse(int studentId, int courseId); ListScoreVO findScoresBySno(String sno); }邏輯說(shuō)明CourseDao 把課程相關(guān)操作全部抽象出來(lái)。界面層只依賴接口不知道底層是 MySQL 還是別的數(shù)據(jù)庫(kù)。這樣做的好處是以后想換 ORM 框架Swing 界面一行都不用動(dòng)。實(shí)現(xiàn)類(lèi)里選課方法邏輯是插入一條選課記錄public class CourseDaoImpl implements CourseDao { Override public boolean selectCourse(int studentId, int courseId) { String sql INSERT INTO student_course (student_id, course_id) VALUES (?, ?); try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setInt(1, studentId); ps.setInt(2, courseId); return ps.executeUpdate() 0; } catch (SQLException e) { e.printStackTrace(); return false; } } }邏輯說(shuō)明executeUpdate 返回受影響行數(shù)。插入成功則返回 1返回 true失敗則返回 false。如果學(xué)生已經(jīng)選過(guò)這門(mén)課數(shù)據(jù)庫(kù)的 UNIQUE KEY 會(huì)直接拋 SQLException界面層可以把這個(gè)異常翻譯成“你已經(jīng)選過(guò)這門(mén)課”的提示框。參數(shù)說(shuō)明這里還要從登錄 Session 拿到 studentId但登錄時(shí)只有學(xué)號(hào)所以常見(jiàn)辦法是在登錄成功后執(zhí)行一條SELECT id FROM student WHERE sno?把真實(shí)主鍵存起來(lái)。權(quán)限暫時(shí)不做管理員登錄也走同一張 student 表只是角色字段沒(méi)加如果評(píng)委問(wèn)起來(lái)可以說(shuō)“增加一個(gè) role 字段即可”。3.4 數(shù)據(jù)模型類(lèi)Course、Student、ScoreVO別用 Map 到處傳查詢結(jié)果變成對(duì)象后界面用起來(lái)才順手。ListMapString, Object 雖然也能用但取值要轉(zhuǎn)來(lái)轉(zhuǎn)去代碼可讀性差。課程設(shè)計(jì)用三個(gè)類(lèi)就夠Course 對(duì)應(yīng)課程表Student 對(duì)應(yīng)學(xué)生表ScoreVO 對(duì)應(yīng)成績(jī)查詢視圖。public class Course { private Integer id; private String cno; private String cname; private Double credit; private Integer capacity; // 構(gòu)造方法、getter/setter 省略 }邏輯說(shuō)明Course 類(lèi)的字段類(lèi)型和數(shù)據(jù)庫(kù)要保持一致但要小心數(shù)據(jù)庫(kù) DECIMAL 映射為 Double 或 BigDecimal 的選擇。學(xué)分 DECIMAL(3,1) 用 Double 完全夠但如果涉及金額計(jì)算更推薦 BigDecimal。課程設(shè)計(jì)里選 Double 代碼更簡(jiǎn)單能在答辯時(shí)解釋清楚“簡(jiǎn)單場(chǎng)景不追求高精度”就夠了。4. Swing 界面從登錄到主窗體布局、事件和表格刷新4.1 登錄窗體的最小實(shí)現(xiàn)JFrame JTextField JPasswordFieldSwing 不需要任何第三方庫(kù)JDK 自帶就是最大的優(yōu)勢(shì)。登錄窗體用最簡(jiǎn)單的 GridLayout三行兩列足夠應(yīng)付演示。public class LoginFrame extends JFrame { private JTextField tfSno new JTextField(); private JPasswordField pfPassword new JPasswordField(); public LoginFrame() { setTitle(學(xué)生選課及成績(jī)管理系統(tǒng) - 登錄); setSize(360, 220); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); setLayout(new GridLayout(3, 2)); add(new JLabel(學(xué)號(hào))); add(tfSno); add(new JLabel(密碼)); add(pfPassword); JButton btnLogin new JButton(登錄); add(btnLogin); btnLogin.addActionListener(e - doLogin()); } private void doLogin() { String sno tfSno.getText().trim(); String password new String(pfPassword.getPassword()); if (new StudentDaoImpl().login(sno, password)) { new MainFrame(sno).setVisible(true); dispose(); } else { JOptionPane.showMessageDialog(this, 學(xué)號(hào)或密碼錯(cuò)誤); } } }邏輯說(shuō)明GridLayout 三行兩列依次擺放學(xué)號(hào)、輸入框、密碼、密碼框、空組件、登錄按鈕布局雖然樸素但不會(huì)錯(cuò)位。密碼框用 JPasswordField 而不是 JTextField用戶輸入的內(nèi)容在界面上顯示為圓點(diǎn)。doLogin 里先 trim 學(xué)號(hào)去掉前后空格再調(diào)用登錄方法。參數(shù)說(shuō)明setLocationRelativeTo(null)讓窗體居中顯示這個(gè)細(xì)節(jié)放在 360 乘 220 的窗口上剛剛好。dispose()會(huì)在登錄成功后釋放當(dāng)前窗體不釋放的話主窗體出現(xiàn)后登錄窗口還留在任務(wù)欄里進(jìn)程行為會(huì)很奇怪。注意JPasswordField 的 getPassword 返回的是 char[]用 new String 轉(zhuǎn)成字符串后用完最好及時(shí)置空。課程設(shè)計(jì)不用太較真但代碼里不要順手 System.out.println 打印密碼。4.2 主窗體用 JTabbedPane 拆頁(yè)面課程列表、我的選課、成績(jī)查詢課程設(shè)計(jì)階段的系統(tǒng)功能不會(huì)特別多主窗體用一個(gè) JTabbedPane 就足夠了。三個(gè)標(biāo)簽頁(yè)分別對(duì)應(yīng)三個(gè) JPanel 子類(lèi)每個(gè)面板只負(fù)責(zé)自己的表格和按鈕。public class MainFrame extends JFrame { public MainFrame(String sno) { setTitle(歡迎 sno); setSize(800, 600); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); JTabbedPane tabs new JTabbedPane(); tabs.addTab(課程列表, new CoursePanel()); tabs.addTab(我的選課, new SelectedCoursePanel(sno)); tabs.addTab(成績(jī)查詢, new ScorePanel(sno)); add(tabs, BorderLayout.CENTER); } }邏輯說(shuō)明登錄時(shí)把學(xué)號(hào) sno 傳進(jìn)來(lái)主窗體再把它分發(fā)給兩個(gè)需要學(xué)生信息的頁(yè)面。CoursePanel 不知道當(dāng)前用戶是誰(shuí)因?yàn)樗回?fù)責(zé)展示所有課程和“選課”按鈕選課時(shí)再根據(jù)學(xué)號(hào)回查學(xué)生 ID。這樣劃分每個(gè)類(lèi)的職責(zé)比較清晰。參數(shù)說(shuō)明setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)是主窗體特有的登錄窗體如果也用 EXIT_ON_CLOSE那么 dispose 時(shí)整個(gè)進(jìn)程都退出。登錄成功后的主窗體采用 EXIT 是合理的關(guān)閉主界面等于退出程序。4.3 成績(jī)單表格DefaultTableModel 怎么做到刷新不重復(fù)表格是 Swing 里最容易寫(xiě)錯(cuò)的部分尤其是刷新邏輯。常見(jiàn)錯(cuò)誤是點(diǎn)一次查詢表格里的成績(jī)多一行越點(diǎn)越多。原因很直接每次都 addRow從不清理舊數(shù)據(jù)。正確的刷新方式是先清空再填充public void refreshTable(ListScoreVO scores) { DefaultTableModel model (DefaultTableModel) table.getModel(); model.setRowCount(0); for (ScoreVO vo : scores) { model.addRow(new Object[]{ vo.getCno(), vo.getCname(), vo.getScore() null ? 未錄入 : vo.getScore() }); } }邏輯說(shuō)明setRowCount(0) 把 TableModel 的所有現(xiàn)有行清空相當(dāng)于一張白紙。然后再 addRow 循環(huán)添加新數(shù)據(jù)這樣表格永遠(yuǎn)只顯示最新查詢結(jié)果。這里將 score 為 null 的情況顯示為“未錄入”比直接顯示 null 要專業(yè)得多。參數(shù)說(shuō)明如果使用的是自己繼承 AbstractTableModel 的自定義模型改完數(shù)據(jù)后還要調(diào)用 fireTableDataChanged()否則界面不會(huì)重新繪制。JTable 默認(rèn)列寬會(huì)自動(dòng)均分課程列表課程名較長(zhǎng)時(shí)容易被擠壓建議加一行table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); JScrollPane sp new JScrollPane(table);邏輯說(shuō)明把表放進(jìn) JScrollPane并把自動(dòng)調(diào)整列寬關(guān)掉這樣列寬由表格自身決定內(nèi)容太長(zhǎng)時(shí)會(huì)出現(xiàn)橫向滾動(dòng)條而不是把課程名壓縮成省略號(hào)。4.4 選課按鈕的事件處理先查后插再給用戶一個(gè)反饋選課按鈕是事件處理里最有代表性的。點(diǎn)擊后不能只做一次 insert否則用戶連點(diǎn)兩下就出重復(fù)數(shù)據(jù)。除了數(shù)據(jù)庫(kù)的唯一約束之外界面層也要給出友好反饋btnSelect.addActionListener(e - { btnSelect.setEnabled(false); int selectedRow courseTable.getSelectedRow(); if (selectedRow 0) { JOptionPane.showMessageDialog(this, 請(qǐng)先選擇一門(mén)課程); btnSelect.setEnabled(true); return; } int courseId (int) courseTable.getValueAt(selectedRow, 0); boolean ok courseDao.selectCourse(studentId, courseId); if (ok) { JOptionPane.showMessageDialog(this, 選課成功); refreshTable(); } else { JOptionPane.showMessageDialog(this, 選課失敗可能重復(fù)選課或課程不存在); } btnSelect.setEnabled(true); });邏輯說(shuō)明按鈕置灰是為了防止快速連點(diǎn)導(dǎo)致重復(fù)提交數(shù)據(jù)庫(kù)唯一約束仍然是最底線的保護(hù)。getSelectedRow 返回 -1 表示沒(méi)選中行此時(shí)直接提示不執(zhí)行 SQL。成功后立即刷新課程列表的剩余容量和“我的選課”頁(yè)簽界面數(shù)據(jù)保持一致。參數(shù)說(shuō)明getValueAt 返回的是 Object這里選課表的第 0 列是課程 ID所以強(qiáng)轉(zhuǎn)成 int。如果你的表格列順序調(diào)整過(guò)一定要同步修改這里這是表格代碼里最常見(jiàn)的隱性 Bug。5. 避坑指南Swing MySQL 項(xiàng)目最容易翻車(chē)的 5 個(gè)細(xì)節(jié)5.1 中文亂碼三個(gè)地方少一個(gè)就白搭現(xiàn)象界面上課程名顯示成“???”或者 MySQL Workbench 里中文正常Java 程序里讀出亂碼。原因建庫(kù)字符集、JDBC 連接串字符集、Java 源文件編碼三者不一致。最常見(jiàn)的是建庫(kù)用了默認(rèn) latin1而連接串里指定了 UTF-8兩邊對(duì)不上。解決先確認(rèn)建庫(kù)和建表都用了DEFAULT CHARSETutf8mb4然后在 JDBC URL 里加characterEncodingUTF-8。如果已經(jīng)建好的庫(kù)是 latin1用下面兩條 SQL 補(bǔ)救ALTER DATABASE course_system CHARACTER SET utf8mb4; ALTER TABLE course CONVERT TO CHARACTER SET utf8mb4;如果是 IDEA 項(xiàng)目編譯亂碼則要檢查 Settings - File Encodings把所有位置都設(shè)為 UTF-8。這三個(gè)地方對(duì)不上任何一個(gè)亂碼就跑不了。5.2 MySQL 8.0 連不上Public Key Retrieval is not allowed現(xiàn)象點(diǎn)擊登錄按鈕后控制臺(tái)拋出java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed。原因MySQL 8.0 默認(rèn)用 caching_sha2_password 認(rèn)證客戶端第一次連接時(shí)要從服務(wù)器獲取公鑰來(lái)加密密碼但 Connector/J 出于安全考慮把 allowPublicKeyRetrieval 默認(rèn)設(shè)為 false所以連接被拒絕。解決在 JDBC URL 中顯式加上allowPublicKeyRetrievaltrue和useSSLfalse。本地開(kāi)發(fā)沒(méi)問(wèn)題但不要讓這套配置出現(xiàn)在生產(chǎn)環(huán)境里。String url jdbc:mysql://localhost:3306/course_system?useSSLfalseallowPublicKeyRetrievaltrueserverTimezoneAsia/ShanghaicharacterEncodingUTF-8;邏輯說(shuō)明這兩個(gè)參數(shù)通常成對(duì)出現(xiàn)useSSLfalse 避免證書(shū)校驗(yàn)allowPublicKeyRetrievaltrue 允許本地請(qǐng)求公鑰。報(bào)了別的錯(cuò)誤的話優(yōu)先看完整異常堆棧而不是只搜前半段。5.3 JTable 數(shù)據(jù)不刷新或越插越多現(xiàn)象第一次點(diǎn)“查詢成績(jī)”顯示三行第二次點(diǎn)變成六行第三次變成九行數(shù)據(jù)越查越多。原因點(diǎn)擊事件里只調(diào)用 addRow沒(méi)有先清理舊數(shù)據(jù)TableModel 是在老數(shù)據(jù)基礎(chǔ)上不斷追加。解決在每次查詢填充數(shù)據(jù)前調(diào)用model.setRowCount(0)。如果是擴(kuò)展 AbstractTableModel 的自定義模型則在數(shù)據(jù)更新后調(diào)用fireTableDataChanged()通知 JTable 重新繪制。還有一個(gè)小問(wèn)題不要把查詢邏輯寫(xiě)在 JTable 的鼠標(biāo)事件里而是在一個(gè)獨(dú)立的方法中完成查詢加刷新按鈕和別的事件都能復(fù)用它。5.4 選課重復(fù)提交唯一約束兜底按鈕置灰防手滑現(xiàn)象快速雙擊“選課”按鈕同一個(gè)學(xué)生同一門(mén)課程出現(xiàn)兩條記錄。原因第一次點(diǎn)擊的插入還沒(méi)執(zhí)行完第二次點(diǎn)擊已經(jīng)發(fā)出了同樣的 INSERT。界面層沒(méi)有防抖數(shù)據(jù)庫(kù)也沒(méi)有約束時(shí)重復(fù)數(shù)據(jù)就進(jìn)了表。解決數(shù)據(jù)庫(kù)層面已經(jīng)用 UNIQUE KEY 攔住重復(fù)第一次插入成功第二次會(huì)拋 SQLException。程序里可以捕獲這個(gè)異常并提示“你已經(jīng)選過(guò)這門(mén)課程”。更穩(wěn)妥的做法是在點(diǎn)擊后立刻 disable 按鈕等數(shù)據(jù)庫(kù)返回結(jié)果后再恢復(fù)。這個(gè)場(chǎng)景在 mysql 面試題里也很常問(wèn)你答“唯一約束優(yōu)先”比答“先查再插”更高級(jí)。5.5 界面卡死耗時(shí)查詢不放在事件線程里現(xiàn)象點(diǎn)擊“查詢成績(jī)”后整個(gè)窗口像死機(jī)一樣拖不動(dòng)也不能最小化。原因Swing 的事件處理代碼運(yùn)行在事件分發(fā)線程 EDT 上。數(shù)據(jù)庫(kù)查詢、網(wǎng)絡(luò)請(qǐng)求這類(lèi)阻塞操作如果直接寫(xiě)在按鈕監(jiān)聽(tīng)器里EDT 會(huì)被阻塞所有界面繪制都停住。解決最簡(jiǎn)單的處理是查詢前禁用按鈕并顯示“查詢中”查詢完再恢復(fù)。想加分的話用 SwingWorker 把查詢放到后臺(tái)線程SwingWorkerVoid, Void worker new SwingWorkerVoid, Void() { Override protected Void doInBackground() { result courseDao.findScoresBySno(sno); return null; } Override protected void done() { refreshTable(result); } }; worker.execute();邏輯說(shuō)明doInBackground 運(yùn)行在后臺(tái)線程不會(huì)卡住界面done 方法在主線程執(zhí)行可以安全更新表格和按鈕狀態(tài)。這就是 Swing 應(yīng)用處理耗時(shí)任務(wù)的標(biāo)準(zhǔn)姿勢(shì)也是課程設(shè)計(jì)答辯中一個(gè)非常值的提的改進(jìn)點(diǎn)。6. 答辯前做這 3 件事功能不變分?jǐn)?shù)明顯不一樣如果你做完基本功能還有一兩天時(shí)間把以下三件事補(bǔ)上系統(tǒng)會(huì)從“能跑”變成“能講”。第一件事是把選課方法改成事務(wù)版。數(shù)據(jù)庫(kù)事務(wù)不用整太復(fù)雜只要把原來(lái)的“一條 INSERT”改成“檢查容量、插入選課記錄、更新已選人數(shù)”的完整過(guò)程。手動(dòng)調(diào)用conn.setAutoCommit(false)中間任何一步拋異常就conn.rollback()全部成功再conn.commit()。這會(huì)讓評(píng)委覺(jué)得你不是只會(huì)拼 SQL而是考慮過(guò)數(shù)據(jù)一致性。第二件事是在成績(jī)頁(yè)面加一個(gè)統(tǒng)計(jì)欄。SQL 用一條聚合查詢就能實(shí)現(xiàn)SELECT COUNT(*) AS total, AVG(score) AS avg_score, MAX(score) AS max_score FROM student_course WHERE student_id ?;把結(jié)果顯示在成績(jī)表格下方比如“共 3 門(mén)課平均分 86.3最高分 95”。這一小段能引出的問(wèn)題包括聚合函數(shù)、NULL 值處理、分組查詢都是 java 八股文和數(shù)據(jù)庫(kù)面試的高頻點(diǎn)你答起來(lái)也有底氣。第三件事是把成績(jī)導(dǎo)出成 CSV 文件。這個(gè)功能不依賴任何第三方庫(kù)純 JDK 就能寫(xiě)StringBuilder sb new StringBuilder(課程編號(hào),課程名稱,成績(jī)\n); for (ScoreVO vo : list) { sb.append(vo.getCno()).append(,) .append(vo.getCname()).append(,) .append(vo.getScore() null ? : vo.getScore()).append(\n); } Files.write(Paths.get(scores.csv), sb.toString().getBytes(StandardCharsets.UTF_8));邏輯說(shuō)明用逗號(hào)分隔每列用換行分隔每行。成績(jī)?yōu)榭諘r(shí)寫(xiě)空字符串而不是寫(xiě) null。Files.write 會(huì)覆蓋已有文件目錄里有老文件時(shí)會(huì)直接替換。如果成績(jī)里有特殊字符或姓名包含逗號(hào)記得再加一層引號(hào)包裹但課程設(shè)計(jì)場(chǎng)景一般用不到。我當(dāng)年做完這套系統(tǒng)后覺(jué)得能跑通就算完事結(jié)果評(píng)委問(wèn)“選課并發(fā)時(shí)怎么保證容量”我答不上來(lái)。后來(lái)把事務(wù)和統(tǒng)計(jì)加上同樣的題目講的內(nèi)容一下子多了起來(lái)。你按照這個(gè)順序往下做最后輸出的一定是一個(gè)能演示、能講清、能抗追問(wèn)的完整工程。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
麻豆国产原创AV色哟哟| 日韩八十路老熟女| 亚洲色天堂九9| 国产精品制服丝袜清纯唯美| 亚洲在高跟鞋自慰久久在色线| 亚洲91色| 一区 欧美 日韩 麻豆| 91黑人狂躁丰满熟妇| 91狠狠综合久久久久久| 亚洲成成熟女人综合一区二区| 亚洲高清无码在线桃色| 女人18精品一区二区三区| 少妇3P性爱自拍| 久操网在线| 久久无码一区二区二三区性色| 久久艹逼视频| 国产精品九九九| 久久天堂婷婷网| 青青草一区二区三区四| 8050无码八戒| 久久久青青草| 久久久久久久久久久97| 国产啊v在线免费播放| 婷婷色香| 中国一级特黄大片护士| 1024午夜激情男人的天堂| 国产精品无码av| 青操影院| 中文字日本乱码| 亚洲国产成人7777| 大香蕉日亚洲日本亚大 | 加勒比在线视频一区二区三区| 中文字幕精品一区二| 性综合网| 视频一区二区免费在线| 手机在线免费看的av| 黄骗免费网站| 富女玩鸭子一级毛片| 欧美人黑A片无码免视费| 91肉片| 亚洲啪啪综合?v一区综合精品区| 亚洲另类春色| 永久免费观看的毛片的网站| 成人免费看吃奶视频网站| 免费精品无码一级毛片牛牛影视 | 国产精品一级特黄aaa大片在线观看| 精品人妻一区二区三区在| 欧美 色 亚洲| 黄色免费一级在线毛片| 日本一区二区三区免费观看| 这里只有精品视频在线观看麻豆| 久久精品国产72国产精品福利| 欧美综合娱乐久久| 激情婷婷五月天| 激情久久久| 大香蕉啪啪啪| aaa淫乱视频| 熟妇一区,二区,三区。| 美女9118禁| 不卡在线观看视频| 激情久久久| 超碰99在线| 夜夜爽妓女| 中文字幕神马久久| 99少妇| 任你爽视频| 秋霞网—男女啪啪亚洲免费体验区 | 天天cao在线| 国产日韩久久| 欧美经典一区二区三区| 狠狠干婷婷| 最新一二三区视频| 亚州欧美另类| 岛国毛片在线观看免费| 免费看污网站| 天天欧美97| 尤物网站91| 久久久久久国产手机AV| 国模限制级电影| 久久骚少妇| 欧美日韩久久精品爱爱| AV污污污污| 国语人妻精彩刺激| 嫩草 我啊~嗯~在线| 另类欧美色| 99色热国产视频精品| 激情丁香五月| 激情综合五月| 欧美天天谢综合网| 婷婷AV一区二区三区| 蜜乳视频网站| 久久午夜色播影院免费高清| 992视频一区| 久久久精选| 欧美性视频二区三区| 亚洲AV免费在线观看| 国产超碰人人操| 国产69精品久久久久99尤物| 在线观看日韩av不卡| 国产成人午夜视频网址| 日韩中文字幕人妻视频| 亚洲一本大道中文字幕无码在线| 国产熟女完整版中字| 性无码专区2020| 96久久久久| 新91视频.cmp| 成人久久久| 天天日天天看| 亚洲欧美综合| 中文字幕三四区| 亚洲视频中文一区| 999久久久免费精品国产牛牛| 999精品久久久久久久| 亚洲天天更新| 色在线综合| 99久久久无码精品国产人| 91久久免费视频互動交流| 日本精品五区| 激情五月综合开心五月| 超碰在线观看av不卡| 亚洲人妻在线一区| 美国一区二区免费视频| 桃花色涩综合影院| 熟妇最新先锋一二三区| 青青草大香蕉在线视频| 久久原创中文| 青青五月天| 一区二区三| 在线观看不卡一区二区三区| 色呦呦呦在线观看视频| 久草成人福利导航| 亚洲精品国产精品乱码不卡| 后入人妻无码| 精品少妇人妻av久久免费| 深田咏美亚洲精品福利社| 色色色色综合网| 色哟哟的毛片| 东北操逼| 国产精品com| PMv在线观看| 国精精品无码一二三区水多多| 国产91精品福利在线| 久久久97| 97在线欧洲| 久久精品人妻一区二区| 东京热,男人的天堂| 国产日韩中文字幕欧美| 在线综合色| 熟女突然公开看18禁影片| 一本道综合色图| 少妇天堂网络| 国产免费小视频| 国内偷拍精品一区二区| 五月天开心网| 国产2.3.4区| 毛片久久| 一级黄色影片| 人人摸人人舔一区二区| 蜜臀99久久精品久久久懂爱| 免费的很黄很污的全部视频| 99热综合在线| 极品出轨视频网站| 国产传媒操逼视频| 中文字幕av色| 久久精品28| 国产性久久久| ,国产乱人伦精品一区二区三区| 国产精品久久久久久久免牛肉蒲团 | 欧美性天天| 黄片aaaaa一区| 中文字幕二区日韩天堂| 神马久久免费电影观看| 国产精品欧美日韩久久| 天天综合香 ld视频| 福利天天都操| 亚洲中文字幕精品久久久久久直播| 爱欲AV| 可乐操在线| 操逼操逼视频操逼| 亚洲色情在线影视| 在线一道啪| 国产后入精品| 中文字幕一区二区三区四区在线视频| 碰碰在线视频| 九九九网站| 免费一级欧美片片线观看| 大香蕉色网| 国产精品一区二区三区四区五区| 色色五月婷婷| 校园春色美腿丝袜 | 97天堂| 久久激情综合| 91操熟女视频| 五月婷丁香| 中文字幕免费看| 日韩精品人妻一| 今日头条成人一区二区三区四虎精品| 少妇厨房愉情理伦片bd在线观看 | 乱伦av麻豆| 禁十八久久| 欧美性爽xyxOOOO| 九九热男人天堂| 蜜臀AV午夜精品久| 热天堂一区二区| 肏逼视频日本| 亚洲丝袜制服国产91_国语字幕免费观看完整版下载第5集_ | 亚卅熟女乱色| 久久久内射良家| 久久久久久久国产视频| 少妇内射视频| 人妻激情另类| 97色碰| 色综合一区二区三巨| 欧美亚洲小说| 婷婷九月国产| 26UUU欧美日本| 国产欧美美女免费观看视频| 美日韩男女操屄视频| 精品久久久久久久久久久久| 99精品欧美一区二区三区桃色| 亚洲天堂日本| 亚洲图片偷拍视频区| 色五月AV在线| 猛交交| 91伊人| 95精品在线| 国产精品人妻无码久久久老鸭窝 | 大香蕉伊人色偷偷在线| 少妇高潮九九九九| 欧美97在线观看| 亚洲最大成人a毛毛片| 激情啪啪视频| 97亚洲一区| 99久久精品欧美国产| 久久久久久中文| 熟女性视频| 91露脸熟女专区| 大屁股熟女一区二区三区| 久99热| 九九综合九九综合| 果冻传媒A片一二三区 | 日本东京热加勒比久久| 成人青青草原伊人| 偷拍在线观看视频| 成人在线日韩| 久久无码成人| 亚洲图片另类| 天天在线91| 日韩pv中文| 国产女人和拘做爰视频| 2017天天插| 素人无码中文字幕| 欧美综合站| 在线国产福利网址导航| 成人五月天丁香激情综合| 91 国产丝袜在线播放-百度| 偷拍欧美激情| 激情小说五月天| 国产精品熟女九色九色蜜臀| 九九九精品成人免费视频小说| 欧美 日韩 婷婷 五月| 日本一级一级一级一级| 五月天综合在线| 欧美精品成人在线播放| 亚洲天天综合| 视频国产成人精品日本亚洲18| 亚洲极品| 天天综合网合集91| 性性久久| 国产青视频| 亚州成人a∨| 激情小说五月天| 亚洲AV无码黄色强奸| 国产1024在线播放| 97在线免费视频观看| 欧美日韩97在线| 九九热这里只有在线精品视 伊人草 成人菠萝蜜视频在线观看 | 久久久久久久性爱| 九九九成人| 亚洲AV不卡在线观看| 一区二区精品更新提醒| 亚洲影视综合网| 欧美啪啪女女| 99精品网| 狠狠中文字幕| 日韩精品区二区三区不卡| 麻豆啪啪啪视频| 久草网站免费在线观看| 激情无码日韩| 美女国产一区二区久久| 一级久久久久久久久久久| 秋霞网—男女啪啪亚洲免费体验区| 精品欧美乱码久| 人人妻人人爽人人精品| 亚洲色图8| 99国产精品自在自在| 九九九九九九九九九九精品视频| 亚洲一区制服诱惑| 久男人久久| 97爱亚洲| 综合亚洲欧美| 精品日韩人妻视频| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 啊啊啊久久| 无套后入双马尾| 97综合激情| 色网色网色网色网色网色| 91亚洲电影| 国产精品诱惑| 东亚亚洲无码高清| 久久最新视频免费观看| 欧美性色综合网| 欧美超碰96| 日韩噜噜69| 天天操天天日天天干| 欧美在线视频观看一二三四区高清| 伊人网在线观看| 福利一级版子| 欧美久久人体| 97超碰色色| 久9re热视频这里只有精品| 老熟女乱伦一区| 一级黄色性爱A级片| 日本激情免费大片| 国产91美女高潮| 国产老熟女| 啊好爽快点-国产一区二区三区撒尿在线-成人AV| 美国久久一二三四| 亚洲精品亚洲人成人网| 欧美嗯啊……在线观看视频免费| 艾草av| 久久人爽| 后入国产| 97在线视频观看网站| 性爱乱伦一区| 国产传媒一区日韩| 噜噜噜亚洲精| 国产对白刺激视频| 95人妻爽爽人人做人人澡| 久插综合| 91久久婷婷| 欧美性战999| 久神马| 综合色区偷拍| 欧美大香蕉同搞| 日韩久久三区| 91激情国产| 久久久新亚洲AV| 曰韩成人免费视频| 青青草视频在线观看一区二区| 99精品久久久久久| 高清国产无码av| 强奸乱伦麻豆| 台湾佬中文娱乐自偷自拍| 久久一本大香蕉| 蜜臀久久久99久久久久 | 乱伦熟女专区| www.狠狠操| AV色五月天| 欧美黄色手机在线观看| 深夜操逼网| 骚人妻少妇视频| 2024年最新色情网站在线观看| 无遮挡h肉动漫在线观看| 天天日日本| 午夜αv| 91 亚洲 欧美 日韩 国产 综合| 99青草| 99精品九九九九九九| 欧美少妇性爱网站| 91麻豆天美传媒HD| 日韩国产精品人妻无码久久久| 六月婷婷综合| 亚洲欧美视| 日逼逼免费看| 欧美白嫩女HD| 最新三级网址| 97超碰免费人人性爱| 天天草天天日| 天天肏美女| 欧洲亚洲少妇| 一二三四免费视频| 97色亚洲| 丰满少妇一区二区三区专区| 国产精品熟女一区二区三区| 精品一区二区啪啪啪| 啊啊啊慢点| 中文字幕av亚洲在线| 天堂涩涩| 精品人妻一区| 2020中文字幕在线| 婷婷亚洲五月***久久| 精品欧美日韩在线观看| 人妻中文字幕日韩电影| 大干人妻| 天天日夜夜爽| 熟女人妻一区二区三区| 日本免费一区二| 欧亚日韩中文在线| 厕所偷拍在线| 婷婷丁香九月| 精品视频久久区| 超碰成人最新最好看| 中文字幕在线第二页| 精品亚洲国产成人AV制服丝袜| 久久久久深夜无码| 亚洲色吧网| 日韩免费a级毛片无码a∨| 九九玖玖精品| 翔田千里一区二区三区奶水| 久久久久9999精品九九九| 韩国午夜理伦三级好看| 日韩欧美三级| 香一区二区三区| 国产精品视频自拍在线| 亚洲一二三四区在线免费看视频| 99热精品在线| 无遮挡又黄又刺激的视频| 密臀AV在线| 日韩成人精品视频自拍| 国产美女自拍视频| 亚洲精品骚逼| 五月天婷婷色色| 无码久久国产| 中文字幕欧美精品亚洲日韩蜜臀| 国产精品对白内射| 国产熟女免费观看久久| 国内伊人久久久久久网站视频| 最新一二三区视频| 97国产高清视频在线观看| 欧美高清色| 91高跟美女在线播放| 亚洲 欧美日韩 另类| 国产精品诱惑| 久久宗合亚洲| 中文字幕制服欧美久久一区| 亚洲欧美国产成人综合不卡| 2020久久免费视频| 夜夜做夜夜爽精品视频| 色婷婷综合久久中文字幕雪峰| 女人双腿搬开让男人桶| 国产在线能看的你懂的| 亚洲精品电影| 天天影视之亚洲综合网| 精品久久久久9999| 亚洲色图超碰在线| 91精品人妻电影| 欧美人体性爱互联网第一页婷婷日本| 97资源站久久| laoshunv91| 91ise欧美| 伊人黄色视频免费观看| 思思视频免费看网站| 超碰色图| 国产综合久| 亚洲性综合| 久久亚洲不卡一区二区三区 | 粉嫩av久久一区二区三区| 成人国产二区三区在线,男女精品。| 在线视频一区二区传媒| 亚洲天堂综合AV| 熟妇操花| 无码乱人伦中文视频| 午夜男女爽爽爽影院视频| 超碰诱惑| 中国91AV| 综合亚洲网| 狠狠干妹子| 制服诱惑亚洲一区二区三区在线观看| 麻豆福利视频导航| 亚洲精品一区二区三区新线路| 黄网在线播放| 91chinese在线| 成人福利视频网| 青青伊人这里只有精品| 精品亚洲黄色片 国产精品导航一区二区| 亚洲综合第一页| 好爽视频在线观看视频| 亚洲丝袜诱惑| 啪啪视频免费在线观看| 日日骚AV| 美女裸体无遮挡永久免费观看网站| BBBBB97COM| 日韩人妻无码不卡网站| 久久9精品| 99re视频这里只有精品| 一本色道综合久久欧美日韩精品| 亚洲天堂另类| 精品国产乱子伦一区二区三区,精品一| 久久精品国产99久久,亚洲日韩久久日本一区一区三区 | 精品中文日韩字幕视频| 日本孕妇孕交| 日韩欧美久久婷婷网站| 久久九九97| 欧美色图第一页| 日本精品五区| 浓厚中出中文字幕在线| 韩国黄片aaaa| 欧美亚洲中文字幕| 男人的天堂不卡一区二区| 九九热免费视频| 91男女啊啊啊| 日日干男人的天堂| 欧美色图99| 久夜视频| 免费啪啪av| 在线人人人人人人精品超| 欧美黄片视频在线观看免费| 国产强奸乱伦第1页| 午夜性刺激视频免费观看| 男人高清无码一区二区| 天天干天天中出av| 亚洲天堂 视频你懂的| 在线情色电影 91大| 青草青草久热| 思思热国产在线视频| 五月丁香社区婷婷日韩欧美精品影院| 日韩啪啪网| 亚洲中文制服诱惑| 夜夜骑操视频| 综合久久97| 欧美性爱第一区| 国产激情视频在线观看| 人妻无码后入| 精品女同一区二区三区| 午夜男女爽爽爽影院视频| 日本免费中文字幕在线| 伊人影院中文字幕| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 亚洲欧美大| 蜜桃久久久久久久久久久久| 精品久久97| 17c在线成人免费A片观看| 翔田千里av一区二区三区| 色呦呦、国产精品| 欧美偷| 亚洲最新Av| 亚洲欧洲综合视频在线| 久久少妇视频| 亚州色综合| 国产精品久久久久久久黄无码| 欧美亚洲丝袜人妻制服99| 金典av| 亚洲精品久久久久毛片A片拉屎 | 久久亚洲欧美一区二区三区-亚洲国产精品第一区二区 | 老熟妇综合| 精品玖九九久| 亚洲欧洲国产综合av| 欧美久久久15P| 免费视频一二三区| 永久电影三级在线观看| 一区二区三区日韩欧美 | 久久‘黄片视频| 91亚洲不卡一区| 人妻激情视频| 色爱三区| 丝袜美女诱惑 91 视频| 人妻9117c| 精品一区二区三区蜜桃臀赵总 | 午夜视频久久久久一区| 国产精品经典一卡久久久 | 992视频一区| 人妻中文字幕日韩电影| 中文字幕精品久久久久人妻红杏ⅰ| 精品日韩| 亚洲色天堂日韩中| 大香蕉中文在线| 超碰国产在线| 粉嫩av一区二区三区天美传媒| 午夜精品探花| 密臀国产在线| 成人午夜视频免费播放| 天天天堂影视日韩亚洲91| 五月天久久综合网| 熟女欧美日韩综合婷婷| 精品久久久久久无码| 黄色成品网站| 欧美日韩性爱电影在线| 神马久久久久久久久久| 无码免费在线观看黄色片| 顶级少妇BT天堂| 日韩欧美亚洲自拍偷拍| 久久9精品视频| 26uuu最新| 97国伦国色| 岛国黄片网站| 亚洲性图91| 国产剧情AV不卡在线观看| 国产女主播视频在线观看| 全免费a敌肛交毛片免费| 久久久久婷婷精品av电影| 天天色综亚洲91污| 天天影视91看看| 99精品在线观看| 男人的天堂va| 91天堂视频| 乳欲人妻办公室奶水| 亚洲国产亚洲天堂| 开心五月深爱五月| 国产精品视频内谢女人| 欧美成人色| 午夜福利成人免费视频| 久久久久久九九九九| 免費人妻夜夜爽天天爽爽一区| 精品美女久久久久| 亚洲清纯唯美| www.91色综合| 亚洲中文一区二区三区| 东北女人性交| 中文字幕在线观看第二页| 懂色av色欲av蜜臀av| 日本亚欧爱爱| 国产怡红院| 欧美另类综合久久| 中文字幕在线免费观看 | 国产精品白丝www| 白丝1区2区3区| 人人摸人人添人人操| 亚洲少妇视频| 和协影院中文字幕三区| 亚洲 日韩 欧美 国产综合体| 欧美性爽xyxOOOO| 久久原创中文| 亚洲色图欧美色图制服丝袜| 国产精品岛国片在线观看| 啊啊啊想要| 日韩无码久久熟女一级片| 夜夜爽33333| 丰满人妻无码一区二区三区| 伊人久久AV诱惑悠悠| 久久国模av| 亚洲丝袜色| 无码精品蜜桃一区二区三区ww| 男人久久天堂| 舔人妻中文免费视频| 很黄很污的免费网站| 日本高清一区二区在线| A级片日韩欧美国产欧美视频精选观看 | 女人爽到高潮潮喷18禁网站| 中国操逼无码| 深夜视频| 精品久操| 亚洲图片 激情小说| 嗯啊啊啊轻点视频| 狠狠干综合| 99久久精品无码一区二区| 四虎国产精品永久在线囯在线| 精品大全99999| www.高清无码诱惑一区.com | 97精品网站| 艳尻美人妻| 欧美美女啪啪视频| 天天综合色| 亚欧韩av| 思思性爱| 精品亚洲黄色片 国产精品导航一区二区 | AV天黑人| 人妻素股| 色眯眯av| 97在线资源| 精品十三区| 国产九九久久久精品| 丰满人妻-区二区三区免费| www.人人cao| 日韩激情中文字幕有码| 丰满岳乱妇一区二区三区| 秋霞操逼片| 一区二区三区免费视频入口| 国产精品九九九| 亚洲有码视频二区| 夜夜躁狠狠躁日日躁av| 亚洲人综合19| 男女国产精品| 99re这里只有精品9| 中文字幕乱码在线观看| 色图四区| 一区二区三区不卡视频| 大香蕉久久| 综合久久97| 91操操操操| 欧美成人性爱视频在线播放| 亚洲婷婷综合网| 被窝影院午夜看片无码| 日本操逼视频不卡直接放| 久久久精品电影| 波多野结衣一级视频| 欧美aaaaaaa| 精品国产乱码久久久久久口爆网站| 免费在线黄片视频| 操逼操操操91| 淫妻综合网| 97操97色| 美日韩一二三区| 劲爆欧美人妖三区91| AV男人天堂网| 男人综合网| 欧美一区二区三区不卡高清视频| 成全动漫视频观看免费下载| 国产精品久久久久久无码红治院| 美女操逼福利视频| 丁香六月啪啪| 日本精品人妻少妇一区二区| 欧色性第一页| 日日骚av| 亚洲无码精品AV久久久| 国产亚洲中文不卡二区| 91精品久久久久久77777| 色香色香欲天天天影视综合网| 黄色成品网站| 丰满丝袜少妇AV| 久午视频| 亚洲欧洲综合成人av一区| 久久99午夜精品一区人妻| 无码又爽又硬又激情免费视频| 伊人大香蕉在线| 99re在线精品78| 欧美宗合网| 美女操逼A A| 久草视频分类在线| 超碰 另类 欧美| 色香综合天天影视综合 | 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 韩国黄片aaaa| 人妻嗯啊啊在线播放| 天天碰操中国年青熟妇| 日日骚av| 男人天堂黄片| 日本精品一区三区| 日韩一级二级三级免费看完整版国语版| 色网亚洲人| 家庭乱伦国产精品| 九九色图| 久久久久9999精品九九九| 日韩一级二级三级| 国产精品久久99日日| 草草影院在线视频| 中字一区| 欧美激情性久久久久久| 亚洲天堂综合AV| 亚洲91综合| 性爱视频免费网址| 婷婷色色网| 亚洲综合校园春色| 91大神精品长腿在线观看网站| 丁香色五月 97干| 午夜欧美女人操逼| 天堂九九九九九九九九九| 啊啊啊啊好疼视频| 黄色大片免费在线| 色欧美天天| 九九这里只有精品| 欧美老妇曰批的视频| 青青草原狼av| 午夜啊啊| 一区二区三区机械有限公司| 精品久久大胆人体| 美国日韩黄片| 日韩有码免费视频| 亚洲中文丝袜美腿诱惑字幕| 亚洲日韩美女中文字幕乱| 91jk色拍| 国产精品不卡一区二区三区av| 色综合久久888| 欧美色图在线视频少妇| 中文精品一区二去| 激情亚洲天堂| 欧洲黄色网| 亚洲精品色| 人妻三级在线中文字幕| 在线视频免费观看午夜| 国产超碰人人操| AV在线资源| 亚洲成人黄色在线观看| 天天影视综合网欧美精品| 嗯嗯啊啊的视频| 少妇人妻好深太紧了vr91| 亚洲欧洲综合视频在线| 青青久操| 国内亚洲高清无码| 亚洲中文字幕乱码无码一区二区| 啊啊啊啊啊啊啊啊要喷了| 无码137片内射在线影院| 色哟哟国产精品免费网址| 欧在线一二区| 激情五月天色色网| 日韩欧美蜜桃精品久久中文字幕久久 | 欧美国产日韩高清在线| 日本黄色裸日本黄色裸体| 国内毛片热久久思思热| 嗯啊不要啊啊在线观看视频| 九久久精| 少妇一线天久久久久久| 欧美亚洲综合高清在线| 97干com| 边做饭边操逼逼| 97资源制服丝袜| 好色综合| 日韩视频小说在线观看| 久久伊人最新网址视频| 国产13区| 美国精品国产精品| 激情婷婷丁香| 婷婷色中文字幕| 久久岛国| 91新在线欧美| 99久久精品无码一区二区| 天天天操天天天爱| 久久97| 免费AV中文网在线观看| 欧美 传媒 麻豆 日韩 偷拍| 亚洲国产精品有声| 午夜福利 成人 91| 欧美色棕合| 豆花视频操逼网址| 亚洲日韩资源| 91超碰人人| 日韩激情小说一区二区| 国产精品日日摸天天碰| 五月天色图| 太久视频| 男人亚洲天堂| 黑人精品久久97| 色色综合网站| 91成人高清在线观看| 日日嗷| 国产日韩精品一区二区三区| 精品国产人成在线| 欧美色图 色综合图| 97亚洲欧美日韩| 五月婷丁香| 国产最新小视频在线播放下载 | 精品视频123区小说区| 神马久久久久久伦理片| 极品肉射| 人妻无码一区二区三区久久99| 人妻熟女字幕一区二区| 老熟女乱子伦中文字幕一区二区 | 亚洲的天堂网| 欧美成人9797| 熟女人妇一区二区三区| 中日韩一区二区三区欧美| 国产日韩中文字幕欧美| 中文字幕av久久爽Av| 91操碰| 黄片色区软件| 日韩精品中文字幕人妻| 97ai亚洲| 蜜臀一二三| 蜜桃精品一区二区三区ww | 欧美熟妇精品黑人巨大91| 成人女人国产| 九月婷婷综合| 亚洲天堂7777| 一级二级三级黑人无码| 久久青青草在线视频| 人妻大香蕉| 欧美 熟女 日韩| 高清不卡国产| 免费观看有码高清视频| 插欧洲美女欧美精品| 巨爆乳一区二区爆乳区| 秋霞午夜成人福利片片| 天天欲望网| 夜夜无码| 情色五月天就去干| 91丝袜美腿片| 91N综合在线| 欧美精品久久96人妻无码| 麻豆视频test| 少妇超碰在线| 丁香婷婷久久 | 久久受www免费人成| 欧美天天弄| 日韩十八禁| 欧美狠狠狠| 国产久9| 中文字幕av一区二区三区人妻少妇| 330dv亚洲成年视频网| 精品国产72| 97精品视频免费| 国产精品亚洲四五区在线观看| 玖玖综合.com| 欧美久久九九| 超碰久久性爱| 人妻夜夜爽天天爽麻豆三区网站 | 国产精品一区二区后入| 亚洲欧美一区二区不卡视频播放| 91成人国产综合久久精品蜜月| 97色色色综合网站| 曰本熟女视频| 欧美色图 人妻| 久久综合久色欧美综合狠狠 | 热热色综合网| 久热精品在线| 久草免费在线视频| 亚洲人妻久久| 男女啪啪网站免费视频| 久久超碰国产一区二区三区| 天天做天天爱夜夜爽毛片试看| 99久久国产精品免费高潮| 国产强奸AV在线| 欧美αv.com| 亚洲码专区| 另类图片五月天| 欧洲综合视频| 中文字幕88av在线| 日本男人插女人的逼黄色| 色悠久久久av| 欧美色九九| 丁香色狠狠色综合久久小说| 免费久久一级毛片大黄| 3d成人精品一区二区| 欧美刺激色黄片免费看| 日日狠狠久久偷偷色综合免费| caopeng97| 亚洲和欧美裸体美女双飞视频| 97少妇人妻中文字幕久久| 91狠狠综合久久| 日本孕妇一区二区视频操逼免费看 | 91 亚洲 欧美 日韩 国产 综合| 免费看久久久性性| 国产按摩一区二区三区| 久久综合精品一区二区三区| 色老久久| 五十路熟女人妻一区二区在线观看| 98人妻精品一区二区色欲| 午夜福利精品| 日本超碰在线国产一区| 久久免费精品96| 人妻少妇精品久久久久久| PMv在线观看| 黄aaaaaaaaaaaaaaaaaa色网站| 日韩有码一区三区| 330dv亚洲成年视频网| 理论久久婷婷网8| 精品久久无码午夜福利| 亚洲经典啪啪| 大香蕉99热| 韩日欧亚a级| 日韩精品国产一区二区| 婷色五月| 欧美韩国你懂得在线 | 久久美女福利是上海美女| 91肏屄网| 欧美天天影院| 免费观看国产小粉嫩喷水精品午| 色五月婷婷在线| 欧美日韩青操| 亚洲成a人v欧美综合天堂下载| 福利伊人玖玖国产| 中文字幕一区 二 区 三 四 五 区日 日 骚 | 特级丰满少妇一级AAAA爱毛片 | 国产尹人在线视频免费| 精产国品一区二三产品| 91宗合网| 91动漫操逼视频| 天天综合香 ld视频| 大香蕉伊人75| 性爱乱伦一区| 蜜臀久久99精品| 放黄片放3级黄片没穿衣服| 强免费黄色网址| 日本久久综合| 人人么人人操| 99这里有精品视频| 人妻少妇久久| 亚洲制服aⅴ中文字幕| 超碰 另类 欧美 | 亚洲精品久久久久久久蜜桃臀| 顶级丝袜熟女一区二区三区| 九月丁香婷婷| 91亚洲综合在线| 岛国精品视频在线观看| 91国产在线精品| 中文字幕日韩电影人妻| 久久久久久久久久久97| 91熟女网| 丁香五月激情综合| 精品无人区麻豆乱码1区2区图片| 久操凹凸视频| 蜜臀AV成人精品蜜臀| 亚洲男人综合| 亚洲另类色图片| 天天日天天干天天操| 亚洲中文字幕97久久精品少妇| 亚洲第一页综合在线| 婷婷丁香五月天综合东京热| 人妻人妻天天碰| 精品人妻中文字幕4399| 青娱乐大香蕉| 嫩呦国产一区二区三区AV| 日本A级视频| 亚洲AV无码乱码| 91在线丝袜视频| 国产多人在线观看视频| 黄色十八禁网站| 五月天久久综合网| 又摸又舔在线观看网站| 在线观看高清AV| 东北女人操比视频| 久久乐| 超碰国产精品无码| 日韩一区二区熟女| 亚洲精品天堂久久A∨51成人漫| 久久嫩草国产成人一区| 天天澡天天狠天天天做| 高清不卡国产| A片大香蕉在线| 国产精品久久久777| 天天艹天天日| 97亚洲国产| 色五月综合网| 欧美性91| 亚洲欧美色综合| 制度丝袜99| 一区超碰一区| 人人摸人人干| 91人妻人人澡人人爽人人精品| 久久久av爱| 你想操日本小逼吗| 成人区人妻精品一| 人夜夜精品网站香蕉嫩草| 国产精品懂色tv影视免费观看 | 探花一区二区三| 91黑丝操| 丁香六月激情| 一区在线精品中文字幕| 免费看污网址| 精品超碰国产| 日本精品999| 日本五十路在线| 91在线无码精品秘 软件| 欧美色乱| 欧亚日韩三区| 欧美在线干| 97无码视频在线播放| 校园春色综合香蕉| 九九色色| 午夜乱轮操逼视频免费看| 四虎影视永久在线观看精品免费网站 | 在线看片国产精品每日更新| 欧美性高潮| 亚洲av热热色| 亚洲综合九九| 欧美亚洲素人制服精品| 美女91网| 欧美暴力猛交| 婷婷五月天影院| 九九精品99| 亚洲熟妇A V黑人| 久久久久久久久久精| 啊…啊…操我用力操我| 国产精品嫩草影院免费| 大香蕉久久| 啊啊啊啊在线播放| 人妻一区二区三区| 亚洲午夜av| 午夜福利av电影在线| 超碰色老头| 精久久久| 一级黄碟在线观看| 五月天婷婷欧美三区| 风流老熟女一区二区三区l| 天天日天天干天天操| 偷拍欧美亚洲| 男人网站婷婷| 操人妻丝袜高跟| 欧美日韩操逼嗦吊| 日日插夜夜| 亚洲欧美另类激情小说 | 97露脸精品丝袜| 久久久久成人蜜桃精品| 欧美专区日本专区| 强奸乱伦免费网站| 熟妇色99| 人妻丰满熟妇av无码区蜜桃| 九九九九九九成人| 美女露胸露尿口| 日本99视频| a级理论午夜日本| 啪啪AV导航| 操逼视频国产无套| 啊啊啊操死我| 伊人九九九| 亚洲久久天堂| 色哟哟AV| 久久99草| 性色av一区二区| 欧美高潮在线| 丝袜喷水在线| 在线观看十八禁| 3571色综合一区二区二区| 看一级黄色视频| 亚洲免费人妻在| 少妇高潮对白在线观看| 黄色AAAAA欧美| 色欲av一区二区三区蜜芽| 天天射天天| 国产拍偷精品网站| 日本一区二区中文字幕久久| 啪啪自拍九九综合| 亚洲无码一区成人免费午夜| 国产91丝袜 在线播放| 日本天堂在线播放| 欧美一二级| 玖玖爱伊人玖玖爱| 亚洲色吧网| 天天舔天天 | 国产精品蜜乳AV| 综合免费无码中文| 亚洲第一狼人丝袜美女另类| 天天操人人操狠狠插| 国内精品久久人妻性色av| 欧美日韩另类在线| 逼操网站| 欧美视频一区二区在线| 另类小色呦| www.色综合| 欧洲色色| 台欧久久精品视频| 91色黑人少妇| 中文字幕超碰CAO| 97超碰超欧美。| 中文字幕av一区二区三区人妻少妇 | 九九热最新| 欧美第一页性| 男人干美女| 国产第11页| 中文字幕在线第二页| 综合亚洲网| 91丝袜在线观看| 免费日韩黄片| 日本性爱不卡视频| 久99热| 久久99国产综合精品女同| 天天弄欧美| 97超碰精品成| 青青草色AV| 久久久久亚洲Av无码专区老牛影视| 搡老熟女免费视频| 国产精品麻豆视频网站| 91粉嫩萝控精品福利网站_精品影音先锋国| 青娱乐日韩无码| 999久久久九| 欧美影音在线| 人妻第一页| 亚洲 中文字幕 精品| 日韩精品中文字幕一| 99操| 美女啪欧美一区| 干美女人妻| 久久产精品一区二区三区电影 | 久久久久久久97| 亚洲伊人a线观看视频| 欧美啪啪女女| a男人的天堂| 综合情欲网| 999久久久免费精品国产牛牛| 亚洲一区二区三区AV无码| 91婷婷伊人狠人|