JavaWeb - Spring Boot に基づく書籍デジタル管理システムの設計と実装

コース設計の概要

1    概述

1.1  项目开发背景

情報技術の急速な発展に伴い、デジタル管理はあらゆる分野で効率と管理レベルを向上させる重要な手段となっています。図書館管理の分野では、デジタル管理システムは管理効率を効果的に向上させ、より良いユーザー エクスペリエンスを提供します。このプロジェクトは、Spring Boot をベースとした書籍デジタル管理システムを開発し、管理者と読者に便利な操作および管理機能を提供することを目的としています。

  • 自動管理の要件: 従来の図書館管理では、情報の貸出と返却の手動記録、書籍の分類、並べ替え、クエリなど、多くの手動操作が必要となることがよくあります。デジタル管理システムを開発することで、蔵書管理の自動化を実現し、人件費の削減と業務効率の向上を実現します。
  • ユーザー エクスペリエンスの向上: 図書館や書籍管理機関にとって、便利で使いやすいシステムを提供すると、ユーザー エクスペリエンスと満足度が向上します。デジタル管理システムでは、オンラインでの書籍照会、予約・貸出、セルフ貸出・返却などの機能を提供することで、利用者は必要な書籍をすぐに入手でき、煩雑な手続きを軽減することができます。
  • データ統計と分析: デジタル管理システムは、貸出と返却の記録、読者の好み、図書館リソースの利用状況などを含む、書籍関連の大量のデータを収集して保存できます。これらのデータの統計と分析を通じて、図書調達の最適化、貸出ルールの調整、関連書籍の推奨など、図書館管理者の意思決定をサポートできます。
  • セキュリティと保護: デジタル管理システムは、書籍および図書貸出情報のセキュリティ管理を強化できます。権限制御と本人確認により、許可された担当者のみが借入操作を実行できることが保証され、閲覧者のプライバシーと借入記録のセキュリティが保護されます。

Spring Boot に基づく本書のデジタル管理システムを通じて、管理者と読者は関連する操作と管理プロセスをオンラインで完了でき、管理効率が向上します。より良いユーザーエクスペリエンスを提供します。同時に、高いセキュリティ性、拡張・保守の容易さなどの特徴も備えており、図書館管理の新たなソリューションを提供します。

1.2  开发工具

本项目采用Windows 10IntelliJ IDEA进行系统开发。

1.3  採用されたテクノロジー

本项目主要采用的技术有JavaMySQLMavenSpringBootMybatis-PlusMySQLVue3ElementPlus等。

l Java: Java は広く使用されているプログラミングです。デスクトップアプリケーション、モバイルアプリケーション、Webアプリケーションなど、さまざまな分野に適しています。

l MySQL: MySQL は人気のあるオープンなクエリ言語としてSQL 言語を使用するソース リレーショナル データベース管理システム。Python など。

l Maven: Maven アプリケーションの構築、パッケージ化、展開を支援するプロジェクト用のツール。プロジェクトの依存関係を管理します。 JavaJava

l SpringBoot: SpringBoot は高速ツールです自動的に設定と迅速な設定を行う Spring フレームワークに基づいた Java アプリケーションを構築するためのツールです。開発インターフェイスによりJava開発が簡素化されます。

l Mybatis プラス: Mybatis プラスはいMybatis を強化し、よりシンプルなAPIとより強力な機能を提供するプラグインフルテーブル操作、ページングクエリなどのMybatisをデータベース操作にさらに便利に使用できます。

l Vue3: Vue3 はですVue.js フレームワークの最新バージョン。再利用可能なビルド用の強力なAPIを提供します。コンポーネントを作成し、高速で効率的なレンダリングのために仮想DOMを使用します。

l エレメントプラス: エレメントプラスElement UI のアップグレード バージョン。美しいWebを迅速に構築するためのテーマとコンポーネントが追加されています。アプリケーションインターフェイス。

1.4 プロジェクトメンバー

项目成员如表 1‑1 项目成员表 1‑1所示。

1‑1 项目成员

名前

位置

責任範囲

プロジェクトマネージャー

システムアーキテクチャの設計とデータ統合を担当

システムアナリスト

システムの実現可能性の分析、実装とテストのコンテンツの作成を担当します。

デザイナー

フロントエンドページのデザイン、インターフェースデザイン、データベースデザインのコンテンツライティングを担当

フロントエンド開発

フロントエンド開発を担当し、概要と開発ログを作成します。

バックエンド開発

バックエンド開発とインターフェース設計の作成を担当

テストエンジニア

システムのテストと実験の概要の作成を担当します。

運用保守エンジニア

システムの運用保守とシステム分析コンテンツの作成を担当します。

2    系统分析

2.1  需求分析

Spring Boot フレームワークに基づくデジタル ライブラリ管理システムの需要分析には、アカウント管理、書籍管理、借用関係管理、コンソール統計が含まれます。情報表示およびその他の機能モジュール。システムには、一般ユーザーと管理者が図書を借りることができる一般ユーザーインターフェースと、管理者がユーザーアカウントを管理する管理者インターフェースを提供する必要があります。また、Webサイトのアクセス数、利用者数、貸出冊数、総冊数などの統計情報をリアルタイムに表示できる統計機能も備えている必要があります。 SSM フレームワークの技術実装を通じて、システムはユーザーの電子書籍に合わせたユーザー登録、ログイン、書籍入力、貸出操作および管理機能を実現できます。管理ニーズ。

2.1.1       成本考虑

コストの考慮は、デジタル ライブラリ管理システムを開発するための要件分析における重要な要素です。チームの規模は 7 名、期限は 1 週間、資金は含まれません。コストの考慮事項には、人件費、開発ツールと環境のコスト、プロジェクト管理コスト、ハードウェアとインフラストラクチャのコスト、トレーニングとサポートのコストが含まれます。コストを評価する際には、コア機能を所定の時間内に実装できるようにするためのチームの作業時間、スキルレベル、開発ツール、インフラストラクチャのニーズを総合的に考慮し、実際の状況に基づいてトレードオフや意思決定を行う必要があります。

2.1.2       技术考虑

技術的な考慮事項の観点からは、フロントエンドはVue フレームワークを使用し、バックエンドはVue フレームワークを使用します。 3>Spring Bootフレームワーク、データベースの選択MySQL。技術的な考慮事項には、フロントエンド開発、バックエンド開発、データベースの選択、データ対話と API 設計、セキュリティに関する考慮事項が含まれます。これらのテクノロジーを合理的に活用することで、ユーザー インターフェイスの対話とデータ表示、ビジネス ロジックとデータ アクセスを実現し、システムの機能、パフォーマンス、セキュリティ要件を満たすデータのセキュリティと有効性を確保できます。

2.1.3       市场考虑

市場の考慮事項は、ターゲット ユーザー グループの明確化、競合分析、市場のニーズと傾向の理解、適切なビジネス モデルの設計、ユーザーのフィードバックと継続的な改善への注意など、需要分析において非常に重要です。これらの市場の考慮事項を通じて、システムは対象ユーザーのニーズを満たし、競合他社との競争力を維持し、商業的に実現可能で市場適応性があり、システムの持続可能な開発を成功させることができます。

2.1.4       用户考虑

ユーザーへの配慮では、対象となるユーザーの特性やニーズを深く理解し、使いやすいインターフェースや優れたユーザーエクスペリエンスを設計し、ユーザーの参加やフィードバックを促し、適切なトレーニングやサポートを提供し、ユーザーのプライバシーやデータセキュリティを確保する必要があります。これらのユーザーの考慮事項を通じて、システムはユーザーの期待とニーズを満たし、質の高いユーザー エクスペリエンスを提供し、ユーザーの信頼と満足度を構築して、システムの成功とユーザーの長期使用を実現します。

2.2  可行性分析

2.2.1       经济可行性

実現可能性分析では、開発コストとメンテナンス コストに焦点を当てます。チームの規模が 7 名、期限が 1 週間であるという条件に基づいて、限られた時間内でコア機能の開発が完了するように人件費を評価する必要があります。 Spring Boot などのオープン ソース フレームワークの使用に基づいて、開発コストを削減し、その後のメンテナンスとアップグレードのコストを削減できます。さらに経済的実現可能性を分析するには、システムのビジネス モデル、課金方法、潜在的な収益を包括的に考慮して、システムが十分な利益と収益性を確保できるようにする必要があります。

2.2.2       技术可行性

フロントエンドはVueフレームワークを使用し、バックエンドはSpring Boot<を使用します。 /span>、これらのテクノロジーは安定性と信頼性を備えた成熟した広く使用されているテクノロジー スタックです。開発チームはこれらのテクノロジーに精通しており、システムを効果的に開発および保守するための関連経験とスキルを持っています。関連する開発ツール、統合環境、データベース管理ツールも簡単に入手でき、システムの開発と展開をサポートするように構成できます。 MySQLフレームワーク、データベースの選択

2.2.3       操作可行性

システムの運用可能性とは、ユーザーにとってのシステムの利便性と操作性を指します。 Vue フレームワークとユーザーフレンドリーなインターフェイス設計を使用することで、直感的で使いやすいユーザー インターフェイスを提供でき、ユーザーは簡単に書籍を閲覧できます。 、アカウントの借用と管理はお待ちください。合理的なインターフェイスの対話と機能設計、および適切なユーザー トレーニングとサポートの提供により、ユーザーは迅速に使い始めてシステムを効率的に使用できます。

2.3  功能分析

機能分析としては、アカウント管理、図書管理、借入管理のほか、利用者数、借入件数、アクセス数などの表示機能があります。アカウント管理は一般ユーザーアカウント管理と管理者アカウント管理に分かれており、管理者アカウントは一般ユーザーを管理できます。書籍の管理には、書籍の追加、書籍の削除、書籍のクエリ、および書籍ページのクエリが含まれます。問い合わせには、個別の問い合わせと一括の問い合わせも含まれます。貸出管理には、一般利用者による図書の貸出と、管理者による図書の貸出とがあります。ユーザーは書籍を借りた後、返却または更新することができ、管理者は時間を保存、編集、調整できます。

3    系统设计

3.1  功能概述

このシステムは、管理者モジュールとリーダー モジュールに分かれています。

管理者モジュール:登録、ログイン、書籍管理、読者管理、貸出管理、貸出状況、個人情報変更、パスワード変更

リーダーモジュール:登録、ログイン、図書情報の確認、図書の貸し出しと返却、個人の貸出記録の表示、個人情報の変更、パスワードの変更

系统结构图如图 3‑1所示。

3‑1 系统结构图

3.2  界面设计

3.2.1 登録ページ

登録ページには、ユーザー名、パスワード、パスワードの確認、管理者/リーダー オプション、確認コード、登録ボタンが含まれています。ユーザーがこれらの手順を完了すると、正常に登録でき、システムはその後の操作を容易にするためにユーザー情報も保存します。具体的なページは図の通りです。

3‑2 读者注册页面

管理者オプションを選択すると、セキュリティを確保するために、追加の管理者登録コードが再確認のために表示されます。

3‑3 管理员注册页面

3.2.2       登录页面

アカウントのパスワードと確認コードを直接入力します。ユーザーがデータ テーブルに見つからない場合は、このユーザーを登録します。ユーザーが見つかった場合は、パスワードが正しいかどうかを確認します。正しい場合は、ユーザーの個人ページに入ります。ログイン ページを図 3‑4に示します。

3‑4 登录页面

3.2.3       ユーザー表示ボード ページ

ユーザー表示ページには、貸出冊数、総訪問数、蔵書数、ユーザー数、統計グラフの表示が含まれており、ユーザーが本の状況をより直感的に把握できるようになりました。管理。ユーザー表示ページを図 3‑5に示します。

3‑5 用户展示页面

3.2.4       ユーザーの個人情報

1)修改个人信息

個人情報を変更するには、ユーザー名、名前、電話番号、性別、住所を変更し、最後に保存します。個人情報を変更するためのページを図 3‑6に示します。

3‑6 修改个人信息

2)修改密码

ユーザーは、パスワードのセキュリティを確保する必要がある場合にパスワードを変更し、最後に新しいパスワードを送信できます。パスワード変更ページを図 3‑7に示します。

3‑7 修改密码页面

3.2.5       ユーザー ブック クエリ

ユーザーは、書籍番号、書籍名、著者を使用して書籍をクエリできます。一度に5冊まで借りることができます。ユーザー ブックのクエリ ページを図 3‑8に示します。

3‑8 用户图书查询

1)图书编号查询页面如图 3‑9所示。

 

画像 3‑9 書籍番号クエリ

2)作者查询如图 3‑10所示。

3‑10 作者查询

3.2.6       用户借阅信息

ユーザーは書籍が返品されたかどうかを確認したり、書籍番号、書籍名、著者を使用して返品ステータスを確認したりできます。ユーザー借用情報ページを図 3‑11に示します。

3‑11 用户借阅信息图

(1) 書籍番号クエリの返却ステータス ページは、図に示すとおりです。 3‑12 が表示されます。

3‑12 書籍番号クエリの返品ステータス図

3.2.7       用户借阅信息

ユーザーは借りている本の状況を確認し、返却日が来たら貸出を更新するかどうかを検討できます。ユーザーの借用情報を図 3‑13に示します。

3‑13 用户借阅信息

3.2.8       管理者用表示ボード

管理者表示ページには、貸出冊数、総来館数、蔵書数、利用者数、統計グラフの表示が含まれており、ユーザーが図書館の状況をより直感的に把握できるようになりました。管理。管理者表示ボード ページを図 3-14 に示します。

3‑14 管理员展示板

3.2.9       管理者の個人情報

1)修改个人信息

管理者は個人情報を変更し、ユーザー名、名前、電話番号、性別、住所を変更し、最終的に保存することができます。個人情報を変更するためのページを図 3‑15に示します。

3‑15 管理员个人信息图

2)修改密码

管理者はパスワードのセキュリティを確保してパスワードを変更し、最後に新しいパスワードを送信する必要があります。パスワード変更ページを図 3‑16に示します。

3‑16 修改密码

3.2.10     读者管理

管理者は、読者の情報を表示したり、読者の情報を変更したり、読者の情報を削除したりできます。リーダー管理ページを図 3‑17に示します。

3‑17 读者管理页面

3.2.11     书籍管理

管理者は、書籍の情報を表示したり、書籍の情報を変更したり、書籍の情報を削除したりすることができます。書籍管理ページを図 3‑18に示します。

​​​​​​​

3‑18 书籍管理

3.2.12     借阅管理

管理者は、図書番号、図書名、読者番号を使用して貸出情報を確認できます。借入管理ページを図 3‑19に示します。

3‑19 借阅管理

書籍番号クエリを図 3‑20に示します。

写真 3‑20 書籍番号クエリ

リーダー番号のクエリを図 3‑21に示します。

3‑21 读者编号查询图

3.2.13     借阅状态

管理者は、どの読者がその本を借りたか、どの本を借りたかを確認したり、借用情報を変更したり、借用情報を削除したりすることができます。借入ステータス ページを図 3‑22に示します。

3‑22 借阅状态

3.3  接口设计

3.3.1 ブックコントローラー

使用Spring Boot フレームワークRESTful インターフェイス コントローラ クラス書籍関連の業務を行っております。次のBookController各メソッドの機能説明(テーブル 3‑など) 1 が表示されます。

3‑1 BookController的方法

方法

効果

結果<?> save(@RequestBody Book Book)

Book オブジェクトをデータベースに保存し、保存された結果を返します。

結果<?> update(@RequestBody Book Book)

Book オブジェクトをデータベースに更新し、更新された結果を返します。

結果<?> deleteBatch(@RequestBody List

id に基づいて オブジェクトを削除し、戻ります削除後の結果。 Book

結果<?> delete(@PathVariable 長い ID)

id に基づいて オブジェクトを削除し、戻ります削除後の結果。 Book

3.3.2 BookWithUserController

使用Spring Boot フレームワークRESTful インターフェイス コントローラ クラス書籍およびユーザー関連の操作を処理します。以下は、BookWithUserController の各メソッドの機能の説明です ( が表示されます。

3-2BookWithUserController のメソッド

方法

効果

結果<?> insertNew(@RequestBody BookWithUser BookWithUser)

新しいBookWithUser オブジェクトをデータベースに追加し、新しく追加された結果を返します。

結果<?> update(@RequestBody BookWithUser BookWithUser)

BookWithUser オブジェクトをデータベースに更新し、更新された結果を返します。

結果<?> deleteRecord(@RequestBody BookWithUser BookWithUser)

BookWithUser オブジェクトをデータベースから削除し、削除された結果を返します。

3.3.3 ダッシュボードコントローラー

使用Spring Boot フレームワークRESTful インターフェイス コントローラ クラスダッシュボード関連の操作を処理します。ダッシュボードページでは、貸出冊数、総閲覧数、蔵書数、利用者数、統計グラフの表示が行われ、書籍の管理状況がより直感的に把握できるようになりました。

DashboardController クラスの主な機能は、ダッシュボード ページのGET リクエストを処理することです。他のMapper クラス メソッドを呼び出して関連する統計情報を取得し、この情報をキーと値のペアの形式で に保存します。 オブジェクトをマップし、最後に呼び出し元に戻ってダッシュボード ページを表示します。

3.3.4 LendRecordController

使用Spring Boot フレームワークRESTful インターフェイス コントローラ クラス借用記録に関する業務の処理。以下は、LendRecordController の各メソッド (table 3 ‑3 が表示されます。

3-3LendRecordController のメソッド

方法

効果

結果<?> deleteRecord(@RequestBody LendRecord LendRecord)

単一のLendRecord オブジェクトに基づいて削除を実行し、削除された結果を返します。

結果<?> deleteRecords(@RequestBody List

複数のLendRecord オブジェクトに基づいてバッチ削除操作を実行し、削除された結果を返します。

結果<?> save(@RequestBody LendRecord LendRecord)

単一のLendRecord オブジェクトをデータベースに保存し、保存された結果を返します。

3.3.5 ユーザーコントローラー

使用Spring Boot フレームワークRESTful インターフェイス コントローラ クラスユーザー関連の操作を処理します。以下は、tableUserControllerの各メソッドの機能説明です。 > 3 ‑4 が表示されます。

3‑4UserController のメソッド

方法

効果

結果<?> register(@RequestBody ユーザー ユーザー)

新しいユーザーをデータベースに登録し、登録結果を返します。

結果<?>ログイン(@RequestBody ユーザー ユーザー)

ユーザーのログインを確認し、ログイン結果を返します。

結果<?> save(@RequestBody ユーザー ユーザー)

ユーザー情報をデータベースに保存し、保存された結果を返します。

結果<?>パスワード(@RequestBody ユーザー ユーザー)

ユーザーのパスワードを変更し、変更した結果を返します。

結果<?> deleteBatch(@RequestBody List

ユーザーをバッチで削除し、削除された結果を返します。

3.4  データベース設計

本系统的数据库一共有4张数据表,分别是bookbookwithuserlend_recorduser表,表设计,如图 3‑23到图 3‑26所示。

3‑23 book表设计

3‑24 bookwithuser表设计

3‑25 レンド​​レコードテーブルのデザイン

3‑26 user表设计

4    实现与测试

4.1  主要なテクノロジーの実装 (主要な問題や困難をどのように解決するか)

4.1.1 ブックコントローラー

このモジュールは、書籍エンティティを保存し、bookMapper id およびバッチ ID を通じて書籍を更新するために使用されます。 による書籍の削除、ページの検索。 bookMapper id一括削除、

package com.example.demo.controller;

@RestController
@RequestMapping("/book")
public class BookController {
    @Resource
    BookMapper BookMapper;

    @PostMapping
    public Result<?> save(@RequestBody Book Book) {
        BookMapper.insert(Book);
        return Result.success();
    }

    @PutMapping
    public Result<?> update(@RequestBody Book Book) {
        BookMapper.updateById(Book);
        return Result.success();
    }

    //    批量删除
    @PostMapping("/deleteBatch")
    public Result<?> deleteBatch(@RequestBody List<Integer> ids) {
        BookMapper.deleteBatchIds(ids);
        return Result.success();
    }

    @DeleteMapping("/{id}")
    public Result<?> delete(@PathVariable Long id) {
        BookMapper.deleteById(id);
        return Result.success();
    }

    @GetMapping
    public Result<?> findPage(@RequestParam(defaultValue = "1") Integer pageNum,
                              @RequestParam(defaultValue = "10") Integer pageSize,
                              @RequestParam(defaultValue = "") String search1,
                              @RequestParam(defaultValue = "") String search2,
                              @RequestParam(defaultValue = "") String search3) {
        LambdaQueryWrapper<Book> wrappers = Wrappers.<Book>lambdaQuery();
        if (StringUtils.isNotBlank(search1)) {
            wrappers.like(Book::getIsbn, search1);
        }
        if (StringUtils.isNotBlank(search2)) {
            wrappers.like(Book::getName, search2);
        }
        if (StringUtils.isNotBlank(search3)) {
            wrappers.like(Book::getAuthor, search3);
        }
        Page<Book> BookPage = BookMapper.selectPage(new Page<>(pageNum, pageSize), wrappers);
        return Result.success(BookPage);
    }
}

4.1.2 BookWithUserController

このモジュールは、新しい借用関係エンティティを挿入し、書籍名と借用関係idを介して借用関係を更新し、更新するために使用されます。書籍名と借用関係による借用関係。 借用関係id1 つ以上の借用関係レコードを削除し、ページを検索します。具体的なコードは以下の通りです。

package com.example.demo.controller;

@RestController
@RequestMapping("/bookwithuser")
public class BookWithUserController {
    @Resource
    BookWithUserMapper BookWithUserMapper;

    @PostMapping("/insertNew")
    public Result<?> insertNew(@RequestBody BookWithUser BookWithUser) {
        BookWithUserMapper.insert(BookWithUser);
        return Result.success();
    }

    @PostMapping
    public Result<?> update(@RequestBody BookWithUser BookWithUser) {
        UpdateWrapper<BookWithUser> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("isbn", BookWithUser.getIsbn()).eq("id", BookWithUser.getId());
        BookWithUserMapper.update(BookWithUser, updateWrapper);
        return Result.success();
    }

    //删除一条记录
    @PostMapping("/deleteRecord")
    public Result<?> deleteRecord(@RequestBody BookWithUser BookWithUser) {
        Map<String, Object> map = new HashMap<>();
        map.put("isbn", BookWithUser.getIsbn());
        map.put("id", BookWithUser.getId());
        BookWithUserMapper.deleteByMap(map);
        return Result.success();
    }

    @PostMapping("/deleteRecords")
    public Result<?> deleteRecords(@RequestBody List<BookWithUser> BookWithUsers) {
        int len = BookWithUsers.size();
        for (int i = 0; i < len; i++) {
            BookWithUser curRecord = BookWithUsers.get(i);
            Map<String, Object> map = new HashMap<>();
            map.put("isbn", curRecord.getIsbn());
            map.put("id", curRecord.getId());
            BookWithUserMapper.deleteByMap(map);
        }
        return Result.success();
    }

    @GetMapping
    public Result<?> findPage(@RequestParam(defaultValue = "1") Integer pageNum,
                              @RequestParam(defaultValue = "10") Integer pageSize,
                              @RequestParam(defaultValue = "") String search1,
                              @RequestParam(defaultValue = "") String search2,
                              @RequestParam(defaultValue = "") String search3) {
        LambdaQueryWrapper<BookWithUser> wrappers = Wrappers.<BookWithUser>lambdaQuery();
        if (StringUtils.isNotBlank(search1)) {
            wrappers.like(BookWithUser::getIsbn, search1);
        }
        if (StringUtils.isNotBlank(search2)) {
            wrappers.like(BookWithUser::getBookName, search2);
        }
        if (StringUtils.isNotBlank(search3)) {
            wrappers.like(BookWithUser::getId, search3);
        }
        Page<BookWithUser> BookPage = BookWithUserMapper.selectPage(new Page<>(pageNum, pageSize), wrappers);
        return Result.success(BookPage);
    }
 
}

4.1.3 ダッシュボードコントローラー

Webサイトのアクセス数、利用者数、貸出実績、蔵書数を表示するモジュールです。具体的なコードは以下の通りです。

package com.example.demo.controller;


@RestController
@RequestMapping("/dashboard")
public class DashboardController {
    @Resource
    private UserMapper userMapper;
    @Resource
    private LendRecordMapper lendRecordMapper;
    @Resource
    private BookMapper bookMapper;
    @GetMapping
    public  Result<?> dashboardrecords(){
        int visitCount = LoginUser.getVisitCount();
        QueryWrapper<User> queryWrapper1=new QueryWrapper();
        int userCount = userMapper.selectCount(queryWrapper1);
        QueryWrapper<LendRecord> queryWrapper2=new QueryWrapper();
        int lendRecordCount = lendRecordMapper.selectCount(queryWrapper2);
        QueryWrapper<Book> queryWrapper3=new QueryWrapper();
        int bookCount = bookMapper.selectCount(queryWrapper3);
        Map<String, Object> map = new HashMap<>();//键值对形式
        map.put("visitCount", visitCount);//放置visitCount到map中
        map.put("userCount", userCount);
        map.put("lendRecordCount", lendRecordCount);
        map.put("bookCount", bookCount);
        return Result.success(map);
    }
}

4.1.4 LendRecordController

このモジュールは、書籍名に基づいた貸出記録の削除、1 つ以上の貸出記録の削除、貸出記録の保存、ページの検索、および貸出記録の変更に使用されます。

package com.example.demo.controller;


@RestController
@RequestMapping("/LendRecord")
public class LendRecordController {
    @Resource
    LendRecordMapper LendRecordMapper;

    @DeleteMapping("/{isbn}")
    public Result<?> delete(@PathVariable String isbn) {
        Map<String, Object> map = new HashMap<>();
        map.put("isbn", isbn);
        LendRecordMapper.deleteByMap(map);
        return Result.success();
    }

    //删除一条记录
    @PostMapping("/deleteRecord")
    public Result<?> deleteRecord(@RequestBody LendRecord LendRecord) {
        Map<String, Object> map = new HashMap<>();
        map.put("isbn", LendRecord.getIsbn());
        map.put("borrownum", LendRecord.getBorrownum());
        LendRecordMapper.deleteByMap(map);
        return Result.success();
    }

    @PostMapping("/deleteRecords")
    public Result<?> deleteRecords(@RequestBody List<LendRecord> LendRecords) {
        int len = LendRecords.size();
        for (int i = 0; i < len; i++) {
            LendRecord curRecord = LendRecords.get(i);
            Map<String, Object> map = new HashMap<>();
            map.put("isbn", curRecord.getIsbn());
            map.put("borrownum", curRecord.getBorrownum());
            LendRecordMapper.deleteByMap(map);
        }
        return Result.success();
    }

    @PostMapping
    public Result<?> save(@RequestBody LendRecord LendRecord) {
        LendRecordMapper.insert(LendRecord);
        return Result.success();
    }

    @GetMapping
    public Result<?> findPage(@RequestParam(defaultValue = "1") Integer pageNum,
                              @RequestParam(defaultValue = "10") Integer pageSize,
                              @RequestParam(defaultValue = "") String search1,
                              @RequestParam(defaultValue = "") String search2,
                              @RequestParam(defaultValue = "") String search3) {
        LambdaQueryWrapper<LendRecord> wrappers = Wrappers.<LendRecord>lambdaQuery();
        if (StringUtils.isNotBlank(search1)) {
            wrappers.like(LendRecord::getIsbn, search1);
        }
        if (StringUtils.isNotBlank(search2)) {
            wrappers.like(LendRecord::getBookname, search2);
        }
        if (StringUtils.isNotBlank(search3)) {
            wrappers.like(LendRecord::getReaderId, search3);
        }
        Page<LendRecord> LendRecordPage = LendRecordMapper.selectPage(new Page<>(pageNum, pageSize), wrappers);
        return Result.success(LendRecordPage);
    }

    @PutMapping("/{isbn}")
    public Result<?> update(@PathVariable String isbn, @RequestBody LendRecord lendRecord) {
        UpdateWrapper<LendRecord> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("isbn", isbn);
        LendRecord lendrecord = new LendRecord();
        lendrecord.setLendTime(lendRecord.getLendTime());
        lendrecord.setReturnTime(lendRecord.getReturnTime());
        lendrecord.setStatus(lendRecord.getStatus());
        LendRecordMapper.update(lendrecord, updateWrapper);
        return Result.success();
    }

    @PutMapping("/{lendTime}")
    public Result<?> update2(@PathVariable Date lendTime, @RequestBody LendRecord lendRecord) {
        UpdateWrapper<LendRecord> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("lendTime", lendTime);
        LendRecord lendrecord = new LendRecord();
        lendrecord.setReturnTime(lendRecord.getReturnTime());
        lendrecord.setStatus(lendRecord.getStatus());
        LendRecordMapper.update(lendrecord, updateWrapper);
        return Result.success();
    }

}

4.1.5 ユーザーコントローラー

このモジュールは、ユーザー登録、ユーザー ログイン、ユーザー情報の挿入、パスワードの変更、ユーザーIDパスワードの変更、一括削除に使用されます。 /a >、ニックネームで本のページを検索します。 ID

具体的な実装コードは以下のとおりです。

package com.example.demo.controller;

@RestController
@RequestMapping("/user")
public class UserController {
    @Resource
    UserMapper userMapper;

    @PostMapping("/register")
    public Result<?> register(@RequestBody User user) {
        User res = userMapper.selectOne(Wrappers.<User>lambdaQuery().eq(User::getUsername, user.getUsername()));
        if (res != null) {
            return Result.error("-1", "用户名已重复");
        }
        userMapper.insert(user);
        return Result.success();
    }

    @CrossOrigin
    @PostMapping("/login")
    public Result<?> login(@RequestBody User user) {
        User res = userMapper.selectOne(Wrappers.<User>lambdaQuery().eq(User::getUsername, user.getUsername()).eq(User::getPassword, user.getPassword()));
        if (res == null) {
            return Result.error("-1", "用户名或密码错误");
        }
        String token = TokenUtils.genToken(res);
        res.setToken(token);
        LoginUser loginuser = new LoginUser();
        loginuser.addVisitCount();
        return Result.success(res);
    }

    @PostMapping
    public Result<?> save(@RequestBody User user) {
        if (user.getPassword() == null) {
            user.setPassword("abc123456");
        }
        userMapper.insert(user);
        return Result.success();
    }

    @PutMapping("/password")
    public Result<?> update(@RequestParam Integer id,
                            @RequestParam String password2) {
        UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("id", id);
        User user = new User();
        user.setPassword(password2);
        userMapper.update(user, updateWrapper);
        return Result.success();
    }

    @PutMapping
    public Result<?> password(@RequestBody User user) {
        userMapper.updateById(user);
        return Result.success();
    }

    @PostMapping("/deleteBatch")
    public Result<?> deleteBatch(@RequestBody List<Integer> ids) {
        userMapper.deleteBatchIds(ids);
        return Result.success();
    }

    @DeleteMapping("/{id}")
    public Result<?> delete(@PathVariable Long id) {
        userMapper.deleteById(id);
        return Result.success();
    }

    @GetMapping
    public Result<?> findPage(@RequestParam(defaultValue = "1") Integer pageNum,
                              @RequestParam(defaultValue = "10") Integer pageSize,
                              @RequestParam(defaultValue = "") String search) {
        LambdaQueryWrapper<User> wrappers = Wrappers.<User>lambdaQuery();
        if (StringUtils.isNotBlank(search)) {
            wrappers.like(User::getNickName, search);
        }
        wrappers.like(User::getRole, 2);
        Page<User> userPage = userMapper.selectPage(new Page<>(pageNum, pageSize), wrappers);
        return Result.success(userPage);
    }

    @GetMapping("/usersearch")
    public Result<?> findPage2(@RequestParam(defaultValue = "1") Integer pageNum,
                               @RequestParam(defaultValue = "10") Integer pageSize,
                               @RequestParam(defaultValue = "") String search1,
                               @RequestParam(defaultValue = "") String search2,
                               @RequestParam(defaultValue = "") String search3,
                               @RequestParam(defaultValue = "") String search4) {
        LambdaQueryWrapper<User> wrappers = Wrappers.<User>lambdaQuery();
        if (StringUtils.isNotBlank(search1)) {
            wrappers.like(User::getId, search1);
        }
        if (StringUtils.isNotBlank(search2)) {
            wrappers.like(User::getNickName, search2);
        }
        if (StringUtils.isNotBlank(search3)) {
            wrappers.like(User::getPhone, search3);
        }
        if (StringUtils.isNotBlank(search4)) {
            wrappers.like(User::getAddress, search4);
        }
        wrappers.like(User::getRole, 2);
        Page<User> userPage = userMapper.selectPage(new Page<>(pageNum, pageSize), wrappers);
        return Result.success(userPage);
    }
}

5    开发日志

このチームの開発ログは以下の通りです。

202373日:

l IDEA開発ツールSpring Boot<を使用して作成/span> プロジェクトでは、プロジェクトの基本情報と依存関係を構成します。

l MySQL URL などのデータベース接続情報を構成します。 、ユーザー名とパスワード。

l データベース テーブル構造を設計します。

l データベース初期化スクリプトを作成し、データベース テーブルを作成し、初期データを挿入します。

202374日:

l 引入MyBatis-Plus依赖,配置MyBatis-Plus的相关信息。

l 書籍管理やユーザー管理などのモジュールのサービスインターフェイスと実装クラスを作成します。

l ブックの追加、削除、変更、クエリなど、ブック管理モジュールの追加、削除、変更、クエリ機能を実装します。

l ユーザー登録、ログイン、権利管理など、ユーザー管理モジュールの関連機能を完了します。

202375日:

l 貸出記録の追加、クエリ、返却の機能を含む図書貸出管理モジュールを開発します。

l ユーザー権限管理機能を実装し、ユーザーの役割に応じてさまざまな操作の権限を制限します。

l フロントエンド ページのレイアウトとスタイルを改善します。

202376日:

l キーワードに基づいて書籍情報をクエリする検索機能を追加します。

l システムの例外処理とエラー プロンプトを改善して、システムの堅牢性とユーザー エクスペリエンスを向上させます。

l システムのテストとデバッグを実行し、既存のバグと問題を修正します。

202377日:

l プロジェクトの概要と評価を実施し、開発プロセス中に得られた経験と教訓を要約します。

l プロジェクトのプレゼンテーションとプロジェクト防御のためのプレゼンテーション資料を準備します。

l プロジェクトの防御を実施し、システムの機能と設計のアイデアを実証し、関連する質問に答えます。

6    设计总结

この実習授業では、私たちのグループが書籍デジタル管理システムを設計し、開発に成功しました。このシステムの目標は、図書館管理者が本の貸出、返却、在庫を簡単に管理できるように、効率的で便利な図書館管理プラットフォームを提供することです。この実践的なトレーニングコースの設計と実装を通じて、私たちのチームは記帳、貸出、返却、照会の機能を実現し、システム設計は合理的で、機能は完全で、ユーザーインターフェイスはフレンドリーです。同時に、データベース設計、プログラミング技術、システム統合についての理解と実践も深まります。

この実践的なトレーニングクラスの経験では、私たちのグループのメンバーはいくつかの共通の洞察と得ることができました。

練習は学習の鍵です。 実践的なトレーニング クラスでは、教室で学んだ理論的知識を実際のプロジェクトに適用する実践的な機会が得られます。実践的な演習を通じて、私たちは多くの概念と原則を深く理解し、実際的な問題を解決する方法を学びます。

チームワークの重要性。 実習授業では、グループのメンバーがチームを組んで一緒にプロジェクトを完成させました。チームワークは非常に重要であり、分業と協力的なコミュニケーションを通じて、効率的にタスクを完了することができます。私たちは他の人と協力し、他の人の意見に耳を傾けて尊重し、プロジェクトの成功を一緒に追求する方法を学びました。

困難に直面しても忍耐力と忍耐力を持ちましょう。 トレーニングの過程で、技術的な問題や時間のプレッシャーなど、さまざまな課題に直面しました。しかし、私たちは忍耐強く忍耐強く、解決策を積極的に探し、努力し学び続けることを学びました。このことから、困難に直面したとき、障害を克服して進歩するためには忍耐力が鍵であることがわかります。

細部と品質に注意を払います。 実習授業では細部の大切さを実感しました。小さなエラーや省略により、システムが不安定になったり、機能が失われたりする可能性があります。その結果、システムの品質と信頼性を確保するために、細部に注意を払い、コードと設計を精査することを学びました。

継続的な学習と自己改善。 実践的なトレーニング クラスは学習の出発点にすぎません。進化し続ける技術分野において、学習は継続的なプロセスであることを私たちは認識しています。私たちは常に学ぶ姿勢を持ち、最新の技術やトレンドをキャッチアップし、常に自分の能力と知識レベルを向上させなければなりません。

計画と時間管理。 実践的なトレーニング クラスの開始前に、詳細なプロジェクト計画とスケジュールを作成しました。これにより、タスクと時間を合理的に割り当て、プロジェクトの進行の遅れを回避することができました。制限時間内にタスクを完了するために、時間を効果的に計画し、管理する方法を学びました。

コミュニケーションとコラボレーションのスキル。 チームワークは実践的なトレーニング セッションの重要な要素です。チームメンバーと緊密に連携して、問題について話し合い、課題を解決するための計画を共同で策定する必要があり、他者とのコミュニケーションとコラボレーションを通じて、コミュニケーションスキルとチームワークスキルを向上させます。私たちは他の人の視点に耳を傾け、異なる意見を尊重し、チーム内で積極的な役割を果たすことを学びました。

問題解決スキル。 トレーニング プロセス中に、多くの技術的および設計上の問題に遭遇しました。問題を個別に解決する必要がある場合もあれば、チームとして協力する必要がある場合もあります。私たちは問題を分析し、解決策を見つけ、それを解決するために適切な行動をとる方法を学び、問題解決のプロセスをより深く理解し、問題解決能力を向上させました。

学習と実践の組み合わせ。 実習授業では、理論と実践を組み合わせた学習環境を提供します。学んだ理論的な知識を実際のプロジェクトに適用することで、授業内容の理解を深め、実践的なスキルを習得します。応用スキルは次のとおりです。実践を通じて成長し、知識を実践的な能力に変えることができる学習方法です。

自己反省と継続的な改善。 実習授業中は、常に自分の成績や学習状況を振り返り、自分の強みと弱みを認識し、積極的に改善策を講じます。継続的な反省と改善を通じて、私たちは自分のスキルと能力を継続的に向上させることができます。

この実践的な研修を通じて、私たちのグループは実際のプロジェクト開発の経験を積むだけでなく、自己管理のチームワークと問題解決能力を養うことができました。これらの貴重な経験は、当社グループのメンバーの将来の学習とキャリア開発に長期的な影響を与えるものであり、私たちはこれらの経験を将来のプロジェクトや課題に適用し、自らの成長と改善を続けることを楽しみにしています。

コーディングは簡単ではありません。コードとオリジナルのドキュメントを無料で共有してください。VX についてプライベートにチャットすることに興味がある場合: liwoaa

おすすめ

転載: blog.csdn.net/Liwo4418/article/details/131713651