roapskipper/TEAM4

GitHub: roapskipper/TEAM4

一个基于 Java 21 和 JavaFX 的实时在线拍卖系统,实现了并发安全竞价、自动出价、防狙击等高级拍卖功能。

Stars: 7 | Forks: 1

# AuctionSpace: 实时在线拍卖系统 🚀 ## 简介 (Abstract) **AuctionSpace** 是一个基于 Client-Server 架构的在线拍卖系统,完全使用 Java 21 和 JavaFX 17+ 开发。该系统提供实时拍卖体验,支持并发处理以避免数据争用(Lost Update、Race Condition),并集成了自动竞价、防狙击以及直观的价格波动图表等高级功能。 界面设计采用 **“The Heritage”** 概念——灵感来自苏富比的传统奢华风格,采用深勃艮第红(`#722F37`)搭配奶油色(`#FBF9F6`)背景,以及 Playfair Display + Lato 字体组合。 本项目由 **K70I-IT6 班第 4 小组**(越南国立大学河内分校 - 科技大学)开发。 ## 👥 团队成员与任务分工 (Team Roles) | 成员 | 主要角色 | 具体任务 | | :--- | :--- | :--- | | **Hải Anh** | Backend & Architect | 设计系统架构,处理并发(同时竞拍),实现主要设计模式(Singleton、Factory)。 | | **Trung** | Database & Logic | 管理 Database (DAO),编写 User/Item 管理逻辑,处理状态转换逻辑和中标计分。 | | **Bình** | Frontend (GUI) | 开发所有 JavaFX/FXML 界面(动态表单),处理实时价格曲线(价格图表)的显示并集成 Observer Client。 | | **Lộc** | Networking & QA | 处理 Socket/API 连接,实现 Auto-Bidding、Anti-sniping,编写单元测试 并在 GitHub Actions 上设置 CI/CD。 | ## 🌟 核心功能与业务亮点 (Key Features) 系统满足所有必做功能,并最大程度集成了题目要求的加分功能: ### 1. 核心功能 (Core Functions) - **4级权限管理:** 登录/注册支持4种角色: - **Super Admin:** 拥有系统所有权限,为普通 Admin 生成 admin code。 - **普通 Admin:** 封禁账号,标记违规商品(登录时需要输入 admin code)。 - **Seller:** 发布商品,创建拍卖会。 - **Bidder:** 参与拍卖,出价。 - **拍卖会管理 (状态机):** 严格执行状态转换 `PENDING → RUNNING → FINISHED → PAID / CANCELLED`。 - **异常处理:** 严格拦截各种情况:出价低于当前价、拍卖会已关闭时出价、网络突然断开(Socket timeout)。 ### 2. 高级功能 (Advanced & Bonus Features) - **并发出价:** 彻底解决数十人在千分之一秒内同时按下出价按钮时的*Lost Update*和*Race Condition*问题。确保数据完整性(不会有人被错扣钱,不会有两个赢家)。 - **自动竞价:** 用户设置 *maxBid* 和 *increment*,系统使用算法 自动加价竞争榜首。 - **防狙击算法:** 如果在最后几秒检测到突然出价,会自动延长拍卖时间。 - **实时价格曲线:** 使用折线图 将出价历史可视化,实时绘制,无需刷新页面。 ### 3. 出价限制规则 (Bid Cap Rule) 为了防止恶意“抬价”或错误出价(例如:1次出价从1百万跳到5亿),系统基于拍卖会的当前价格(`x`)应用**阶梯限制**。允许的最高出价 = `multiplier × x`,其中系数 `multiplier` 随着价格的增加而降低: | 当前价格范围 (x) | 最大系数 | 允许的最大出价 | | :--- | :---: | :--- | | `0 < x < 1.000.000` | **5x** | 当前价格的5倍 | | `1.000.000 ≤ x < 5.000.000` | **4x** | 当前价格的4倍 | | `5.000.000 ≤ x < 25.000.000` | **3x** | 当前价格的3倍 | | `25.000.000 ≤ x < 50.000.000` | **2x** | 当前价格的2倍 | | `50.000.000 ≤ x < 100.000.000` | **1.8x** | 当前价格的1.8倍 | | `100.000.000 ≤ x < 250.000.000` | **1.5x** | 当前价格的1.5倍 | | `250.000.000 ≤ x ≤ 500.000.000` | **1.3x** | 当前价格的1.3倍 | **设计依据:** - **越贵越严:** 对于便宜的商品 (< 1百万),用户可以大手笔出价 (5倍) 以快速竞争。对于昂贵的商品 (> 2.5亿),系数降至 1.3倍,因为绝对差额已经非常大——不需要高倍数。 - **防止“恶意竞价”:** 用户无法通过出价过高来震慑他人,从而“破坏游戏”。 - **保护买家心理:** 避免在看到价格发生不合理暴涨时产生 FOMO。 该规则一致应用于**手动出价**和**自动出价最大限制**——用户为系统自动出价设置的 `maxBid` 不能超过此限制。 ## 🏗 面向对象设计 (OOP) 与架构 系统严格遵守 OOP 的4个核心原则,并使用分层的 MVC Client-Server 架构。 ### 1. 应用 OOP 的 4 个原则 - **封装:** 保护所有系统数据(private/protected 字段),仅允许通过经过审查的 getter/setter 进行访问。 - **继承:** 建立清晰的对象层级(例如:`Admin`、`Bidder`、`Seller` 继承自 `User`)。 - **多态:** 根据不同的产品类型重写 诸如 `getDetails()` 或 `calculateFee()` 等方法。 - **抽象:** 声明抽象类(`Item`)和接口,作为 5 个产品类别(电子产品、艺术品、时尚单品、收藏品、车辆)的标准蓝图。 ### 2. 应用的设计模式 - **Factory Method:** 动态创建产品类型(`ItemFactory`),与 JavaFX 界面上的 Dynamic Form 灵活结合。 - **Observer Pattern:** 同步多用户界面。Server 充当 Subject,通过 Socket 将价格更新信号推送到各个 Client(Observers),而无需进行会导致网络拥塞的轮询。 - **Singleton Pattern:** 管理到 Database(`DatabaseManager`)和 `AuctionManager` 的唯一连接线程。 ## 🎨 界面设计 (UI/UX) 界面采用了 **The Heritage** 概念,并在整个系统中保持一致的设计原则: | 组件 | 规范 | | :--- | :--- | | **概念** | 传统、富有、历史悠久(灵感来自苏富比) | | **主背景** | 奶油色 `#FBF9F6` | | **卡片 / Card** | 纯白色 `#FFFFFF` | | **强调色 / 按钮** | 深勃艮第红 `#722F37` | | **文字** | 炭灰色 `#2C2C2C` | | **标题字体** | Playfair Display | | **正文字体** | Lato | | **卡片效果** | 柔和阴影:`dropshadow(three-pass-box, rgba(0,0,0,0.08), 15, 0, 0, 4)` | | **竞价计时器** | 使用等宽字体(表格数字)以便倒计时时不会横向抖动 | ## 📂 项目结构 系统按照 MVC 和 Client-Server 模型清晰地划分为多个模块: ``` AuctionSystem/ ├── src/ │ ├── main/ │ │ ├── java/com/team4/ │ │ │ ├── client/ # Giao tiếp mạng phía Client (ApiClient, Client) │ │ │ ├── controller/ # Controller cho các màn JavaFX │ │ │ ├── dao/ # Data Access Object — truy vấn Database │ │ │ ├── db/ # Quản lý kết nối DB (DatabaseManager - Singleton) │ │ │ ├── factory/ # Factory Pattern khởi tạo 5 loại sản phẩm │ │ │ ├── handler/ # Xử lý request/response Client - Server │ │ │ ├── model/ # Các thực thể (User, Item, Auction, AutoBidding...) │ │ │ ├── network/ # Quản lý gói tin và giao tiếp mạng chung │ │ │ ├── observer/ # Observer Pattern cho cập nhật Real-time │ │ │ ├── server/ # Lõi Server xử lý API và Socket │ │ │ ├── service/ # Luồng nghiệp vụ chính (AuctionManager) │ │ │ ├── util/ # Tiện ích (UserSession, Hash...) │ │ │ ├── Launcher.java # Điểm khởi chạy ứng dụng (Bypass JavaFX module layer) │ │ │ ├── Main.java # Cấu hình JavaFX Application │ │ │ └── TestConnect.java # Test nhanh kết nối DB │ │ └── resources/ │ │ ├── com/team4/view/ │ │ │ ├── admin_auctions.fxml │ │ │ ├── admin_dashboard.fxml │ │ │ ├── admin_users.fxml │ │ │ ├── bidder_auctions.fxml │ │ │ ├── bidding_room.fxml │ │ │ ├── login.fxml │ │ │ ├── main.fxml │ │ │ ├── profile.fxml │ │ │ ├── seller_products.fxml │ │ │ └── style.css # CSS theo concept The Heritage │ │ ├── fonts/ # Font Playfair Display & Lato (TTF) │ │ ├── data.sql # Dữ liệu khởi tạo mẫu │ │ ├── schema.sql # Định nghĩa cấu trúc Database (MySQL) │ │ ├── database.properties # Cấu hình kết nối DB │ │ └── logback.xml # Cấu hình logging │ └── test/ # Unit Test (JUnit) ├── target/ # Output build của Maven (auto-generated) ├── KeHoachTrienKhaiBackend_AuctionSystem.pdf # Tài liệu kế hoạch Backend ├── API_Contract.md # Đặc tả giao tiếp API Client - Server ├── Query.sql # Các câu truy vấn mẫu / debug ├── .env.example # Mẫu file biến môi trường ├── .gitignore ├── pom.xml # Cấu hình Maven & Dependencies └── README.md # Tài liệu tổng quan dự án ``` ## 🛠 标准与技术 系统设计符合行业标准: | 类别 | 技术/标准 | | :--- | :--- | | **语言** | Java 21 | | **GUI Framework** | JavaFX 17+ (FXML, CSS) | | **Database** | MySQL 8.0 (charset `utf8mb4_unicode_ci`) | | **网络通信** | Socket TCP (实时) + REST API JSON (CRUD) | | **构建工具** | Apache Maven | | **编码规范** | Google Java Style Guide | | **版本控制** | Git — Conventional Commits,按 feature 分支 | | **测试** | JUnit 5 | | **CI/CD** | GitHub Actions | ## 📅 路线图与当前进度 - [x] **第一阶段:** 需求分析,OOP 设计,Database 结构设计以及技术选型。 - [x] **第二阶段:** 构建 Backend 基础,Server-Client 收发 JSON,配置 Singleton & Factory。 - [x] **第三阶段:** 完整开发 JavaFX GUI — 4种角色的登录/注册,各角色的 dashboard,拍卖室,个人资料,应用 The Heritage 概念和响应式布局。 - [ ] **第四阶段(进行中):** 处理并发(加锁防止 Lost Update),Auto-Bidding,Anti-sniping,通过 Observer Pattern 更新实时价格图表。 - [ ] **第五阶段:** 完善单元测试,按 Google Style 重构代码,打包并编写最终文档。 ## 💻 构建与运行指南 ### 环境要求 - **JDK 21** (或更高版本) - **Maven 3.8+** - 运行在 `localhost:3306` 的 **MySQL 8.0** ### 操作步骤 ``` # 1. Clone 项目到本地 git clone https://github.com/roapskipper/TEAM4.git cd TEAM4/AuctionSystem # 2. 配置环境变量 cp .env.example .env # 打开 .env 并根据你本地的 MySQL 填写 DB_USER, DB_PASSWORD # 3. 创建 database 并 import schema + 示例 data mysql -u root -p < src/main/resources/schema.sql mysql -u root -p auction_system < src/main/resources/data.sql # 4. 安装 dependencies mvn clean install # 5. 运行 Server (terminal 1) mvn exec:java -Dexec.mainClass="com.team4.server.ApiServer" # 6. 运行 Client Application (terminal 2) # 必须从 Launcher.java 文件运行,以 bypass JDK 11+ 上 JavaFX 的 module layer 错误 mvn exec:java -Dexec.mainClass="com.team4.Launcher" ``` ## 🔐 测试账号 使用以下账号访问 Client Application 并测试相应的权限流程: | 角色 | Username | Password | Admin Code | 主要功能 | | :--- | :--- | :--- | :--- | :--- | | **Super Admin** | `superadmin` | `admin123` | `adminteam4` | 管理整个系统,为普通 Admin 生成代码。 | | **Seller (Mixi Shop)** | `domixi` | `seller123` | — | 发布商品,创建和管理自己的拍卖会。 | | **Seller (Shop Chất)** | `daucatmoi` | `seller123` | — | 同上 — 用于测试多卖家场景。 | | **Bidder (1千万)** | `ueteee` | `bidder123` | — | 以较低余额参与拍卖 — 测试余额不足逻辑。 | | **Bidder (1亿)** | `thichthimua` | `bidder123` | — | 以较高余额参与拍卖 — 测试正常出价流程。 | ## ⚠️ 重要提示
标签:C/S架构, DAO模式, GitHub Actions, Java 21, JavaFX 17, JUnit, Socket编程, UI设计, 二手交易, 价格曲线, 传统奢华风, 全英文项目, 单例模式, 单元测试, 在线拍卖系统, 域名枚举, 实时竞价, 工厂模式, 数据库管理, 桌面应用, 竞拍平台, 自动出价, 自动笔记, 观察者模式, 设计模式, 防狙击