RFID课程设计-图书管理系统用户端设计

RFID课程设计-图书管理系统用户端设计课程设计题目课程设计任务内容题目设计基本原理NFC开发概述标签调度系统如何将 NFC 标签映射到 MIME 类型和 URI如何将 NFC 标签分发到应用在 Android 清单中请求 NFC 访问权限过滤 NFC IntentACTION_NDEF_DISCOVEREDACTION_TAG_DISCOVERED从 Intent 中获取信息总体框架设计移动端读写器服务器端数据库管理后台UI卡片标签端系统流程移动端设计activity设计概览用户登录逻辑借阅图书逻辑activity转跳逻辑服务器端设计用户相关接口登录获取用户信息图书相关接口获取图书列表获取图书详情响应参数响应示例借阅相关接口图书借阅接口图书归还接口查看借阅记录接口后台UI与数据库设计卡片数据结构设计用户卡片数据结构图书卡片数据结构结果演示总结与展望总结:展望:收获:心得:

课程设计教学目的

RFID 是物联网工程专业的核心课程,通过本课程设计,使学生熟悉 RFID 工作的基本原理、掌握 RFID 应用系统开发的基本步骤。要求学生掌握 RFID 实验的基本操作,并结合应用背景进行系统设计和开发。通过调研 RFID 的应用情景,设计一个模仿实际应用的 RFID 系统,包括运用 RFID 标签和读写器,并将 RFID 系统结合上层数据库系统进行开发,完成一个完整的演示系统。从而提高学生利用 RFID 来进行应用系统开发的分析、设计、实现的能力,以及使用 RFID 技术解决实际问题的能力。

对于本次课设,我将对应得代码内容发布在了github上,欢迎收藏:

课程设计题目


课程设计任务内容

任务一:校园卡消费系统。基于之前《RFIF与智能卡设计》课程课内实验构建的读卡器卡片实验系统(手机-13.56MHz- rfid卡片)进行拓展,实现读卡器系统与远程服务器(高层)的通信,并在高层构建数据库以及相应的管理系统,组成一个校园卡充值与消费系统,远程服务器须为任务组内另一个同学的手机或者是笔记本。要求完成整个物联网系统的方案设计(含软硬件框图,服务器端有数据库设计,人机界面管理设计)、程序设计、程序实现、程序测试与验证。

任务二:基于任务一所述读卡器、所述卡片、所述服务器构建的任意物联网应用系统。

任务三:学生自主选择项目(针对有相关条件的学生)。面向任意场景,凡是能利用RDIF读卡器针对卡片进行读写,并能体现物联网智慧感知、泛在传输、信息存储与检索、智能决策与控制四个维度的一切项目,并能形成一个完整的可考核的系统。

题目设计

设计一套基于手机NFC系统的图书馆管理系统,实现以下基本功能:

  • 用户管理:实现用户签到/签离操作,管理用户的基本信息;

  • 图书管理:实现对图书基本内容的管理,包括图书信息的管理和借阅归还的操作;

  • 卡片管理:实现基于多种卡片协议的管理,包括卡片读取与信息展示等功能。

该系统需要满足NFC基本协议,以实现卡片与手机的信息交互。通过该系统,用户能够方便地查找、借阅和归还图书,提升图书馆管理效率和用户体验。

基本原理


近距离无线通信 (NFC) 是一组近距离无线技术,通常只有在距离不超过 4 厘米时才能启动连接。借助 NFC,您可以在 NFC 标签与 Android 设备之间或者两台 Android 设备之间共享小型负载。

标签的复杂度可能各有不同。简单标签仅提供读取和写入语义,有时可使用一次性可编程区域将卡片设置为只读。较复杂的标签可提供数学运算,还可使用加密硬件来验证对扇区的访问权限。最为复杂的标签可包含操作环境,允许与针对标签执行的代码进行复杂的互动。存储在标签中的数据也可以采用多种格式编写,但许多 Android 框架 API 都基于名为 NDEF(NFC 数据交换格式)的 NFC Forum 标准。

支持 NFC 的 Android 设备同时支持以下三种主要操作模式:

  1. 读取器/写入器模式:支持 NFC 设备读取和/或写入被动 NFC 标签和贴纸。

  1. 点对点模式:支持 NFC 设备与其他 NFC 对等设备交换数据;Android Beam 使用的就是此操作模式。

  1. 卡模拟模式:支持 NFC 设备本身充当 NFC 卡。然后,可以通过外部 NFC 读取器(例如 NFC 销售终端)访问模拟 NFC 卡。

NFC开发概述


从 NFC 标签读取 NDEF 数据的操作由标签调度系统进行处理,该系统会分析已发现的 NFC 标签,对相应数据进行适当分类,然后启动对分类后的数据感兴趣的应用。如果某个应用想要处理扫描到的 NFC 标签,则可以声明 Intent 过滤器,并请求对数据进行处理。

借助 Android Beam™ 功能,设备可以将 NDEF 消息推送到另一台设备,方法是将两台设备靠在一起。与蓝牙等其他无线技术相比,这种互动可提供更简便的数据发送方式,因为使用 NFC 时无需手动发现设备并将其配对。当两台设备之间的距离近到一定范围内时,系统会自动开始连接。Android Beam 功能通过一组 NFC API 提供,因此任何应用都可以在设备间传输信息。例如,通讯录、浏览器和 YouTube 应用可使用 Android Beam 在多台设备之间共享联系人信息、网页和视频。

标签调度系统

Android 设备通常会在屏幕解锁后查找 NFC 标签,除非设备的“设置”菜单中停用了 NFC 功能。在 Android 设备发现 NFC 标签后,期望的行为就是让最合适的 Activity 来处理该 Intent,而不是询问用户应使用哪个应用。由于设备需要在非常近的范围内扫描 NFC 标签,因此,让用户手动选择 Activity 可能会迫使他们将设备从标签处移开并导致连接中断。您应以适当方式开发您的 Activity,使其仅处理所关注的 NFC 标签,以避免 Activity 选择器出现。

Android 提供了一个特殊的标签调度系统,用于分析扫描到的 NFC 标签、解析它们并尝试找到对扫描到的数据感兴趣的应用。这个标签调度系统通过以下操作来实现这些目的:

  1. 解析 NFC 标签并确定 MIME 类型或 URI(后者用于标识标签中的数据负载)。

  1. 将 MIME 类型或 URI 与负载一起封装到 Intent 中。如何将 NFC 标签映射到 MIME 类型和 URI 中介绍了前两个步骤。

  1. 根据 Intent 启动 Activity。如何将 NFC 标签分发到应用中介绍了此步骤。

如何将 NFC 标签映射到 MIME 类型和 URI

NDEF 数据封装在包含一条或多条记录 (NdefRecord) 的消息 (NdefMessage) 内。每条 NDEF 记录的格式都必须正确,符合您要创建的记录所属的类型对应的规范。Android 还支持其他类型的不包含 NDEF 数据的标签,可以使用 android.nfc.tech 软件包中的类处理这些标签。

当 Android 设备扫描包含 NDEF 格式数据的 NFC 标签时,它会解析该消息并尝试确定数据的 MIME 类型或起标识作用的 URI。为此,系统需要读取 NdefMessage 中的第一条 NdefRecord,以确定如何解读整个 NDEF 消息(一个 NDEF 消息可能具有多条 NDEF 记录)。在格式正确的 NDEF 消息中,第一条 NdefRecord 包含以下字段:

  • 3 位 TNF(类型名称格式)

表示如何解读可变长度类型字段。表 1 中介绍了有效的值。

  • 可变长度类型

介绍了记录的类型。如果使用 TNF_WELL_KNOWN,那么请使用此字段来指定记录类型定义 (RTD)。表 2 中介绍了有效的 RTD 值。

  • 可变长度 ID

记录的唯一标识符。此字段并不经常使用,但如果您需要对标签进行唯一标识,则可为其创建 ID。

  • 可变长度负载

您要读取或写入的实际数据负载。一个 NDEF 消息可以包含多条 NDEF 记录,因此不要假定 NDEF 消息的第一条 NDEF 记录中就有完整的负载。

标签调度系统使用 TNF 和类型字段来尝试将 MIME 类型或 URI 映射到 NDEF 消息。如果成功映射,它会将相关信息与实际负载一起封装到 ACTION_NDEF_DISCOVERED Intent 内。不过,在某些情况下,标签调度系统无法根据第一条 NDEF 记录来确定数据的类型。如果 NDEF 数据无法映射到 MIME 类型或 URI,或者 NFC 标签不包含 NDEF 数据,就会出现上述情况。在此类情况下,标签调度系统会转而将含有标签技术相关信息的 Tag 对象及负载封装到 ACTION_TECH_DISCOVERED Intent 中。

表 1 介绍了标签调度系统如何将 TNF 和类型字段映射到 MIME 类型或 URI,还介绍了哪些 TNF 无法映射到 MIME 类型或 URI。如果无法映射,标签调度系统会回退到 ACTION_TECH_DISCOVERED。

例如,如果标签调度系统遇到 TNF_ABSOLUTE_URI 类型的记录,则会将该记录的可变长度类型字段映射到 URI 中。标签调度系统将此 URI 连同与标签有关的其他信息(如负载)一起封装在 ACTION_NDEF_DISCOVERED Intent 的数据字段中。另一方面,如果标签调度系统遇到 TNF_UNKNOWN 类型的记录,则会转而创建一个 Intent,用于封装与标签技术相关的信息。

表 1. 支持的 TNF 及其映射

类型名称格式 (TNF)

映射

TNF_ABSOLUTE_URI

基于类型字段的 URI。

TNF_EMPTY

回退到 ACTION_TECH_DISCOVERED。

TNF_EXTERNAL_TYPE

基于类型字段中 URN 的 URI。URN 以缩短形式 (*<domain_name>:<service_name>*) 编码到 NDEF 类型字段中。Android 会以如下形式将此映射到 URI:vnd.android.nfc://ext/*<domain_name>:<service_name>*。

TNF_MIME_MEDIA

基于类型字段的 MIME 类型。

TNF_UNCHANGED

在第一条记录中无效,因此会回退到 ACTION_TECH_DISCOVERED。

TNF_UNKNOWN

回退到 ACTION_TECH_DISCOVERED。

TNF_WELL_KNOWN

MIME 类型或 URI,具体取决于您在类型字段中设置的记录类型定义 (RTD)。如需详细了解可用的 RTD 及其映射,请参阅表 2

表 2. TNF_WELL_KNOWN 支持的 RTD 及其映射

记录类型定义 (RTD)

映射

RTD_ALTERNATIVE_CARRIER

回退到 ACTION_TECH_DISCOVERED。

RTD_HANDOVER_CARRIER

回退到 ACTION_TECH_DISCOVERED。

RTD_HANDOVER_REQUEST

回退到 ACTION_TECH_DISCOVERED。

RTD_HANDOVER_SELECT

回退到 ACTION_TECH_DISCOVERED。

RTD_SMART_POSTER

基于负载解析结果的 URI。

RTD_TEXT

text/plain 的 MIME 类型。

RTD_URI

基于负载的 URI。

如何将 NFC 标签分发到应用

当标签调度系统创建完用于封装 NFC 标签及其标识信息的 Intent 后,它会将该 Intent 发送给感兴趣的应用,由这些应用对其进行过滤。如果有多个应用可处理该 Intent,系统会显示 Activity 选择器,供用户选择要使用的 Activity。标签调度系统定义了三种 Intent,按优先级从高到低列出如下:

  1. ACTION_NDEF_DISCOVERED:如果扫描到包含 NDEF 负载的标签,并且可识别其类型,则使用此 Intent 启动 Activity。这是优先级最高的 Intent,标签调度系统会尽可能尝试使用此 Intent 启动 Activity,在行不通时才会尝试使用其他 Intent。

  1. ACTION_TECH_DISCOVERED:如果没有登记要处理 ACTION_NDEF_DISCOVERED Intent 的 Activity,则标签调度系统会尝试使用此 Intent 来启动应用。此外,如果扫描到的标签包含无法映射到 MIME 类型或 URI 的 NDEF 数据,或者该标签不包含 NDEF 数据,但它使用了已知的标签技术,那么也会直接启动此 Intent(无需先启动 ACTION_NDEF_DISCOVERED)。

  1. ACTION_TAG_DISCOVERED:如果没有处理 ACTION_NDEF_DISCOVERED 或者 ACTION_TECH_DISCOVERED Intent 的 Activity,则使用此 Intent 启动 Activity。

标签调度系统的基本工作方式如下:

  1. 在解析 NFC 标签(ACTION_NDEF_DISCOVERED 或 ACTION_TECH_DISCOVERED)时,尝试使用由标签调度系统创建的 Intent 启动 Activity。

  1. 如果不存在过滤该 Intent 的 Activity,则尝试使用下一优先级的 Intent(ACTION_TECH_DISCOVERED 或 ACTION_TAG_DISCOVERED)启动 Activity,直到应用过滤该 Intent 或者直到标签调度系统试完所有可能的 Intent。

  1. 如果没有应用过滤任何 Intent,则不执行任何操作。

尽可能使用 NDEF 消息和 ACTION_NDEF_DISCOVERED Intent,因为它是三种 Intent 中最具体的一种。与其他两种 Intent 相比,此 Intent 可使您在更恰当的时间启动应用,从而为用户带来更好的体验。

在 Android 清单中请求 NFC 访问权限

先在 AndroidManifest.xml 文件中声明以下内容,然后才能访问设备的 NFC 硬件并正确处理 NFC Intent:

  • uses-permission用于访问 NFC 硬件的 NFC

<uses-permissionandroid:name="android.permission.NFC"/>

  • 应用支持的最低 SDK 版本。API 级别 9 仅通过ACTION_TAG_DISCOVERED支持有限的标签调度,并且只能通过EXTRA_NDEF_MESSAGESextra 提供对 NDEF 消息的访问权限。无法访问其他任何标签属性或 I/O 操作。API 级别 10 提供全面的读取器/写入器支持以及前台 NDEF 推送功能;API 级别 14 则提供了一种更简便的方式(即,使用 Android Beam 将 NDEF 消息推送到其他设备),同时提供了用于创建 NDEF 记录的其他便捷方法。

<uses-sdkandroid:minSdkVersion="10"/>

  • uses-feature元素,以便您的应用仅在那些具备 NFC 硬件的设备的 Google Play 中显示:

<uses-featureandroid:name="android.hardware.nfc"android:required="true"/>

如果您的应用使用 NFC 功能,但该功能对您的应用来说并不重要,您可以省略 uses-feature 元素,并在运行时通过检查 getDefaultAdapter() 是否为 null 来了解 NFC 的可用性。

过滤 NFC Intent

要在扫描到您打算处理的 NFC 标签时启动您的应用,您的应用可以在 Android 清单中过滤一个、两个或所有三个 NFC Intent。不过,您通常需要过滤 ACTION_NDEF_DISCOVERED Intent,以最有力地控制应用在何时启动。如果没有应用过滤 ACTION_NDEF_DISCOVERED,或者负载不是 NDEF,ACTION_TECH_DISCOVERED Intent 会取代 ACTION_NDEF_DISCOVERED。ACTION_TAG_DISCOVERED 通常因过于笼统而不适合过滤。许多应用会在过滤 ACTION_TAG_DISCOVERED 前过滤 ACTION_NDEF_DISCOVERED 或 ACTION_TECH_DISCOVERED,导致 您的应用启动的概率会比较低。过滤 ACTION_TAG_DISCOVERED 是应用在没有其他应用来处理 ACTION_NDEF_DISCOVERED 或 ACTION_TECH_DISCOVERED Intent 的情况下的最后一道保险。

由于 NFC 标签部署各有不同,并且很多时候它们都不由您控制,因此,ACTION_NDEF_DISCOVERED 不一定每次都可用,您可以根据需要回退到另外两种 Intent。如果您可以控制标签和写入数据的类型,建议您使用 NDEF 来设置标签的格式。以下几部分介绍了如何过滤各类 Intent。

ACTION_NDEF_DISCOVERED

要过滤 ACTION_NDEF_DISCOVERED Intent,请声明 Intent 过滤器以及要过滤的数据类型。以下示例展示了如何过滤 MIME 类型为 text/plain 的 ACTION_NDEF_DISCOVERED Intent:

<intent-filter>

<actionandroid:name="android.nfc.action.NDEF_DISCOVERED"/>

<categoryandroid:name="android.intent.category.DEFAULT"/>

<dataandroid:mimeType="text/plain"/>

</intent-filter>

ACTION_TAG_DISCOVERED

过滤 ACTION_TAG_DISCOVERED,使用以下 Intent 过滤器:

<intent-filter>

<actionandroid:name="android.nfc.action.TAG_DISCOVERED"/>

</intent-filter>

从 Intent 中获取信息

如果某个 Activity 由于 NFC Intent 而启动,您可以从该 Intent 中获取有关扫描到的 NFC 标签的信息。Intent 可以包含以下 extra,具体取决于扫描到的标签:

  • EXTRA_TAG(必需):一个 Tag 对象,表示扫描到的标签。

  • EXTRA_NDEF_MESSAGES(可选):从标签中解析出的一组 NDEF 消息。此 extra 对于 ACTION_NDEF_DISCOVERED Intent 而言是必需的。

  • EXTRA_ID(可选):标签的低级别 ID。

要获取这些 extra,请检查您的 Activity 是不是使用某个 NFC Intent 启动的,以确保已扫描到标签,然后获取 Intent 的 extra。以下示例展示了如何检查 ACTION_NDEF_DISCOVERED Intent 并从 Intent extra 获取 NDEF 消息。

@Override

protectedvoidonNewIntent(Intentintent) {

super.onNewIntent(intent);

...

if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {

Parcelable[] rawMessages=

intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);

if (rawMessages!=null) {

NdefMessage[] messages=newNdefMessage[rawMessages.length];

for (inti=0; i<rawMessages.length; i++) {

messages[i] = (NdefMessage) rawMessages[i];

}

// Process the messages array.

...

}

}

}

或者,您可以从 Intent 中获取 Tag 对象,该对象包含负载并允许您枚举标签的技术:

Tagtag=intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

总体框架设计


在本报告中,我们将介绍基于手机的NFC系统的图书馆管理系统的设计。我们将讨论设计的主要组成部分,包括移动端读写器,服务器端和卡片标签端。该系统旨在提供管理用户的签入和签离,管理用户的基本信息,管理图书的基本内容,允许用户通过卡片查看图书信息,并管理书本的借阅和归还的能力。

我们将在我们的安卓手机上,基于安卓平台来进行系统的设计

系统主要分为三大部分:

  • 移动端读写器(手机平台端)

  • 服务器端

  • 数据库管理

  • 后台ui

  • 卡片标签端

移动端读写器

移动端读写器是图书馆管理系统的前端界面,允许用户访问系统功能并与标签进行通信。在我们的系统中,移动端读写器将是一个安卓应用程序。它将允许用户通过NFC通信协议与标签进行通信,并可以进行以下操作:

  • 管理用户的签入和签离

  • 查看和编辑用户信息

  • 查看和编辑图书信息

  • 借阅和归还书本

  • 与服务器端通信

服务器端

服务器端是系统的后端,负责存储和管理所有用户和书本的信息。在我们的系统中,服务器端将包括以下:

  1. 数据库设计:需要设计数据库模型,包括图书信息、用户信息、借阅记录等表。根据实际需求,可以选择使用关系型数据库或非关系型数据库。

  1. 接口设计:需要设计RESTful API接口,用于提供给客户端访问和调用。可以使用常见的API设计规范,如Swagger等。

  1. 业务逻辑:需要设计服务端的业务逻辑,包括用户登录认证、图书借阅、图书归还等。需要注意保证系统安全性和数据一致性。

  1. 部署和运维:需要设计服务端的部署方案,选择适合的服务器和云服务提供商,并确保系统的高可用性和可靠性。

  1. 监控和日志:需要设计监控和日志系统,对服务端进行实时监控和日志记录,及时发现和解决问题。

数据库管理

数据库将存储系统中所有的用户和书本信息。我们将使用一个关系型数据库管理系统(RDBMS)来存储数据。该数据库将包含以下数据表:

  • 用户信息表:存储每个用户的姓名、联系信息、借阅历史记录等信息。

  • 书本信息表:存储每本书的书名、作者、出版日期、ISBN、借阅状态等信息。

  • 借阅记录表:存储每个用户的借阅历史记录,包括书名、借阅日期和归还日期等信息。

后台UI

后台UI是服务器端的管理界面,允许管理员查看和编辑系统中的所有信息。它还允许管理员查看系统的使用情况和生成报告。

后端UI设计详见附件,不作为该课设的核心内容。

卡片标签端

卡片标签端是RFID标签,包含与每本书籍关联的信息。在我们的系统中,我们将使用NFC标签作为RFID标签。

目前对对应内容进行了筛选,实现中保留核心内容。

系统流程


以下是我们系统的主要流程:

  1. 用户使用移动端读写器扫描NFC标签以查看图书信息。

  1. 用户可以选择借阅书本。

  1. 如果书本可借,系统将在数据库中更新书本的借阅状态和借阅记录,并将借阅信息写入NFC标签。

  1. 如果书本不可借阅,则返回给用户对应的信息。

每个步骤的详细内容,将会在后面的章节中详细描述。

移动端设计


当今时代,移动应用的使用已经成为人们日常生活的一部分。在此背景下,我们开发了一款基于NFC技术的移动应用,旨在为用户提供更加便捷的图书管理服务。本文将介绍该移动应用的设计和实现,包括前端界面、后端服务以及NFC技术的应用。我们致力于通过简单易用的操作方式,使用户能够方便地管理自己的图书,并实现快捷、高效的借阅与归还功能。

activity设计

概览

  1. MainActivity:作为程序的主界面,主要功能包括登录、注册、查询等。在 onCreate() 方法中初始化视图,注册监听器,并实现登录、注册等功能。

  1. BookListActivity:作为书籍列表界面,主要功能包括展示书籍列表、跳转到书籍详情页面等。在 onCreate() 方法中初始化视图,从数据库中查询书籍列表并展示在 RecyclerView 中,注册监听器并实现跳转到书籍详情页面的功能。

  1. BookDetailActivity:作为书籍详情界面,主要功能包括展示书籍详情、跳转到借阅页面等。在 onCreate() 方法中初始化视图,从数据库中查询书籍详情并展示,注册监听器并实现跳转到借阅页面的功能。

  1. BorrowBookActivity:作为借阅界面,主要功能包括选择借阅日期、确认借阅等。在 onCreate() 方法中初始化视图,注册监听器并实现选择借阅日期、确认借阅等功能。

如果需要写入卡片消息,可以使用WriteCardActivity。

如下图所示,为基本逻辑过程:

用户登录逻辑

登录是系统的基础功能之一,用户登录逻辑的设计决定了系统的安全性和用户体验。在该RFID系统中,用户登录分为两种方式:账户密码登录和刷卡登录。用户打开应用程序后,可以选择进入登录界面,并在登录界面中进行账户密码登录或者刷卡登录。

对于账户密码登录,应用程序会验证用户提供的账户和密码信息是否正确。如果验证通过,系统将允许用户登录;否则,系统会提示用户重新输入。这种方式需要用户记住账户和密码信息,相对来说安全性较高。

对于刷卡登录,应用程序会使用手机上的NFC功能读取卡片中的信息,并将这些信息补充到登录界面的账户和密码框中。然后应用程序会自动验证这些信息,并决定是否允许用户登录。这种方式相对于账户密码登录来说,用户体验更好,但是需要确保卡片信息的安全性。

如果用户成功登录,则应用程序会跳转到主界面,用户可以在主界面上浏览图书信息,或者使用其他功能。如果用户没有成功登录,则应用程序会显示错误提示,并要求用户重新输入或刷卡登录。这样的设计可以提高系统的安全性和用户体验,保障系统的正常运行。

登录的逻辑如下:

  • 首先,用户打开应用程序,可以选择进入登录界面。在登录界面中,用户可以选择输入账户和密码,也可以选择用手机刷卡的方式进行登录。

  • 如果用户选择输入账户和密码,应用程序会验证用户提供的信息是否正确,如果验证通过,则允许用户登录系统,否则会提示用户重新输入。

  • 如果用户选择刷卡登录,则应用程序会使用手机上的NFC功能读取卡片中的信息,并将这些信息补充到登录界面的账户和密码框中。然后应用程序会自动验证这些信息,并决定是否允许用户登录。

  • 如果用户成功登录,则应用程序会跳转到主界面,用户可以在主界面上浏览图书信息,或者使用其他功能。

  • 如果用户没有成功登录,则应用程序会显示错误提示,并要求用户重新输入或刷卡登录。

借阅图书逻辑

以下是关于借阅图书的逻辑:

  • 用户在主界面可以浏览到所有的图书信息,点击某个图书后,会跳转到该图书的详细界面。

  • 在详细界面中,用户可以看到该图书的详细信息,包括书名、作者、出版社、ISBN等等。同时也会显示该书是否被借出。

  • 如果该书没有被借出,用户可以选择借阅该书。点击借阅按钮后,应用程序会检查该用户是否有借阅权限以及是否已经借了太多书等等,如果一切正常,应用程序会将该书的借阅状态更新为“已借出”,并记录下借阅者的信息和借阅时间。

  • 如果该书已经被借出,用户只能选择加入预定列表,等到该书归还后再进行借阅。用户可以随时取消预定。

  • 如果用户在借阅过程中遇到任何问题,应用程序会显示错误提示,并要求用户重新操作。

此外,通过手机客户端借阅的图书会在借阅记录中留下相应的记录,包括借阅时间、归还时间等等。

activity转跳逻辑

基本的activity转跳流程如下:当我们进入程序时,系统会激活mainActivity。此时,系统会检查NFC功能是否已开启。如果未开启,则系统会提示我们前往设置界面打开NFC功能。在mainActivity中,我们的activity会捕获NFC事件。如果捕获的NFC事件中包含学生卡片信息,则我们会进入登录签到页面,并自动补全相应信息。如果捕获的NFC事件是图书卡片类型,则我们会进入图书详细内容界面。我们也可以通过按钮进入登录界面,在登录界面中同样会捕获NFC事件。如果捕获的NFC事件包含学生卡片信息,则会自动补全相应信息。在进入图书详细内容界面后,如果图书未被借走,则我们可以通过按钮进入登录界面,并使用登录验证进行借阅操作。

详细的事件转跳流程如下:

  • 首先是在MainActivity中的nfc事件捕获处理中,如果是学生卡片,则使用Intent对象创建登录签到页面的SignInActivity的实例,将卡片信息传递给SignInActivity,并通过startActivity()方法启动SignInActivity。如果是图书卡片,则使用Intent对象创建图书详细内容页面BookDetailActivity的实例,将卡片信息传递给BookDetailActivity,并通过startActivity()方法启动BookDetailActivity。

  • 在登录界面中,我们同样可以通过NFC事件捕获卡片信息。如果是学生卡片,则自动补全账户和密码,并允许用户进行登录操作。如果是图书卡片,则使用Intent对象创建图书详细内容页面的实例,将卡片信息传递给BookDetailActivity,并通过startActivity()方法启动BookDetailActivity。

  • 在图书详细内容页面中,如果图书未被借走,则显示借阅按钮,点击该按钮会使用Intent对象创建登录页面的实例,将图书信息传递给SignInActivity,并通过startActivity()方法启动SignInActivity,以允许用户进行借阅操作。如果图书已被借走,则显示“已借出”信息,无法进行借阅。

服务器端设计


当今,随着互联网技术的飞速发展,移动应用已经成为了人们生活中不可或缺的一部分。而在移动应用中,服务器端的设计和开发则起到了关键的作用。本文旨在介绍一个基于python语言的服务端设计,该服务端主要面向移动应用,提供了用户登录、图书借阅、图书信息管理等核心功能。通过本文的介绍,读者可以了解到该服务端的设计原则、关键技术和具体实现方法,以及一些关键的接口设计。

该课设服务端采用基于python语言的原生框架框架进行开发,使用了sqlite数据库进行数据存储(后期支持直接移植到高性能数据库系统)。

服务端主要包括以下功能:

  1. 用户管理:实现了用户的注册、登录、权限验证等功能。用户登录成功后,会生成一个token返回给客户端,用于后续的请求鉴权。

  1. 图书管理:实现了图书的添加、删除、修改和查询等功能。图书信息包括书名、作者、出版社、ISBN号、价格等信息。

  1. 借阅管理:实现了借阅记录的添加、查询和归还等功能。借阅记录包括借阅人、图书编号、借阅日期、归还日期等信息。

  1. RFID管理:实现了RFID标签的扫描、识别和关联功能。通过读取RFID标签上的信息,可以将图书和RFID标签关联起来,从而方便后续的图书管理和借阅管理。

  1. 文件上传:实现了文件上传的功能,用于上传图书的封面图片等文件。

  1. 统计分析:实现了借阅记录的统计分析功能,可以统计某一时间段内的借阅情况,生成图表进行展示。

以上功能均通过RESTful API对外提供服务,可以通过客户端调用相应的API进行访问。

该服务端的开发采用了分层设计的思想,将不同的业务逻辑分别封装在不同的服务类中,实现了代码的可读性和可维护性。

用户相关接口

登录

POST /api/user/login

请求参数:

参数名

类型

是否必须

描述

username

string

用户名

password

string

密码

card

string

卡片序列号

成功响应:

HTTP/1.1200OK

Content-Type: application/json;charset=UTF-8

{

"code": 0,

"msg": "登录成功",

"data": {

"token": "xxxxxxxxxxxx",

"userInfo": {

"id": 123,

"username": "张三",

"role": "user"

}

}

}

失败响应:

HTTP/1.1401Unauthorized

Content-Type: application/json;charset=UTF-8

{

"code": 401,

"msg": "用户名或密码错误"

}

获取用户信息

GET /api/user/profile

请求头:

参数名

类型

是否必须

描述

Authorization

string

用户令牌

成功响应:

HTTP/1.1200OK

Content-Type: application/json;charset=UTF-8

{

"code": 0,

"msg": "获取用户信息成功",

"data": {

"id": 123,

"username": "张三",

"role": "user"

}

}

失败响应:

HTTP/1.1401Unauthorized

Content-Type: application/json;charset=UTF-8

{

"code": 401,

"msg": "用户未登录"

}

图书相关接口

获取图书列表

GET /api/book/list

请求参数:

参数名

类型

是否必须

描述

offset

number

偏移量,默认为0

limit

number

数量限制,默认为10

成功响应:

HTTP/1.1200OK

Content-Type: application/json;charset=UTF-8

{

"code": 0,

"msg": "获取图书列表成功",

"data": [

{

"id": 1,

"name": "三体",

"author": "刘慈欣",

"publisher": "重庆出版社",

"ISBN": "978-7-234-70987-1",

"category": "科幻",

"description": "这是一本非常好的科幻小说。",

"location": "A2-1-1",

"status": 0

},

...

]

}

失败响应:

HTTP/1.1400BadRequest

Content-Type: application/json;charset=UTF-8

{

"code": 400,

"msg": "参数错误"

}

获取图书详情

GET /api/book/detail/:id

请求参数

参数名

参数类型

是否必须

描述

bookId

Integer

图书 ID,整数类型

响应

  • 响应状态码:200 OK

  • 响应体:

jsonCopycode{

"bookId": 1,

"bookName": "图书A",

"author": "作者A",

"publisher": "出版社A",

"publishTime": "2022-01-01",

"borrowed": false,

"borrowerId": null

}

响应参数

参数名

参数类型

是否必须

描述

bookId

Integer

图书 ID,整数类型

bookName

String

图书名称

author

String

作者

publisher

String

出版社

publishTime

String

出版时间,格式为 yyyy-MM-dd

borrowed

Boolean

是否已借出

borrowerId

Integer

借阅人 ID,整数类型。如果未借出,则为 null

响应示例

jsonCopycode{

"bookId": 1,

"bookName": "图书A",

"author": "作者A",

"publisher": "出版社A",

"publishTime": "2022-01-01",

"borrowed": false,

"borrowerId": null

}

注意:如果图书不存在,则返回 404 Not Found 状态码。

借阅相关接口

图书借阅接口

  • 接口名称:/book/borrow

  • 请求方式:POST

  • 请求参数:

  • card_id:借阅者的卡号,必填

  • book_id:被借阅的图书的ID,必填

  • 响应参数:

  • code:状态码,成功为200,失败为400

  • msg:响应消息,成功为“借阅成功”,失败为具体错误信息

图书归还接口

  • 接口名称:/book/return

  • 请求方式:POST

  • 请求参数:

  • card_id:借阅者的卡号,必填

  • book_id:被归还的图书的ID,必填

  • 响应参数:

  • code:状态码,成功为200,失败为400

  • msg:响应消息,成功为“归还成功”,失败为具体错误信息

查看借阅记录接口

  • 接口名称:/book/records

  • 请求方式:POST

  • 请求参数:

  • card_id:借阅者的卡号,必填

  • 响应参数:

  • code:状态码,成功为200,失败为400

  • msg:响应消息,成功为“查询成功”,失败为具体错误信息

  • data

:借阅记录列表,为一个列表,每个元素包括:

  • book_id:图书ID

  • borrow_time:借阅时间

  • return_time:归还时间(如果未归还,则为null)

后台UI与数据库设计

后台UI与数据库设计详见附件二。

卡片数据结构设计


卡片的数据主要分为两大部分:

  • MIME type

  • payload(负载)

我们基于MIME type来识别不同的服务,payload存储主要数据

存储数据基于基本的json对象逻辑,可以使用加密算法进行保护

主要卡片:

用户卡片数据结构

学生卡用于登录系统和借阅图书,包含以下信息:

  • 卡片ID:每个学生卡片都有一个唯一的ID。

  • 学号:学生的学号。

  • 姓名:学生的姓名。

  • 密码:用于登录系统的密码。

  • 借书记录:包含学生已经借阅的图书信息,包括图书的ISBN号和借阅日期。

mime: obj/user

{

"type": "student",

"card_id": "xxxx-xxxx-xxxx-xxxx", // 卡片 ID,格式为 UUID

"name": "张三", // 学生姓名

"student_id": "20220001" // 学号

}

图书卡片数据结构

图书卡贴在书本上,用于记录图书的信息,包含以下信息:

  • 卡片ID:每个图书卡片都有一个唯一的ID。

  • ISBN号:图书的ISBN号。

  • 书名:图书的名称。

  • 作者:图书的作者。

  • 出版社:图书的出版社。

  • 图书状态:用于记录图书是否被借阅,包括已被借阅和可借阅两种状态。

mime: obj/book

{

"type": "book",

"card_id": "xxxx-xxxx-xxxx-xxxx", // 卡片 ID,格式为 UUID

"book_id": "978-7-121-12345-6", // 书籍 ID,格式为 ISBN

"name": "《Java编程思想》", // 书籍名称

"author": "Bruce Eckel", // 作者

"publisher": "机械工业出版社", // 出版社

"price": 98.0, // 价格

"available": true // 是否可借阅

}

结果演示


对应页面

图片示例

开启NFC界面:该页面是用户第一次进入应用时出现的页面,主要用于提醒用户打开NFC功能。

这是初始页面,可以在此选择进行登录或者其他操作。如果需要登录,可以点击下方的登录按钮,进入登录页面进行验证。如果不需要登录,也可以直接使用其他功能,比如查看图书信息。

书本内容编辑页面可以通过此按钮进行转跳

功能页面

登录页面:该页面是用户用于登录和签到的页面,用户可以通过输入用户名和密码登录系统,也可以使用NFC卡片自动补全信息。

登录读卡失败,弹出消息

阅读卡片成功

登录验证失败

书本内容编辑页面是用于管理员对图书馆的书本信息进行编辑的界面。修改完消息可以对图书的卡片进行写入。

图书详情页面:该页面显示了图书的详细信息,包括书名、作者、出版社、简介等内容。同时,如果该书可以被借阅,用户可以通过该页面进行借阅操作。

总结与展望


总结:

本文基于手机的NFC系统,设计了一套合适的图书馆管理系统。该系统能够管理用户的签到、签离、借阅和归还等基本功能,同时也能管理图书的基本信息。在系统的实现中,我们使用了Android平台作为开发环境,设计了移动端读写器、服务器端和卡片标签端三个部分。具体的实现细节包括NFC设计、前端设计、数据库设计、URL设计、卡片数据结构设计等。

展望:

该系统还可以进一步完善和优化,例如可以添加一些高级功能,如催还提醒、图书馆藏书量实时监控等。同时,可以考虑将系统移植到其他平台上,如iOS等,以满足更广泛的用户需求。此外,我们也可以加强数据加密和安全性保护,确保用户数据的安全和隐私。

收获:

在本次设计中,我们学习了如何使用手机的NFC功能,如何设计并实现一个图书馆管理系统,并深入了解了Android开发的各个方面。在此过程中,我们不仅学会了如何设计和实现一个系统,同时也掌握了如何进行项目规划、技术选型、开发和测试等方面的知识。

心得:

在开发一个系统之前,我们需要对系统进行充分的规划和设计。本次设计中,我们在系统设计之前先明确了需求和功能,并设计了详细的架构和数据结构。这使得我们在开发过程中更加明确方向、更加高效有序。在开发过程中,我们也学到了如何合理地分配开发任务和管理开发进度,这对于团队协作和项目管理都具有重要的意义。同时,我们也要注重系统的可扩展性和可维护性,在设计时充分考虑系统的灵活性和可扩展性,以便后续的维护和升级。

猜你喜欢

转载自blog.csdn.net/interval_package/article/details/129517591