🧭 一、項目立項與需求分析階段(0%)
1.1 商業需求確認
- 與產品經理溝通核心業務目標
- 目標:構建一個圖書管理系統
- 用戶:圖書管理員、普通用戶
- 功能:登錄、查看、增刪改圖書、權限控制、分頁、搜索
1.2 輸出文檔
- PRD(產品需求文檔)
- ER圖(數據建模)
- UML 用例圖
- 接口草圖(API Mock 文檔)
- 項目甘特圖 / 工作排期(Jira/TAPD)
🧱 二、系統設計與環境準備階段(10%)
2.1 技術棧選擇(通用、可復用)
層級 | 技術選型 |
---|---|
前端模板引擎 | Thymeleaf、Bootstrap |
控制層 | Spring Boot Web MVC |
服務層 | Spring @Service + AOP |
DAO 層 | Spring Data JPA + Hibernate |
數據庫 | MySQL(可選 PostgreSQL) |
安全模塊 | Spring Security + Session/Cookie |
配置管理 | application.yml + profiles |
單元測試 | JUnit5 + Mockito |
集成測試 | MockMvc + TestContainers |
2.2 開發工具準備
工具類型 | 建議 |
---|---|
IDE | IntelliJ IDEA Ultimate |
構建工具 | Maven |
版本控制 | Git + GitHub/GitLab |
數據庫 | MySQL 8 + Navicat |
開發數據庫 | dev_bookdb |
瀏覽器插件 | Postman / REST Client |
日志工具 | Logback + JSON Format |
2.3 項目初始化(Spring Boot)
使用 Spring Initializr 初始化:
- Group:
com.example
- Artifact:
bookmanager
- Packaging:Jar
- Java:17
- Dependencies:
- Spring Web
- Spring Data JPA
- Thymeleaf
- MySQL Driver
- Spring Boot DevTools
- Lombok(可選)
📐 三、數據庫設計與模型映射(20%)
3.1 數據庫設計
用 Navicat 或 dbdiagram.io 畫出 ER 圖:
- 用戶表(users)
- 圖書表(books)
- 管理員角色表(roles)
sql復制編輯CREATE TABLE users (id BIGINT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(50) NOT NULL UNIQUE,password VARCHAR(100),role ENUM('USER', 'ADMIN')
);CREATE TABLE books (id BIGINT PRIMARY KEY AUTO_INCREMENT,title VARCHAR(100),author VARCHAR(100),price DOUBLE
);
3.2 實體類映射
使用 JPA 實體類標注:
java復制編輯@Entity
public class Book {@Id @GeneratedValueprivate Long id;private String title;private String author;private Double price;
}
?? 四、項目分層架構設計(30%)
4.1 分層思想(經典 4 層架構)
javascript復制編輯Controller(Web控制層) ← 接收請求、返回視圖或 JSON
↓
Service(業務邏輯層) ← 處理事務邏輯
↓
Repository(數據訪問層) ← 連接數據庫
↓
Entity(數據模型層) ← POJO、映射表
4.2 包結構設計
bash復制編輯com.example.bookmanager
├── controller # 控制器
├── service # 業務邏輯
├── repository # 數據庫訪問
├── entity # 數據模型
├── config # 配置類
├── security # 登錄權限
└── BookManagerApplication.java
🛠? 五、模塊開發詳細步驟(40%~70%)
5.1 編寫實體類 Book
、User
配合數據庫映射使用 @Entity
、@Column
、@Id
注解
5.2 編寫 Repository 接口
java復制編輯public interface BookRepository extends JpaRepository<Book, Long> {List<Book> findByTitleContaining(String keyword);
}
5.3 編寫業務 Service 層
java復制編輯@Service
public class BookService {@Autowiredprivate BookRepository repo;public List<Book> listAll() {return repo.findAll();}public void save(Book book) {repo.save(book);}
}
5.4 編寫控制器 Controller 層
java復制編輯@Controller
public class BookController {@Autowiredprivate BookService service;@GetMapping("/")public String viewHomePage(Model model) {model.addAttribute("listBooks", service.listAll());return "index";}@PostMapping("/save")public String saveBook(@ModelAttribute("book") Book book) {service.save(book);return "redirect:/";}
}
5.5 頁面開發(Thymeleaf 模板)
在 resources/templates/
下:
- index.html:主頁
- new_book.html:添加頁面
- edit_book.html:編輯頁面
🔐 六、登錄權限管理模塊(80%)
6.1 集成 Spring Security
xml復制編輯<!-- pom.xml -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>
6.2 配置用戶名密碼
yaml復制編輯spring:security:user:name: adminpassword: admin123
或自定義認證邏輯 + 數據庫存儲用戶密碼 + BCrypt 加密。
🔍 七、測試、異常處理、優化階段(90%)
7.1 單元測試
java復制編輯@SpringBootTest
class BookServiceTest {@Autowired BookService service;@Testvoid testListAll() {List<Book> books = service.listAll();assertFalse(books.isEmpty());}
}
7.2 異常處理(全局異常)
java復制編輯@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public String handleException(Exception e, Model model) {model.addAttribute("error", e.getMessage());return "error";}
}
📦 八、構建、部署、上線(100%)
8.1 項目打包
bash復制編輯
mvn clean package
生成 bookmanager-0.0.1-SNAPSHOT.jar
8.2 運行方式
bash復制編輯
java -jar target/bookmanager-0.0.1-SNAPSHOT.jar
8.3 Docker 化部署
dockerfile復制編輯FROM openjdk:17
ADD target/bookmanager.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
bash復制編輯docker build -t bookmanager .
docker run -p 8080:8080 bookmanager
8.4 發布流程(傳統方式)
- 上傳 Jar 到服務器
- 使用 systemd 管理后臺進程
- nginx 做反向代理,綁定域名
📊 九、整體項目節奏與時間分布(實際開發)
階段 | 時間占比 | 說明 |
---|---|---|
需求分析與設計 | 10% | 通常 1~2 天 |
環境準備與初始化 | 5% | 項目生成 + 配置 + DB連接 |
模塊開發 | 40% | 重點開發,持續集成 |
頁面開發 + 安全 | 15% | UI 渲染、登錄校驗 |
測試與優化 | 20% | 單元、接口、異常、性能 |
構建 + 部署上線 | 10% | Docker 或 Jar 發布 |
🧩 十、高級功能
🔍 1. 搜索與分頁功能(Spring Data JPA + Thymeleaf)
? 功能目標:
- 支持用戶按關鍵字搜索圖書
- 每頁顯示固定數量(如 10 條)
📦 依賴:
Spring Boot 已內置分頁支持,無需額外依賴
🧠 Service 層實現:
java復制編輯public Page<Book> listAll(int pageNum, String keyword) {Pageable pageable = PageRequest.of(pageNum - 1, 10); // 第0頁起if (keyword != null && !keyword.isEmpty()) {return repo.findByTitleContaining(keyword, pageable);}return repo.findAll(pageable);
}
📚 Repository 接口:
java復制編輯
Page<Book> findByTitleContaining(String keyword, Pageable pageable);
🌐 Controller 控制器:
java復制編輯@GetMapping("/")
public String viewHomePage(@RequestParam(defaultValue = "1") int page,@RequestParam(required = false) String keyword,Model model) {Page<Book> bookPage = service.listAll(page, keyword);model.addAttribute("bookPage", bookPage);model.addAttribute("currentPage", page);model.addAttribute("keyword", keyword);return "index";
}
🖼? 頁面模板 index.html(簡化):
html復制編輯<form method="get" action="/"><input type="text" name="keyword" placeholder="搜索書名" value="${keyword}"><button type="submit">搜索</button>
</form><div th:each="book : ${bookPage.content}"><p th:text="${book.title}"></p>
</div><div><span th:text="'第 ' + ${currentPage} + ' 頁'"></span><a th:href="@{'/?page=' + (${currentPage} - 1) + '&keyword=' + ${keyword}}">上一頁</a><a th:href="@{'/?page=' + (${currentPage} + 1) + '&keyword=' + ${keyword}}">下一頁</a>
</div>
🧵 2. 文件上傳(Multipart + 本地存儲)
? 功能目標:
- 圖書添加時上傳封面圖
📦 Maven 依賴(已內置)
Spring Boot 自動啟用 Multipart
🧠 配置文件:
yaml復制編輯spring:servlet:multipart:enabled: truemax-file-size: 2MBmax-request-size: 5MBupload:dir: uploads/
📂 Controller 示例:
java復制編輯@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException {String uploadDir = "uploads/";String filename = UUID.randomUUID() + "_" + file.getOriginalFilename();Path path = Paths.get(uploadDir + filename);Files.createDirectories(path.getParent());Files.write(path, file.getBytes());return "redirect:/?uploadSuccess=true";
}
📋 HTML 上傳表單:
html復制編輯<form method="post" action="/upload" enctype="multipart/form-data"><input type="file" name="file" /><button type="submit">上傳</button>
</form>
🛡? 3. JWT 用戶認證(前后端分離準備)
? 功能目標:
- 用戶登錄后返回 JWT
- 前端攜帶 token 訪問接口
📦 添加依賴:
xml復制編輯<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.11.5</version>
</dependency>
🧠 JWT 工具類:
java復制編輯public class JwtUtil {private static final String SECRET_KEY = "secret123";public static String generateToken(String username) {return Jwts.builder().setSubject(username).setIssuedAt(new Date()).setExpiration(new Date(System.currentTimeMillis() + 86400000)) // 1天.signWith(SignatureAlgorithm.HS512, SECRET_KEY).compact();}public static String extractUsername(String token) {return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody().getSubject();}
}
🚪 登錄接口返回 JWT:
java復制編輯@RestController
public class AuthController {@PostMapping("/api/login")public ResponseEntity<?> login(@RequestBody LoginRequest login) {if (login.getUsername().equals("admin") && login.getPassword().equals("1234")) {String token = JwtUtil.generateToken(login.getUsername());return ResponseEntity.ok(Map.of("token", token));}return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid credentials");}
}
🔐 使用 JWT 做權限過濾器:
自定義 OncePerRequestFilter
解碼并設置 SecurityContextHolder
,可在需要認證的接口中通過 @AuthenticationPrincipal
拿用戶。
🚦 4. 接口限流(Rate Limiting)
? 功能目標:
- 每 IP 每分鐘最多請求 N 次(比如 20 次)
📦 方法一:使用 Bucket4j(令牌桶)
xml復制編輯<dependency><groupId>com.github.vladimir-bukhtoyarov</groupId><artifactId>bucket4j-core</artifactId><version>8.4.0</version>
</dependency>
💡 攔截器實現(偽代碼):
java復制編輯@Component
public class RateLimitInterceptor extends HandlerInterceptorAdapter {private final Map<String, Bucket> ipBucketMap = new ConcurrentHashMap<>();private Bucket resolveBucket(String ip) {return ipBucketMap.computeIfAbsent(ip, key ->Bucket4j.builder().addLimit(Bandwidth.classic(20, Refill.greedy(20, Duration.ofMinutes(1)))).build());}@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {String ip = request.getRemoteAddr();Bucket bucket = resolveBucket(ip);if (bucket.tryConsume(1)) {return true;}response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value());response.getWriter().write("Rate limit exceeded");return false;}
}
然后注冊到 WebMvcConfigurer 的 addInterceptors()
。
🏁 整體功能架構整合圖
plaintext復制編輯[Spring Boot + Spring Security + JPA]↓ ↓ ↓JWT認證 分頁搜索 文件上傳↓ ↓ ↓REST風格接口 HTML頁面 本地磁盤↓接口限流(Bucket4j)
? 總結:完整流程圖(開發視角)
plaintext復制編輯[需求 → 技術選型 → 架構 → 實體建模 → DB設計]↓[項目初始化 → 多層結構 → Controller/Service/Repo]↓[頁面開發 + Thymeleaf + Bootstrap]↓[登錄權限 + 測試 + 異常處理]↓[Maven打包 + Docker部署 + 上線發布]