摘要

本文以“在線圖書借閲平台”為案例,通過飛算JavaAI的【智能引導】功能實現代碼高效生成,並針對複雜業務邏輯(如多維度圖書借閲生命週期管理)進行深度優化。

前言

飛算Java AI圍繞與AI協同開發,提供多維度功能助力高效開發:左側智能會話含編程智能體自動執行編程任務、智能問答實時答疑、Java Chat做工程分析與代碼優化;中間引導式生成完整項目,先拆解任務(需求理解到業務邏輯生成),再逐層產出源碼並實時預覽確認;右側Java工具箱的項目分析器一鍵生成項目文檔,SQL Chat實現自然語言轉SQL提效數據庫操作;底部還能深度學習用户偏好、智能分析現有項目,從個性化適配到項目級優化全方位賦能Java開發全流程。

新手安裝:

【JAVA項目實戰】【圖書管理系統】借閲管理功能【Servlet】+【Ajax】+【MySql】+【Session】_java借書還書_系統配置

【JAVA項目實戰】【圖書管理系統】借閲管理功能【Servlet】+【Ajax】+【MySql】+【Session】_java借書還書_#Java開發_02

  • idea安裝後看到效果。

一、內容框架總覽

核心模塊

關鍵要求

本文實現方式

需求分析與規劃

功能需求、核心模塊、技術選型

詳細定義系統功能清單(借閲管理)、繪製模塊關係圖與ER圖,明確Spring Boot+MySQL技術棧

優化與調試心得

記錄代碼調整、SQL優化等問題及解決方案(如利用智能會話功能)

分析自動生成代碼的字段匹配錯誤、複雜查詢性能瓶頸,展示手動優化與AI輔助調試過程

二.開發實戰

2.2 飛算JavaAI開發

2.2.1 進行AI開發

點擊只能引導模塊,進行需求輸入後,ai會給出對應生成應答:

【JAVA項目實戰】【圖書管理系統】借閲管理功能【Servlet】+【Ajax】+【MySql】+【Session】_java借書還書_系統配置_03

【JAVA項目實戰】【圖書管理系統】借閲管理功能【Servlet】+【Ajax】+【MySql】+【Session】_java借書還書_#Java開發_04

  • 該項目需求可拆解為10個關鍵功能點,涵蓋用户管理(註冊、登錄、信息維護與權限控制)、圖書信息管理(增刪改查)、圖書分類管理(創建編輯及關聯圖書)、借閲記錄管理(借閲、歸還、續借)、預約管理(缺書預約與提醒)、庫存管理(實時更新可借數量與狀態)、搜索功能(多方式查書)、消息推送(借閲及逾期等通知)、數據統計(出借閲量等報表)和系統配置管理(基礎參數與規則設置),各功能點可按需調整以全面滿足圖書管理相關業務場景需求。

對應接口:

【JAVA項目實戰】【圖書管理系統】借閲管理功能【Servlet】+【Ajax】+【MySql】+【Session】_java借書還書_#Java開發_05

  • 一共8個功能模塊,分別是可創建編輯並與圖書關聯、進行結構化組織的圖書分類管理;處理借閲、歸還、續借及記錄操作的借閲記錄管理;支持缺書預約、自動通知等的預約管理;實時跟蹤並更新可借數量與狀態的庫存管理;通過多種條件組合查找圖書的搜索服務;發送借閲提醒等多種通知的消息推送;生成數據分析報表輔助決策的數據統計分析;提供基礎參數與系統規則配置的系統配置管理,同時提及基於需求生成10個接口方案且支持自定義優化。

對應處理邏輯接口:

【JAVA項目實戰】【圖書管理系統】借閲管理功能【Servlet】+【Ajax】+【MySql】+【Session】_java借書還書_#Java開發_06

  • 一共10項核心處理邏輯,包括刪除系統配置(需校驗配置鍵是否存在,存在則刪除並返回對應結果)、查詢系統配置列表(查詢所有配置項並返回結果)、根據配置鍵查詢詳情(先判斷配置鍵是否存在,存在則獲取詳細信息並返回結果)等接口的處理邏輯及返回的RestResult結果示例,右側還羅列了用户管理、圖書信息管理等相關功能模塊。

最後的源碼:

【JAVA項目實戰】【圖書管理系統】借閲管理功能【Servlet】+【Ajax】+【MySql】+【Session】_java借書還書_業務邏輯_07

對應設計總覽展示,可以導出文檔進行保存

2.3 優化與調試心得

2.3.1 遇到的典型問題

  1. 字段映射錯誤:AI生成的BorrowRecord實體類中dueDate字段類型誤設為LocalDate(實際應為LocalDateTime,與業務中精確到時分秒的借閲歸還時間邏輯匹配)。
  2. 業務邏輯缺陷:自動生成的借閲方法未檢查用户最大借閲數量限制(如系統規定每人最多借5本),導致可能出現超量借閲的情況。
  3. 權限校驗遺漏:初始生成的Controller未集成Spring Security,所有用户均可訪問敏感的借閲管理接口,如借閲、歸還和續借操作。

2.3.2 解決方案與AI輔助

  • 問題1:手動修改實體類字段類型為@TableField("due_date") private LocalDateTime dueDate,並通過飛算AI詢問“如何修正MyBatis實體類中日期字段類型不匹配”,獲得註解配置建議。
  • 問題2:在借閲Service層添加借閲數量檢查邏輯:
// 優化後的借閲邏輯(檢查用户最大借閲數量)
@Transactional
public BorrowRecord borrowBook(Integer userId, Integer bookId) {
    // 檢查用户借閲數量
    int currentBorrows = borrowMapper.countByUserIdAndStatus(userId, "BORROWED");
    if (currentBorrows >= 5) {
        throw new BusinessException("已達到最大借閲數量(5本)");
    }
    // 其他借閲邏輯...
}
  • 問題3:通過飛算AI生成Spring Security配置類,定義角色權限規則:
// AI輔助生成的SecurityConfig.java片段
http.authorizeHttpRequests()
    .antMatchers("/borrow/**").hasAnyRole("USER", "ADMIN")
    .antMatchers("/return/**").hasAnyRole("USER", "ADMIN")
    .antMatchers("/renew/**").hasAnyRole("USER", "ADMIN")
    .anyRequest().authenticated();

2.4 成果展示

2.4.1 工程結構圖(簡化版)

src/main/java/com/example/
├── controller/          # 圖書/借閲/用户Controller
├── service/             # 業務邏輯層(含借閲服務)
├── mapper/              # MyBatis數據訪問層
├── entity/              # 數據庫實體類
├── config/              # Spring Security & JWT配置
└── utils/               # 工具類(如逾期計算)

2.4.2 核心功能驗證

  • 借閲流程:輸入參數“用户ID = 1&圖書ID = 101”,系統返回JSON數據:
{
    "userId": 1,
    "bookId": 101,
    "borrowDate": "2024-01-01T10:00:00",
    "dueDate": "2024-01-31T10:00:00",
    "status": "BORROWED"
}
  • 飛算AI優勢總結
  • 效率提升:基礎CRUD代碼生成節省約60%編碼時間(原需2小時的手動編寫縮短至40分鐘)。
  • 規範性保障:生成的代碼符合Spring Boot最佳實踐(如分層架構、註解驅動)。
  • 侷限性:複雜業務邏輯(如併發借閲衝突處理)需手動補充優化,AI對非標準需求的適配能力待加強。

三、在線圖書借閲平台核心設計與實現流程詳細

3.1 需求分析與規劃(精簡版)

3.1.1 核心功能

  • 用户管理:讀者註冊(手機號/學號)、登錄、借閲記錄查詢
  • 圖書管理:圖書信息維護(ISBN、書名、作者、庫存量)、分類檢索
  • 借閲流程:借書(檢查庫存)、還書(計算逾期天數)、續借(限一次)
  • 逾期管理:超期自動計算罰款(0.1元/天),支持在線支付

3.2 飛算JavaAI開發實錄(關鍵步驟)

3.2.1 智能生成借閲邏輯代碼

通過飛算AI輸入需求:“生成圖書借閲接口,要求檢查庫存、用户借閲數量限制(最多5本),並記錄借閲日期與應還日期(30天后)”,AI自動生成以下核心邏輯:

// AI生成的BorrowService.java方法
@Transactional
public BorrowRecord borrowBook(Integer userId, Integer bookId) {
    // 檢查庫存
    Book book = bookMapper.selectById(bookId);
    if (book.getStock() <= 0) {
        throw new BusinessException("圖書庫存不足");
    }
    // 檢查用户借閲數量
    int currentBorrows = borrowMapper.countByUserIdAndStatus(userId, "BORROWED");
    if (currentBorrows >= 5) {
        throw new BusinessException("已達到最大借閲數量(5本)");
    }
    // 創建借閲記錄
    BorrowRecord record = new BorrowRecord();
    record.setUserId(userId);
    record.setBookId(bookId);
    record.setBorrowDate(LocalDateTime.now());
    record.setDueDate(LocalDateTime.now().plusDays(30));
    record.setStatus("BORROWED");
    borrowMapper.insert(record);
    // 更新庫存
    book.setStock(book.getStock() - 1);
    bookMapper.updateById(book);
    return record;
}

其他對應部分代碼如下:

請求發回:

package com.feisuanyz.dto;

import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * <p>
 *   圖書歸還請求對象
 * </p>
 * @author z2222
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ReturnRequest {

    /**
     * 借閲記錄ID(必填)
     */
    @NotNull(message = "借閲記錄ID不能為空")
    private Long recordId;
}

庫存管理:

package com.feisuanyz.entity;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * <p>
 *   圖書數據庫實體對象
 * </p>
 * @author z2222
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "books")
public class BookDO {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name", nullable = false)
    private String name;

    @Column(name = "status", nullable = false)
    private String status;

    @Column(name = "stock_count", nullable = false)
    private Integer stockCount;
}

搜索服務:

package com.feisuanyz.entity;

import com.feisuanyz.entity.CategoryDO;
import jakarta.persistence.*;
import java.util.List;
import lombok.*;

/**
 * <p>
 *   圖書實體類
 * </p>
 * @author z2222
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "books")
public class BookDO {

    /**
     * 圖書ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 圖書名稱
     */
    @Column(name = "title", nullable = false)
    private String title;

    /**
     * 作者名稱
     */
    @Column(name = "author", nullable = false)
    private String author;

    /**
     * 分類ID
     */
    @Column(name = "category_id", nullable = false)
    private Long categoryId;

    /**
     * 圖書描述
     */
    @Column(name = "description", nullable = true)
    private String description;

    /**
     * 圖書分類
     */
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "category_id", referencedColumnName = "id", insertable = false, updatable = false)
    private CategoryDO category;

    /**
     * 圖書作者的其他作品
     */
    @OneToMany(mappedBy = "author")
    private List<BookDO> authorBooks;
}

數據分析控制器:

package com.feisuanyz.controller;

import com.feisuanyz.dto.*;
import com.feisuanyz.dto.BorrowRankQuery;
import com.feisuanyz.dto.HotBookQuery;
import com.feisuanyz.dto.ReportQuery;
import com.feisuanyz.dto.UserBorrowStatQuery;
import com.feisuanyz.service.StatisticsService;
import jakarta.validation.Valid;
import java.util.Map;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * <p>
 *   數據統計分析控制器
 * </p>
 * @author z2222
 */
@Slf4j
@RestController
@RequestMapping("/statistics")
public class StatisticsController {

    @Autowired
    private StatisticsService statisticsService;

    /**
     * 查詢借閲量排行
     *
     * @param query 查詢參數
     * @return 統計結果
     */
    @PostMapping("/borrow-rank")
    public Map<String, Object> getBorrowRank(@RequestBody @Valid BorrowRankQuery query) {
        return statisticsService.getBorrowRank(query);
    }

    /**
     * 查詢熱門書籍推薦
     *
     * @param query 查詢參數
     * @return 統計結果
     */
    @PostMapping("/hot-books")
    public Map<String, Object> getHotBooks(@RequestBody @Valid HotBookQuery query) {
        return statisticsService.getHotBooks(query);
    }

    /**
     * 統計用户借閲行為
     *
     * @param query 查詢參數
     * @return 統計結果
     */
    @PostMapping("/user-borrow-stats")
    public Map<String, Object> getUserBorrowStats(@RequestBody @Valid UserBorrowStatQuery query) {
        return statisticsService.getUserBorrowStats(query);
    }

    /**
     * 生成運營報表
     *
     * @param query 查詢參數
     * @return 統計結果
     */
    @PostMapping("/generate-report")
    public Map<String, Object> generateReport(@RequestBody @Valid ReportQuery query) {
        return statisticsService.generateReport(query);
    }
}

系統訪問接口:

package com.feisuanyz.repository;

import com.feisuanyz.entity.SystemConfig;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

/**
 * <p>
 *   系統配置數據訪問接口
 * </p>
 * @author z2222
 */
@Repository
public interface SystemConfigRepository extends JpaRepository<SystemConfig, Long> {

    /**
     * 根據配置鍵查找系統配置
     *
     * @param configKey 配置鍵
     * @return Optional包含找到的SystemConfig或空
     */
    Optional<SystemConfig> findByConfigKey(String configKey);
}

等等…

3.3 優化與調試心得

3.3.1 典型問題與解決

  • 併發借閲衝突:多個用户同時借同一本書時,庫存可能超賣。
    解決方案:在Book表添加樂觀鎖版本號字段,更新時校驗版本一致性:
@Update("UPDATE book SET stock = stock - 1, version = version + 1 WHERE id = #{id} AND version = #{version}")
int reduceStockWithVersion(@Param("id") Integer id, @Param("version") Integer version);
  • AI生成的日期計算錯誤:初始代碼中dueDate誤用LocalDate(未考慮時分秒),導致還書判斷異常。
    手動修正:改為LocalDateTime並統一時區處理。

3.4 成果展示與總結

3.4.1部署測試

【JAVA項目實戰】【圖書管理系統】借閲管理功能【Servlet】+【Ajax】+【MySql】+【Session】_java借書還書_#飛算JavaAI炫技賽_08

  • 圖書管理系統中的圖書列表頁面,展示了7本圖書的ID、封面、名稱、所屬分類、狀態、數量、可借數量、更新時間及註冊時間等信息,所有圖書狀態均為可借,上方有添加、修改、刪除、借閲等管理操作按鈕及搜索功能。

【JAVA項目實戰】【圖書管理系統】借閲管理功能【Servlet】+【Ajax】+【MySql】+【Session】_java借書還書_系統配置_09

  • 用户管理界面,顯示了用户列表,包含ID、用户名、密碼、類型、狀態、更新時間和註冊時間等信息,用户可進行添加、修改、刪除等操作。

【JAVA項目實戰】【圖書管理系統】借閲管理功能【Servlet】+【Ajax】+【MySql】+【Session】_java借書還書_spring_10

  • 圖書管理系統的界面,展示了圖書分類列表,包含添加、修改、刪除等功能按鈕,列出了不同分類的 ID、名稱及更新、註冊時間,當前顯示 7 條分類記錄 。

【JAVA項目實戰】【圖書管理系統】借閲管理功能【Servlet】+【Ajax】+【MySql】+【Session】_java借書還書_#Java開發_11

  • 圖書管理系統界面,呈現圖書列表,含添加、修改等操作功能,列出圖書 ID、封面、名稱、所屬分類、狀態、數量等信息,還有搜索、分類篩選等功能,展示了多本不同類別圖書的詳情 。

【JAVA項目實戰】【圖書管理系統】借閲管理功能【Servlet】+【Ajax】+【MySql】+【Session】_java借書還書_#Java開發_12

  • “添加圖書”的界面,需填寫圖書名稱、選擇分類(當前為散文類)、狀態(當前為可借)、數量(當前為98),可上傳圖書圖片,在圖書介紹欄已寫“人生格式是一本好書”,底部有“添加”按鈕 。

3.4.2 核心功能驗證

  • 借閲流程:讀者登錄後搜索“Java編程思想”,點擊借閲→系統驗證庫存(3本)與借閲資格(當前借2本)→生成借閲記錄(應還日期:202X-XX-XX)。
  • 逾期提醒:超過30天未還的書目,在用户首頁顯示“《XXX》逾期X天,需繳納罰款X元”。

3.4.3 飛算AI價值評估

  • 優勢:快速生成基礎業務骨架(如用户認證、圖書CRUD),減少重複勞動;智能提示(如事務註解@Transactional)避免常見錯誤。
  • 不足:高併發場景下的鎖機制、複雜查詢優化(如多條件圖書檢索)需開發者手動完善。

四、總結

本文通過系統開發實踐驗證了飛算JavaAI在教育/文化數字化場景中的應用價值:

  1. 效率提升:基礎功能代碼生成節省50%-70%開發時間,尤其適合需求明確的標準化模塊(如用户管理、CRUD操作)。
  2. 學習曲線平緩:對新手開發者友好,通過AI生成的代碼反向學習Spring Boot最佳實踐(如分層架構、註解配置)。