跳到主要内容
基于飞算 JavaAI 的在线图书借阅平台设计与实现 | 极客日志
Java AI java
基于飞算 JavaAI 的在线图书借阅平台设计与实现 在线图书借阅平台采用飞算 JavaAI 辅助开发,涵盖环境配置、需求分析、API 设计及数据库建模全流程。核心功能包括用户认证、图书管理及借阅归还逻辑,通过 AI 自动生成 Spring Boot 后端代码并优化事务处理与并发控制。实践表明该工具能显著缩短开发周期,提升代码规范性,但复杂业务规则仍需人工介入调整。
dehua dong 发布于 2026/3/27 0 浏览项目背景与目标
在软件工程领域,随着业务逻辑日益复杂,传统手动编码模式面临开发周期长、人力成本高及代码质量参差不齐等挑战。人工智能辅助编程(AI-Assisted Programming)通过将大语言模型与软件工程知识融合,能够自动化处理重复性任务,让开发者聚焦核心业务逻辑。
本项目以'在线图书借阅平台'为实践课题,利用飞算 JavaAI 插件完成从环境配置、需求分析、接口设计到数据库建模及代码生成的全流程。旨在展示 AI 工具在真实项目开发中的效能,探讨其如何重塑开发范式并提升效率。
开发环境搭建
稳定的开发环境是项目起点。本项目基于 IntelliJ IDEA 和飞算 JavaAI 插件构建。
IDEA 安装 :下载对应操作系统的社区版或旗舰版安装包,按向导完成安装。
插件集成 :
启动 IDEA,进入 File -> Settings (Windows/Linux) 或 IntelliJ IDEA -> Preferences (macOS)。
在 Plugins 市场搜索'飞算',找到'飞算 JavaAI'并点击 Install。
应用变更并重启 IDE。重启后右侧边栏会出现'飞算 Java'图标,表明插件已加载。
点击图标按指引完成注册登录,激活功能。
需求分析与系统设计
环境就绪后,我们利用 AI 的自然语言理解能力进行驱动式开发。
1. 项目创建与需求分解
点击界面上的 创建项目 按钮,输入自然语言需求:帮我实现在线图书借阅平台的设计与实现。
AI 后台大模型会对文本进行语义分析,将宏观概念拆解为具体模块:
用户模块 :注册、登录、个人信息管理。
图书模块 :增删改查、检索、详情查看。
借阅模块 :借书、还书、历史记录、状态查询。
管理模块 :用户管理、库存审核、全站统计。
这个分解过程是后续设计和编码的基础。
2. API 接口设计
基于功能模块,AI 自动生成遵循 RESTful 原则的 API 草案:
认证 :POST /api/auth/register, POST /api/auth/login
用户 :GET /api/users/me, PUT /api/users/me
图书 :GET /api/books, POST /api/admin/books 等
借阅 :POST /api/borrows,
PUT /api/borrows/{recordId}/return
3. 数据库表结构设计 数据模型是应用的骨架。AI 根据实体关系生成 DDL 脚本,经微调确认后如下:
CREATE TABLE t_borrow_record (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '借阅记录唯一 ID' ,
user_id BIGINT NOT NULL COMMENT '借阅用户 ID' ,
book_id BIGINT NOT NULL COMMENT '被借阅图书 ID' ,
borrow_date DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '借出时间' ,
due_date DATETIME NOT NULL COMMENT '应归还日期' ,
return_date DATETIME COMMENT '实际归还时间' ,
status VARCHAR (20 ) NOT NULL COMMENT '状态 (BORROWED, RETURNED, OVERDUE)' ,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
INDEX idx_user_id (user_id),
INDEX idx_book_id (book_id),
CONSTRAINT fk_borrow_user FOREIGN KEY (user_id) REFERENCES t_user (id) ON DELETE CASCADE,
CONSTRAINT fk_borrow_book FOREIGN KEY (book_id) REFERENCES t_book (id) ON DELETE RESTRICT
) COMMENT '图书借阅记录表' ;
CREATE TABLE t_book (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '图书唯一 ID' ,
title VARCHAR (255 ) NOT NULL COMMENT '书名' ,
author VARCHAR (100 ) NOT NULL COMMENT '作者' ,
isbn VARCHAR (20 ) NOT NULL UNIQUE COMMENT '国际标准书号' ,
publisher VARCHAR (100 ) COMMENT '出版社' ,
publication_date DATE COMMENT '出版日期' ,
description TEXT COMMENT '内容简介' ,
cover_image_url VARCHAR (512 ) COMMENT '封面图片 URL' ,
total_quantity INT NOT NULL DEFAULT 0 COMMENT '总入库数量' ,
available_quantity INT NOT NULL DEFAULT 0 COMMENT '可借阅库存' ,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) COMMENT '图书信息表' ;
CREATE TABLE t_user (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '用户唯一 ID' ,
username VARCHAR (50 ) NOT NULL UNIQUE COMMENT '用户名' ,
password_hash VARCHAR (255 ) NOT NULL COMMENT '加密密码哈希值' ,
email VARCHAR (100 ) UNIQUE COMMENT '用户邮箱' ,
role VARCHAR (20 ) NOT NULL DEFAULT 'USER' COMMENT '用户角色' ,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) COMMENT '用户表' ;
核心业务逻辑实现 设计完成后,点击 开始生成,AI 构建完整的 Spring Boot 后端项目。以下对几个关键模块的代码进行解析。
1. 用户认证模块 安全性是入口的关键。Controller 层负责接收请求,Service 层处理业务逻辑。
package com.example.library.controller;
import com.example.library.dto.LoginRequestDto;
import com.example.library.dto.UserRegistrationDto;
import com.example.library.service.AuthService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@RestController
@RequestMapping("/api/auth")
public class AuthController {
@Autowired
private AuthService authService;
@PostMapping("/register")
public ResponseEntity<?> registerUser(@Valid @RequestBody UserRegistrationDto registrationDto) {
try {
authService.registerUser(registrationDto);
return ResponseEntity.ok("用户注册成功!" );
} catch (RuntimeException e) {
return ResponseEntity.badRequest().body(e.getMessage());
}
}
@PostMapping("/login")
public ResponseEntity<?> authenticateUser(@Valid @RequestBody LoginRequestDto loginRequestDto) {
try {
String jwt = authService.loginUser(loginRequestDto);
return ResponseEntity.ok(new JwtAuthenticationResponse (jwt));
} catch (Exception e) {
return ResponseEntity.status(401 ).body("认证失败:" + e.getMessage());
}
}
}
package com.example.library.service;
import com.example.library.dto.LoginRequestDto;
import com.example.library.dto.UserRegistrationDto;
import com.example.library.model.User;
import com.example.library.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class AuthService {
@Autowired
private UserRepository userRepository;
@Autowired
private PasswordEncoder passwordEncoder;
@Transactional
public void registerUser (UserRegistrationDto registrationDto) {
if (userRepository.existsByUsername(registrationDto.getUsername())) {
throw new RuntimeException ("错误:用户名已被占用!" );
}
if (userRepository.existsByEmail(registrationDto.getEmail())) {
throw new RuntimeException ("错误:电子邮箱已被注册!" );
}
User user = new User ();
user.setUsername(registrationDto.getUsername());
user.setPasswordHash(passwordEncoder.encode(registrationDto.getPassword()));
user.setEmail(registrationDto.getEmail());
user.setRole("USER" );
userRepository.save(user);
}
public String loginUser (LoginRequestDto loginRequestDto) {
return "dummy-jwt-token-for-" + loginRequestDto.getUsername();
}
}
2. 借阅与归还流程 这是核心业务,涉及多表操作和事务一致性。特别注意并发控制。
package com.example.library.controller;
import com.example.library.dto.BorrowRequestDto;
import com.example.library.service.BorrowService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/borrows")
public class BorrowController {
@Autowired
private BorrowService borrowService;
@PostMapping
public ResponseEntity<?> borrowBook(@RequestBody BorrowRequestDto borrowRequestDto) {
try {
Long currentUserId = 1L ;
borrowService.borrowBook(currentUserId, borrowRequestDto.getBookId());
return ResponseEntity.ok("图书借阅成功!" );
} catch (Exception e) {
return ResponseEntity.badRequest().body(e.getMessage());
}
}
@PutMapping("/{recordId}/return")
public ResponseEntity<?> returnBook(@PathVariable Long recordId) {
try {
Long currentUserId = 1L ;
borrowService.returnBook(currentUserId, recordId);
return ResponseEntity.ok("图书归还成功!" );
} catch (Exception e) {
return ResponseEntity.badRequest().body(e.getMessage());
}
}
}
package com.example.library.service;
import com.example.library.model.Book;
import com.example.library.model.BorrowRecord;
import com.example.library.repository.BookRepository;
import com.example.library.repository.BorrowRecordRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
@Service
public class BorrowService {
@Autowired
private BookRepository bookRepository;
@Autowired
private BorrowRecordRepository borrowRecordRepository;
private static final int BORROW_DURATION_DAYS = 30 ;
@Transactional
public void borrowBook (Long userId, Long bookId) {
Book book = bookRepository.findByIdWithLock(bookId)
.orElseThrow(() -> new RuntimeException ("图书不存在,ID: " + bookId));
if (book.getAvailableQuantity() <= 0 ) {
throw new RuntimeException ("图书《" + book.getTitle() + "》库存不足,无法借阅。" );
}
if (borrowRecordRepository.existsByUserIdAndBookIdAndStatus(userId, bookId, "BORROWED" )) {
throw new RuntimeException ("您已借阅《" + book.getTitle() + "》,请勿重复借阅。" );
}
book.setAvailableQuantity(book.getAvailableQuantity() - 1 );
bookRepository.save(book);
BorrowRecord newRecord = new BorrowRecord ();
newRecord.setUserId(userId);
newRecord.setBookId(bookId);
newRecord.setBorrowDate(LocalDateTime.now());
newRecord.setDueDate(LocalDateTime.now().plus(BORROW_DURATION_DAYS, ChronoUnit.DAYS));
newRecord.setStatus("BORROWED" );
borrowRecordRepository.save(newRecord);
}
@Transactional
public void returnBook (Long userId, Long recordId) {
BorrowRecord record = borrowRecordRepository.findById(recordId)
.orElseThrow(() -> new RuntimeException ("借阅记录不存在,ID: " + recordId));
if (!record.getUserId().equals(userId)) {
throw new SecurityException ("无权操作他人的借阅记录。" );
}
if ("RETURNED" .equals(record.getStatus())) {
throw new RuntimeException ("该书已归还,请勿重复操作。" );
}
Book book = bookRepository.findByIdWithLock(record.getBookId())
.orElseThrow(() -> new RuntimeException ("关联的图书信息已不存在。" ));
book.setAvailableQuantity(book.getAvailableQuantity() + 1 );
bookRepository.save(book);
record.setStatus("RETURNED" );
record.setReturnDate(LocalDateTime.now());
borrowRecordRepository.save(record);
}
}
package com.example.library.repository;
import com.example.library.model.Book;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Lock;
import org.springframework.stereotype.Repository;
import javax.persistence.LockModeType;
import java.util.Optional;
@Repository
public interface BookRepository extends JpaRepository <Book, Long> {
@Lock(LockModeType.PESSIMISTIC_WRITE)
Optional<Book> findByIdWithLock (Long id) ;
}
总结与思考 通过本次从零到一的实战,可以看出 AI 辅助编程工具的价值。
效率提升显著 :传统模式下完成框架搭建、数据库设计及基础 CRUD 代码编写至少需要数个工作日,而使用 AI 工具可将此过程压缩至几分钟。
代码规范性保障 :AI 生成的代码自动采用主流技术栈,实现了清晰的分层架构(Controller, Service, Repository),正确应用了依赖注入和事务管理,为后续维护奠定基础。
开发者角色转变 :工具将开发者从重复劳动中解放出来,使其能更专注于需求澄清、复杂逻辑梳理及系统架构优化。
当然,AI 并非万能。对于高度定制化的复杂业务逻辑(如精细权限控制、特定业务规则计算),仍需人工深度介入。当前 AI 更像是一位高效的'架构师兼初级程序员',它能规划蓝图、搭建毛坯,但精装修依然需要人类设计师的匠心。未来,随着工具向单元测试生成、智能重构及自动化运维方向发展,AI 将成为工程师的核心竞争力之一。
相关免费在线工具 Keycode 信息 查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
Escape 与 Native 编解码 JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
JavaScript / HTML 格式化 使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
JavaScript 压缩与混淆 Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
RSA密钥对生成器 生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
Mermaid 预览与可视化编辑 基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online