图书租借系统V0.0.2

举报
赵KK日常技术记录 发表于 2023/06/30 11:13:46 2023/06/30
【摘要】 从这篇文章的名字不难看出,我是真的没有东西可写了图片,想看的多,能写的不多,上周的图书租借也因为临时群里讨论才想到的,但讨论到netty一对一聊天实现聊天框倒是有了新的东西可以看。 在用户登录服务端时,获取用户ip与id绑定,放入channelgroup,每次循环遍历这个ip对应的channel,否则返回false,在用户状态取到是否在线,离线之后的消息/留言还不知道怎么处理。标题:构...

从这篇文章的名字不难看出,我是真的没有东西可写了图片,想看的多,能写的不多,上周的图书租借也因为临时群里讨论才想到的,但讨论到netty一对一聊天实现聊天框倒是有了新的东西可以看。

    在用户登录服务端时,获取用户ip与id绑定,放入channelgroup,每次循环遍历这个ip对应的channel,否则返回false,在用户状态取到是否在线,离线之后的消息/留言还不知道怎么处理。

标题:构建高效可靠的图书管理Java系统:设计要点与考虑问题

摘要:图书管理系统是图书馆和其他文化机构不可或缺的重要组成部分。本文将以Java为基础,从设计要点和考虑问题的角度,探讨如何构建一个高效可靠的图书管理系统。将重点涉及系统架构设计、数据库设计、用户权限管理、借还书流程等关键方面。

1. 引言

图书管理系统是为了方便图书馆管理人员和读者,实现图书借阅、归还、查询等功能而设计的软件系统。采用Java作为开发语言可以借助其丰富的生态系统和良好的跨平台性能,为图书管理系统的设计和开发提供便利。

2. 系统架构设计

2.1 前后端分离架构:采用前后端分离的架构可以提升系统的灵活性和可扩展性。通过使用Java后端框架(如Spring Boot)和前端框架(如Vue.js或React),可以实现前后端的解耦,各自独立开发和部署。

2.2 模块化设计:将图书管理系统划分为多个模块,如图书管理、读者管理、借阅管理、权限管理等,每个模块负责特定的功能。模块化设计能够促进系统的可维护性和代码的重用性。

2.3 微服务架构:采用微服务架构可以帮助更好地解耦系统,实现各微服务的独立开发、部署和扩展。每个微服务都可以专注于特定的业务功能,并通过合适的通信机制进行交互。

3. 数据库设计

3.1 图书表设计:设计图书表时应包括书名、作者、出版社、ISBN号、价格等基本信息。此外,可以考虑增加可借阅数量、借阅次数、图书封面等字段,方便后续统计和展示。

3.2 用户表设计:用户表应包含用户名、密码、姓名、性别、联系方式等基本信息。可根据需要添加读者类型、借阅次数、借阅限制等字段,以实现更细粒度的权限管理。

3.3 借阅记录表设计:借阅记录表用于记录读者借阅图书的详细信息,包括读者ID、图书ID、借阅日期、归还日期等字段。通过借阅记录表可以实现借书和还书的流程控制。

4. 用户权限管理

4.1 认证和授权:采用安全框架(如Spring Security)进行用户认证和授权管理,确保只有经过认证的用户能够进行敏感操作。对于不同的角色和权限,可以定义不同的访问控制策略。

4.2 角色管理:为了实现不同用户的权限管理,可以引入角色概念。通过定义角色和权限的对应关系,可以灵活地控制用户访问系统中的各项功能和资源。

4.3 权限细粒度控制:在图书管理系统中,不同的用户可能具有不同的权限需求。因此,需要进行细粒度的权限控制,确保用户只能访问其具备权限的功能和数据。

5. 借还书流程

5.1 图书查询:用户可以通过系统提供的图书查询功能,根据书名、作者、ISBN号等信息搜索图书。

5.2 图书借阅:当用户决定借阅一本书时,系统需要验证用户的借阅资格(如用户类型和借阅限制),并检查图书的可借阅数量。如果满足条件,则向借阅记录表中添加相应的记录。

5.3 图书归还:用户在还书时,系统需要验证用户的还书资格,并将相应的图书状态更新为可借阅状态,同时更新借阅记录表中对应记录的归还日期。

5.4 借阅提醒:系统可以添加定时任务,检测即将到期的借阅记录,并自动向用户发送提醒消息,以避免逾期归还。

6. 安全性和数据备份

6.1 数据加密:为了保护用户的隐私和数据安全,可以采用合适的加密算法对重要数据进行加密存储,如用户密码、个人信息等。

6.2 数据备份:定期进行数据库备份是保障系统数据安全的关键措施。通过定期备份数据,可以预防因数据丢失或损坏而导致的数据不可恢复性。

7. 性能优化和扩展性考虑

7.1 缓存机制:利用缓存技术(如Redis)缓存热门图书信息,可以提高系统的查询速度和响应性能。通过定期刷新缓存,保证缓存数据的准确性。

7.2 负载均衡和水平扩展:当系统负载增加时,可以采用负载均衡技术(如Nginx或负载均衡器)将请求分发到多个服务器上,以提高系统的吞吐量和并发能力。

7.3 异步处理:对于一些耗时较长的操作,如生成借阅记录和发送借阅提醒,可以采用异步处理方式,将这些任务交给异步队列或消息队列进行处理,提高系统的响应速度和并发能力。

8. 用户界面设计和用户体验

8.1 响应式设计:设计支持响应式布局的用户界面,以适应不同设备和屏幕尺寸的用户访问。确保用户在不同平台上都能有良好的使用体验。

8.2 直观易用的界面:界面设计应简洁、直观,并提供用户友好的操作方式。通过合理的布局和交互设计,提升用户的使用效率和满意度。

8.3 错误处理和提示:在系统中添加合适的错误处理机制,及时向用户反馈操作失败的原因,并提供相关的解决方案或建议。

9. 测试和调试

9.1 单元测试:编写有效的单元测试,覆盖系统中的各个模块和核心功能,保证系统的稳定性和可靠性。

9.2 集成测试:进行全面的集成测试,模拟用户的实际使用场景,检验不同模块之间的协作和功能的一致性。

9.3 性能测试:通过在模拟的负载环境下进行性能测试,评估系统的性能指标,并进行优化和调整。

10. 结论

在设计图书管理Java系统时,我们需要从系统架构设计、数据库设计、用户权限管理、借还书流程、安全性和数据备份、性能优化和扩展性考虑、用户界面设计和用户体验、测试和调试等多个方面综合考虑,以构建一个高效可靠的系统。

通过采用前后端分离架构、模块化设计和微服务架构,可以提升系统的灵活性和可维护性。合理设计数据库结构和引入用户权限管理,可以实现安全和精细的权限控制。借还书流程需要考虑系统的功能和数据一致性。安全性和数据备份是保障系统数据安全的重要手段。性能优化和扩展性考虑可以提高系统的并发处理能力和吞吐量。用户界面设计和用户体验能够提升用户满意度和使用效率。最后,测试和调试是确保系统质量和稳定性的必要步骤。

通过综合考虑这些设计要点和问题,我们可以构建出一个高效可靠的图书管理Java系统,满足图书馆管理人员和读者的需求。

参考文献:

  1. Reza Rahman, Ryan Cuprak, “Java EE 7 Essentials: Enterprise Developer Handbook,” O’Reilly Media, 2013.
  2. Scott Schmitt, “Java 9 Modularity: Patterns and Practices for Developing Maintainable Applications,” O’Reilly Media, 2018.
  3. Robert C. Martin, “Clean Architecture: A Craftsman’s Guide to Software Structure and Design,” Prentice Hall, 2018.

1.上传图书审核通过后展示在页面

2.图片存储位置:暂时用服务器存储即可

3.审核后还要通知上传人信息,站内信形式通知

4.页面有我要租书 我要出租

5.上传判断书名重复

6.上传后保存信息到book表,审核读取此表信息,筛选审核通过的展示

后台审核功能

7.审核上传图书 改变上传状态为已通过后可显示在前端

/*
Navicat Premium Data Transfer

Source Server : localhost
Source Server Type : MySQL
Source Server Version : 50617
Source Host : localhost:3306
Source Schema : borrowbook

Target Server Type : MySQL
Target Server Version : 50617
File Encoding : 65001

Date: 19/12/2019 11:13:31
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;


– Table structure for book


DROP TABLE IF EXISTS book;
CREATE TABLE book (
id int(11) NOT NULL COMMENT ‘主键’,
userId int(11) DEFAULT NULL COMMENT ‘关联拥有人’,
bookname varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT ‘书名’,
status varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT ‘状态0:闲置 1:已借出3:预约’,
backTime datetime(0) DEFAULT NULL COMMENT ‘归还时间’,
cover_url varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT ‘图书封面’,
verifystatus varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT ‘审核状态,审核通过展示’,
remark varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT ‘备注’,
language varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT ‘书籍所属语言 java,python,大数据等’,
price decimal(10, 2) DEFAULT NULL COMMENT ‘租用价格/天’,
borrowtime datetime(0) DEFAULT NULL COMMENT ‘借出时间’,
upload_time datetime(0) DEFAULT NULL COMMENT ‘上传时间’,
PRIMARY KEY (id) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;


– Table structure for user


DROP TABLE IF EXISTS user;
CREATE TABLE user (
id int(11) NOT NULL COMMENT ‘主键’,
uuid varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT ‘关联id’,
name varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT ‘名字’,
nick_name varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT ‘昵称’,
sex int(2) DEFAULT NULL COMMENT ‘性别 0:女 1:男’,
concat_phone varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT ‘联系电话’,
address varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT ‘地址’,
status varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT ‘是否在线’,
user_ip varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT ‘用户ip’,
PRIMARY KEY (id) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

SET FOREIGN_KEY_CHECKS = 1;

用户请求登录后获取用户的ip

public String getUserIp(HttpServletRequest request) {
String ip = request.getHeader(“x-forwarded-for”);
try {
if (ip == null || ip.length() == 0
|| “unknown”.equalsIgnoreCase(ip)) {
ip = request.getHeader(“Proxy-Client-IP”);
}
if (ip == null || ip.length() == 0
|| “unknown”.equalsIgnoreCase(ip)) {
ip = request.getHeader(“WL-Proxy-Client-IP”);
}
if (ip == null || ip.length() == 0
|| “unknown”.equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
if (ip.equals(“127.0.0.1”) || ip.equals(“0:0:0:0:0:0:0:1”)) {
// 根据网卡取本机配置的IP
InetAddress inet = InetAddress.getLocalHost();
ip = inet.getHostAddress();

                // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
                if (ip != null && ip.length() > 15) { // "***.***.***.***".length()
                    // = 15
                    if (ip.indexOf(",") > 0) {
                        ip = ip.substring(0, ip.indexOf(","));
                    }
                }
            }
        }
        if (ip != null && ip.length() > 15) { // "***.***.***.***".length()
        // = 15
            if (ip.indexOf(",") > 0) {
                ip = ip.substring(0, ip.indexOf(","));
            }
        }
        System.out.println("ip" + ip);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return ip;
}

用户上传的数据保存到template表中

@RequestMapping("/upload")
public Result userLogin(User user){
    String loginname = user.getLoginname();
    try {
        Assert.isNull(loginname, MessageCode.LOGIN_NAME_NOT_NULL);
    } catch (Exception e) {
        e.printStackTrace();
        return Result.fail();
    }
    userService.addUserTemplate(user);
    return Result.success();
}

现在除了页面,逻辑其实就是聊天功能要稍微复杂一些,暂时考虑的点就这么多,目前没写到页面实现,至于离线消息的存储也需要考虑,一个小系统描述起来简单,实际写起来还是需要点时间的,尽快能完成吧!下周的年终总结已经提前写好了,等待下周发出来吧。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。