基于飞算JavaAI的在线图书借阅平台设计与实现

引言

在数字化转型背景下,高校图书管理系统面临智能化升级需求。本文以飞算JavaAI为开发工具,通过智能引导式开发流程,实现一个包含用户管理、图书借阅、权限控制等核心功能的在线平台。系统采用Spring Boot + MyBatis技术栈,结合飞算AI的代码生成能力,将传统3周的开发周期压缩至3天,验证了AI辅助开发在Java企业级应用中的高效性。

文章目录

飞算介绍

飞算JavaAI是全球首款聚焦Java开发的全流程智能助手,其核心优势包括:

  1. 智能需求解析:通过NLP技术将自然语言需求转化为结构化开发清单
  2. 自动化代码生成:覆盖Controller、Service、DAO三层架构
  3. 本地化安全:所有代码处理均在IDE环境完成,保障企业数据安全
  4. 多数据库支持 :兼容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. 生成源码

点击开始自动化生成源码,稍等片刻......

优化与调试心得

遇到的问题

  1. 复杂查询优化:初始生成的SQL未使用索引,通过SQL Chat调整:
sql 复制代码
-- 优化后的借阅记录查询
SELECT * FROM borrow_record 
WHERE user_id = #{userId} 
ORDER BY borrow_date DESC 
LIMIT 0,10
  1. 事务失效问题 :发现Service层未添加@Transactional注解,通过飞算AI的代码检查功能定位问题

  2. 跨表查询性能:在图书详情接口中,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", "系统异常,请稍后再试");
        }
    }
}

技术优势

  1. 开发效率提升:传统3周的工作量压缩至3天
  2. 代码规范保障:自动生成符合阿里巴巴开发规范的代码
  3. 架构灵活性:支持微服务架构自动拆分(需手动触发)

不足与改进

  1. 复杂业务逻辑支持:需加强自定义规则引擎
  2. 性能优化建议:需增加自动生成缓存注解功能

通过本次实践,验证了飞算JavaAI在标准CRUD应用开发中的显著优势,特别是在减少重复劳动、保障代码规范方面表现突出。建议开发者在熟悉工具特性后,可尝试将其应用于更复杂的业务系统开发。

相关推荐
麦兜*11 小时前
MongoDB 事务管理:多文档操作如何保证 ACID?
java·数据库·后端·mongodb·spring cloud·springboot
明月与玄武11 小时前
动态配置最佳实践:Spring Boot 十种落地方式与回滚审计指南(含实操与避坑)
java·springboot动态配置·10种方法与实践
森之鸟11 小时前
开发中使用——鸿蒙本地存储之收藏功能
java·华为·harmonyos
AAA修煤气灶刘哥11 小时前
微服务网关:别再让接口 “各自为战”!Gateway 实战 + 鉴权全攻略
java·后端·spring cloud
叫我阿柒啊11 小时前
从Java全栈到前端框架:一场真实的技术面试实录
java·spring boot·redis·typescript·vue3·jwt·前后端分离
武子康11 小时前
Java-114 深入浅出 MySQL 开源分布式中间件 ShardingSphere 深度解读
java·数据库·分布式·mysql·中间件·性能优化·开源
Li_yizYa11 小时前
JVM:内存区域划分、类加载的过程、垃圾回收机制
java·jvm
失散1312 小时前
并发编程——06 JUC并发同步工具类的应用实战
java·架构·并发编程
2301_7813925212 小时前
从spring MVC角度理解HTTP协议及Request-Response模式
java·spring·mvc