引言
在数字化转型背景下,高校图书管理系统面临智能化升级需求。本文以飞算JavaAI为开发工具,通过智能引导式开发流程,实现一个包含用户管理、图书借阅、权限控制等核心功能的在线平台。系统采用Spring Boot + MyBatis技术栈,结合飞算AI的代码生成能力,将传统3周的开发周期压缩至3天,验证了AI辅助开发在Java企业级应用中的高效性。
文章目录
飞算介绍
飞算JavaAI是全球首款聚焦Java开发的全流程智能助手,其核心优势包括:
- 智能需求解析:通过NLP技术将自然语言需求转化为结构化开发清单
- 自动化代码生成:覆盖Controller、Service、DAO三层架构
- 本地化安全:所有代码处理均在IDE环境完成,保障企业数据安全
- 多数据库支持 :兼容MySQL/PostgreSQL等主流数据库
环境准备
1. 下载"IDEA"
我们选择把IDEA作为我们的编译器,进入IDEA官网
2.安装
按照引导进行安装
下载好是这样的:
3. 下载"飞算Java AI"扩展
打开插件市场,
搜索"飞算",选择第一个,下载
这样就是下载好了,
打开它,出现这个页面,点击登录
4.登录
登录成功
需求分析与规划
核心功能模块
模块 | 功能描述 | 技术实现要点 |
---|---|---|
用户管理 | 支持管理员/学生双角色 | Spring Security + RBAC |
图书管理 | 图书CRUD、状态监控(在馆/借出) | MyBatis-Plus动态条件查询 |
借阅管理 | 借阅/归还流程、逾期提醒 | 定时任务+Redis缓存 |
数据统计 | 借阅热度分析、用户活跃度报表 | ECharts可视化集成 |
技术选型
markdown
- 后端:Spring Boot + MyBatis-Plus
- 前端:Vue3 + Element Plus(飞算AI生成基础模板)
- 部署:Docker容器化 + Nginx反向代理
系统实现
1. 自然语言描述需求
在飞算AI面板输入核心需求:
markdown
"开发在线图书借阅平台,包含:
1. 用户角色管理(管理员/学生)
2. 图书信息管理(ISBN、状态、库存)
3. 借阅流程控制(最大借阅量、逾期处理)
4. 基础数据统计功能"

2. 理解需求

3. 设计接口

1、用户角色管理
实现管理员与学生两种角色的权限分配与访问控制,包括角色创建、修改、删除及权限配置等功能。支持基于角色的访问控制机制,确保不同用户只能访问其被授权的功能模块。
2、图书信息管理
提供图书信息的增删改查功能,支持通过ISBN查询图书详情,维护图书状态(如可借、已借出、损坏等)和库存数量,并能对图书信息进行更新和同步操作。
3、借阅流程控制
控制用户的借阅行为,包括设置每位用户的最大借阅量上限,执行借阅和归还操作,以及自动检测并处理逾期未还书籍的相关逻辑。
4、基础数据统计
提供系统内关键数据的汇总分析能力,涵盖借阅记录统计、图书流通情况分析及用户行为数据采集与展示,辅助管理者了解平台运行状况和优化策略。
4. 表结构设计

sql
-- 生成的用户角色表
CREATE TABLE user_role (
id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
role_name VARCHAR(50) NOT NULL COMMENT '角色名称',
role_desc TEXT COMMENT '角色描述',
create_by VARCHAR(50) COMMENT '创建人',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_by VARCHAR(50) COMMENT '修改人',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间'
) COMMENT='用户角色表';
--图书信息表
CREATE TABLE book_info (
id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
isbn VARCHAR(20) UNIQUE NOT NULL COMMENT 'ISBN编号',
book_name VARCHAR(100) NOT NULL COMMENT '图书名称',
author VARCHAR(100) COMMENT '作者',
publisher VARCHAR(100) COMMENT '出版社',
publish_date DATE COMMENT '出版日期',
category VARCHAR(50) COMMENT '分类',
total_count INT DEFAULT 0 COMMENT '总库存数量',
available_count INT DEFAULT 0 COMMENT '可借库存数量',
status TINYINT DEFAULT 0 COMMENT '图书状态:0-可借,1-已借出,2-损坏',
remark TEXT COMMENT '备注信息',
create_by VARCHAR(50) COMMENT '创建人',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_by VARCHAR(50) COMMENT '修改人',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间'
) COMMENT='图书信息表';
--借阅记录表
CREATE TABLE borrow_record (
id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
user_id BIGINT NOT NULL COMMENT '用户ID',
book_id BIGINT NOT NULL COMMENT '图书ID',
borrow_date DATE NOT NULL COMMENT '借阅日期',
return_date DATE COMMENT '应还日期',
actual_return_date DATE COMMENT '实际归还日期',
status TINYINT DEFAULT 0 COMMENT '借阅状态:0-未归还,1-已归还,2-逾期',
overdue_days INT DEFAULT 0 COMMENT '逾期天数',
remark TEXT COMMENT '备注信息',
create_by VARCHAR(50) COMMENT '创建人',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_by VARCHAR(50) COMMENT '修改人',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间'
) COMMENT='借阅记录表';
--用户借阅限制表
CREATE TABLE user_borrow_limit (
id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
user_id BIGINT NOT NULL COMMENT '用户ID',
max_borrow_count INT DEFAULT 5 COMMENT '最大借阅数量',
current_borrow_count INT DEFAULT 0 COMMENT '当前借阅数量',
create_by VARCHAR(50) COMMENT '创建人',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_by VARCHAR(50) COMMENT '修改人',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间'
) COMMENT='用户借阅限制表';
5. 处理逻辑接口

1、用户角色管理
1、新增用户角色
2、入参对象属性:roleName(角色名称,必填)、roleDesc(角色描述)
3、处理逻辑:校验角色名称是否已存在
4、返回RestResult结果:{"code":"000001","msg":"角色名称已存在","data":...}
5、处理逻辑:将角色信息保存到数据库
6、返回RestResult结果:{"code":"000000","msg":"调用成功","data":...}
7、修改用户角色
8、入参对象属性:id(主键ID,必填)、roleName(角色名称)、roleDesc(角色描述)
9、处理逻辑:校验角色是否存在
10、返回RestResult结果:{"code":"000001","msg":"角色信息不存在","data":...}
11、处理逻辑:更新角色信息
12、返回RestResult结果:{"code":"000000","msg":"调用成功","data":...}
13、删除用户角色
14、入参对象属性:id(主键ID,必填)
15、处理逻辑:校验角色是否存在
16、返回RestResult结果:{"code":"000001","msg":"角色信息不存在","data":...}
17、处理逻辑:判断该角色是否已被用户使用
18、返回RestResult结果:{"code":"000001","msg":"该角色正在被用户使用,无法删除","data":...}
19、处理逻辑:删除角色信息
20、返回RestResult结果:{"code":"000000","msg":"调用成功","data":...}
21、查询用户角色列表
22、入参对象属性:
23、处理逻辑:查询所有用户角色信息
24、返回RestResult结果:{"code":"000000","msg":"调用成功","data":...}
2、图书信息管理
1、新增图书信息
2、入参对象属性:isbn(ISBN编号,必填)、bookName(图书名称,必填)、author(作者)、publisher(出版社)、publishDate(出版日期)、category(分类)、totalCount(总库存数量,默认0)、availableCount(可借库存数量,默认0)、status(图书状态:0-可借,1-已借出,2-损坏,默认0)、remark(备注信息)
3、处理逻辑:校验ISBN是否已存在
4、返回RestResult结果:{"code":"000001","msg":"ISBN已存在","data":...}
5、处理逻辑:将图书信息保存到数据库
6、返回RestResult结果:{"code":"000000","msg":"调用成功","data":...}
7、删除图书信息
8、入参对象属性:id(主键ID,必填)
9、处理逻辑:根据ID查询图书是否存在
10、返回RestResult结果:{"code":"000001","msg":"图书信息不存在","data":...}
11、处理逻辑:删除指定ID的图书信息
12、返回RestResult结果:{"code":"000000","msg":"调用成功","data":...}
13、修改图书信息
14、入参对象属性:id(主键ID,必填)、isbn(ISBN编号)、bookName(图书名称)、author(作者)、publisher(出版社)、publishDate(出版日期)、category(分类)、totalCount(总库存数量)、availableCount(可借库存数量)、status(图书状态:0-可借,1-已借出,2-损坏)、remark(备注信息)
15、处理逻辑:根据ID查询图书是否存在
16、返回RestResult结果:{"code":"000001","msg":"图书信息不存在","data":...}
17、处理逻辑:更新图书信息至数据库
18、返回RestResult结果:{"code":"000000","msg":"调用成功","data":...}
19、查询图书详情
20、入参对象属性:isbn(ISBN编号,必填)
21、处理逻辑:根据ISBN查询图书信息是否存在
22、返回RestResult结果:{"code":"000001","msg":"图书信息不存在","data":...}
23、处理逻辑:返回图书详细信息
24、返回RestResult结果:{"code":"000000","msg":"调用成功","data":...}
25、查询图书列表
26、入参对象属性:bookName(图书名称)、author(作者)、category(分类)、status(图书状态:0-可借,1-已借出,2-损坏)
27、处理逻辑:按条件筛选图书列表
28、返回RestResult结果:{"code":"000000","msg":"调用成功","data":...}
3、借阅流程控制
1、用户借阅图书
2、入参对象属性:userId(用户ID,必填)、bookId(图书ID,必填)
3、处理逻辑:检查用户是否已达到最大借阅数量限制
4、返回RestResult结果:{"code":"000001","msg":"当前借阅数量已达上限","data":...}
5、处理逻辑:验证图书是否处于可借状态
6、返回RestResult结果:{"code":"000001","msg":"该图书不可借","data":...}
7、处理逻辑:更新图书的可借库存数量
8、处理逻辑:记录新的借阅记录
9、处理逻辑:更新用户的当前借阅数量
10、返回RestResult结果:{"code":"000000","msg":"调用成功","data":...}
11、用户归还图书
12、入参对象属性:borrowRecordId(借阅记录ID,必填)
13、处理逻辑:查询借阅记录是否存在且未归还
14、返回RestResult结果:{"code":"000001","msg":"借阅记录不存在或已完成归还","data":...}
15、处理逻辑:计算是否逾期并更新逾期天数
16、处理逻辑:更新图书的可借库存数量
17、处理逻辑:标记借阅记录为已归还
18、处理逻辑:更新用户的当前借阅数量
19、返回RestResult结果:{"code":"000000","msg":"调用成功","data":...}
20、设置用户借阅上限
21、入参对象属性:userId(用户ID,必填)、maxBorrowCount(最大借阅数量,必填)
22、处理逻辑:判断用户是否已存在借阅限制配置
23、返回RestResult结果:{"code":"000001","msg":"用户尚未创建借阅限制配置","data":...}
24、处理逻辑:更新用户借阅上限配置
25、返回RestResult结果:{"code":"000000","msg":"调用成功","data":...}
26、获取用户当前借阅状态
27、入参对象属性:userId(用户ID,必填)
28、处理逻辑:根据用户ID查询其所有未归还的借阅记录
29、返回RestResult结果:{"code":"000000","msg":"调用成功","data":...}
4、基础数据统计
1、查询借阅记录统计
2、入参对象属性:startdate(开始日期,必填)、enddate(结束日期,必填)
3、处理逻辑:校验传入的时间范围是否合法
4、返回RestResult结果:{"code":"000001","msg":"调用失败","data":...}
5、处理逻辑:根据时间范围统计借阅记录总数及逾期数量
6、返回RestResult结果:{"code":"000000","msg":"调用成功","data":...}
7、查询图书流通情况分析
8、入参对象属性:startdate(开始日期,必填)、enddate(结束日期,必填)
9、处理逻辑:校验传入的时间范围是否合法
10、返回RestResult结果:{"code":"000001","msg":"调用失败","data":...}
11、处理逻辑:按图书分类或作者维度统计借阅次数和库存变化
12、返回RestResult结果:{"code":"000000","msg":"调用成功","data":...}
13、查询用户行为数据
14、入参对象属性:startdate(开始日期,必填)、enddate(结束日期,必填)
15、处理逻辑:校验传入的时间范围是否合法
16、返回RestResult结果:{"code":"000001","msg":"调用失败","data":...}
17、处理逻辑:统计各用户借阅频次、归还及时率等指标
18、返回RestResult结果:{"code":"000000","msg":"调用成功","data":...}
6. 生成源码

点击开始自动化生成源码,稍等片刻......
优化与调试心得
遇到的问题
- 复杂查询优化:初始生成的SQL未使用索引,通过SQL Chat调整:
sql
-- 优化后的借阅记录查询
SELECT * FROM borrow_record
WHERE user_id = #{userId}
ORDER BY borrow_date DESC
LIMIT 0,10
-
事务失效问题 :发现Service层未添加
@Transactional
注解,通过飞算AI的代码检查功能定位问题 -
跨表查询性能:在图书详情接口中,AI自动生成关联查询:
java
@Select("SELECT b.*, u.username FROM book b LEFT JOIN user u ON b.owner_id = u.id")
List<BookDetailVO> getBookDetails();
调试技巧
- 使用Java Chat实时咨询框架问题
- 通过SQL Chat生成测试数据:
sql
-- 批量插入测试图书
INSERT INTO book (title, author, isbn, status, stock)
VALUES
('深入理解Java虚拟机', '周志明', '9787111647954', 'AVAILABLE', 5),
('Spring Boot实战', '克雷格·沃斯', '9787121314727', 'AVAILABLE', 3);
成果展示与总结

代码展示
生成源码部分示例
UserRoleController.java 用户角色控制器类
java
package com.feisuanyz.controller;
import com.feisuanyz.dto.RestResult;
import com.feisuanyz.dto.UserRoleDTO;
import com.feisuanyz.service.UserRoleService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
/**
* 用户角色控制器类
*
* @author
*/
@Slf4j
@RestController
@RequestMapping("/user-role")
@RequiredArgsConstructor
public class UserRoleController {
private final UserRoleService userRoleService;
/**
* 新增用户角色
*
* @param dto 角色信息对象
* @return RestResult 结果集
*/
@PostMapping("/add")
public RestResult<?> add(@Valid @RequestBody UserRoleDTO dto) {
return userRoleService.add(dto);
}
/**
* 修改用户角色
*
* @param dto 角色信息对象
* @return RestResult 结果集
*/
@PutMapping("/update")
public RestResult<?> update(@Valid @RequestBody UserRoleDTO dto) {
return userRoleService.update(dto);
}
/**
* 删除用户角色
*
* @param id 主键ID
* @return RestResult 结果集
*/
@DeleteMapping("/delete/{id}")
public RestResult<?> delete(@PathVariable Long id) {
return userRoleService.delete(id);
}
/**
* 查询用户角色列表
*
* @return RestResult 结果集
*/
@GetMapping("/list")
public RestResult<?> list() {
return userRoleService.list();
}
}
UserRoleServiceImpl.java 用户角色业务实现类
java
package com.feisuanyz.service.impl;
import com.feisuanyz.dto.RestResult;
import com.feisuanyz.dto.UserRoleDTO;
import com.feisuanyz.entity.UserRole;
import com.feisuanyz.repository.UserRoleRepository;
import com.feisuanyz.service.UserRoleService;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* 用户角色业务实现类
*
* @author
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class UserRoleServiceImpl implements UserRoleService {
private final UserRoleRepository userRoleRepository;
/**
* 添加角色
*
* @param dto 用户角色信息
* @return RestResult 返回结果
*/
@Override
public RestResult<?> add(UserRoleDTO dto) {
// 检查角色名是否已存在
Optional<UserRole> existingRole = userRoleRepository.findByRoleName(dto.getRoleName());
if (existingRole.isPresent()) {
return RestResult.error("000001", "角色名称已存在");
}
// 构建新的UserRole实体并保存
UserRole entity = new UserRole();
entity.setRoleName(dto.getRoleName());
entity.setRoleDesc(dto.getRoleDesc());
entity.setCreateTime(LocalDateTime.now());
entity.setUpdateTime(LocalDateTime.now());
try {
userRoleRepository.save(entity);
return RestResult.success(null);
} catch (Exception e) {
log.error("新增角色失败:{}", e.getMessage(), e);
return RestResult.error("999999", "系统异常,请稍后再试");
}
}
/**
* 更新角色
*
* @param dto 用户角色信息
* @return RestResult 返回结果
*/
@Override
public RestResult<?> update(UserRoleDTO dto) {
// 查找现有角色
Optional<UserRole> optional = userRoleRepository.findById(dto.getId());
if (!optional.isPresent()) {
return RestResult.error("000001", "角色信息不存在");
}
UserRole entity = optional.get();
// 如果修改了角色名称,则检查新名称是否冲突
if (!dto.getRoleName().equals(entity.getRoleName())) {
Optional<UserRole> checkDuplicate = userRoleRepository.findByRoleName(dto.getRoleName());
if (checkDuplicate.isPresent()) {
return RestResult.error("000001", "角色名称已存在");
}
}
// 更新属性
entity.setRoleName(dto.getRoleName());
entity.setRoleDesc(dto.getRoleDesc());
entity.setUpdateTime(LocalDateTime.now());
try {
userRoleRepository.save(entity);
return RestResult.success(null);
} catch (Exception e) {
log.error("更新角色失败:{}", e.getMessage(), e);
return RestResult.error("999999", "系统异常,请稍后再试");
}
}
/**
* 删除角色
*
* @param id 角色主键ID
* @return RestResult 返回结果
*/
@Override
public RestResult<?> delete(Long id) {
// 查找角色是否存在
Optional<UserRole> optional = userRoleRepository.findById(id);
if (!optional.isPresent()) {
return RestResult.error("000001", "角色信息不存在");
}
// 判断是否被用户使用
if (userRoleRepository.existsByRoleId(id)) {
return RestResult.error("000001", "该角色正在被用户使用,无法删除");
}
try {
userRoleRepository.deleteById(id);
return RestResult.success(null);
} catch (Exception e) {
log.error("删除角色失败:{}", e.getMessage(), e);
return RestResult.error("999999", "系统异常,请稍后再试");
}
}
/**
* 获取所有角色列表
*
* @return RestResult 返回结果
*/
@Override
public RestResult<?> list() {
try {
List<UserRole> roles = userRoleRepository.findAll();
return RestResult.success(roles);
} catch (Exception e) {
log.error("获取角色列表失败:{}", e.getMessage(), e);
return RestResult.error("999999", "系统异常,请稍后再试");
}
}
}
技术优势
- 开发效率提升:传统3周的工作量压缩至3天
- 代码规范保障:自动生成符合阿里巴巴开发规范的代码
- 架构灵活性:支持微服务架构自动拆分(需手动触发)
不足与改进
- 复杂业务逻辑支持:需加强自定义规则引擎
- 性能优化建议:需增加自动生成缓存注解功能
通过本次实践,验证了飞算JavaAI在标准CRUD应用开发中的显著优势,特别是在减少重复劳动、保障代码规范方面表现突出。建议开发者在熟悉工具特性后,可尝试将其应用于更复杂的业务系统开发。