フロントエンドとバックエンドを分離した流浪動物管理システム|SpringBoot+Vue+MyBatis+MySQL完全なソースコードとデプロイメントチュートリアル

概要

都市化の進展に伴い、流浪動物の数は年々増加しており、社会管理と公共安全に厳しい課題をもたらしています。伝統的な流浪動物管理方式は手動記録と紙ベースのアーカイブに依存しており、効率が低くデータが失われやすく、現代の管理ニーズに対応できません。したがって、効率的でスマートな流浪動物管理システムの開発には、現実的な意義があります。本システムは、動物登録、救助、養子縁組などの機能を含む流浪動物情報のデジタル管理を実現し、管理効率を向上させ社会参加を促進することを目的としています。キーワード:流浪動物、管理システム、デジタル化、社会参加、SpringBoot、Vue。

本システムはフロントエンドとバックエンドを分離したアーキテクチャを採用し、フロントエンドはVue.jsフレームワークでユーザーインターフェースを構築し、バックエンドはSpringBootフレームワークでビジネスロジックを実装し、MyBatisを介してMySQLデータベースと連携します。システムの機能モジュールには、動物情報管理、救助記録、養子縁組申請、ユーザー権限管理などが含まれ、多ロール操作(管理者、ボランティア、一般ユーザー)をサポートします。技術スタックの選択により、システムの効率性、拡張性、保守性が確保されています。キーワード:フロントエンドとバックエンドの分離、SpringBoot、Vue.js、MyBatis、MySQL、権限管理。

データベーステーブル

動物情報テーブル

動物情報テーブルは、流浪動物の基本情報を保存するために使用され、品種、健康状態、救助時間などを含みます。作成時間はシステムによって自動的に生成され、主キーは動物IDであり、各レコードの一意性が保証されます。構造は表3-1のとおりです。

フィールド名 データ型 説明
pet_id INT 動物ID(主キー)
nickname VARCHAR(50) 動物の愛称
breed VARCHAR(20) 品種
health_condition VARCHAR(50) 健康状態
rescue_date DATETIME 救助日時
created_at DATETIME レコード作成時間(自動生成)
救助記録テーブル

救助記録テーブルは、流浪動物の救助過程を記録するために使用され、救助者、救助場所、救助詳細などを含みます。主キーは記録IDであり、動物IDに関連付けられて動物の救助履歴を追跡します。構造は表3-2のとおりです。

フィールド名 データ型 説明
rescue_record_id INT 救助記録ID(主キー)
pet_id INT 関連する動物ID
rescuer_name VARCHAR(50) 救助者名
rescue_place VARCHAR(100) 救助場所
rescue_description TEXT 救助詳細
created_at DATETIME レコード作成時間(自動生成)
養子縁組申請テーブル

養子縁組申請テーブルは、ユーザーが提出した養子縁組申請情報を保存し、申請者の連絡先、申請状態などを含みます。主キーは申請IDであり、動物IDに関連付けられて養子縁組の対象をマッチングします。構造は表3-3のとおりです。

フィールド名 データ型 説明
adoption_application_id INT 養子縁組申請ID(主キー)
pet_id INT 関連する動物ID
applicant_name VARCHAR(50) 申請者名
contact_details VARCHAR(50) 連絡先情報
application_status VARCHAR(20) 申請状態(審査待ち/承認済み)
created_at DATETIME レコード作成時間(自動生成)

システム紹介

本システムは、流浪動物のデジタル管理を効率化するために設計されています。動物情報の登録、救助記録の管理、養子縁組プロセスの追跡などを統一的なプラットフォームで提供します。多様なユーザーロール(管理者、ボランティア、一般ユーザー)に対応し、適切な権限管理を実現しています。

技術アーキテクチャ

バックエンド技術:Spring Boot

Spring Bootは、現代のJavaエンタープライズ開発の核となるフレームワークであり、「設定より規約」という設計哲学でアプリケーション開発モデルを再定義しています。主な特性:

  • ゼロコンフィギュレーション起動:自動設定メカニズムを統合し、XML設定ファイルの作成を大幅に削減
  • 埋め込みサーバー:Tomcat/Jetty/Undertowを内蔵し、スタンドアロンJARパッケージのデプロイをサポート
  • 本番環境対応:Actuatorモニタリングコンポーネントを統合し、ヘルスチェック、指標収集などのエンタープライズ機能を提供
  • マイクロサービスフレンドリー:分散アーキテクチャをネイティブにサポートし、Spring Cloudエコシステムとシームレスに統合

開発の利点: Starter依存関係体系とスマートな自動設定により、開発者はビジネスロジックの実装に完全に集中でき、基盤インフラの構築に時間を費やす必要がありません。単一の実行可能JARのデプロイ方式は、運用プロセスを大幅に簡素化します。

フロントエンド技術:Vue.js

Vue.jsは、漸進的フレームワーク設計と卓越した開発体験により、現代のフロントエンド開発の最適なソリューションとなっています。技術の特徴:

  • リアクティブデータフロー:依存関係トラッキングに基づくリアクティブシステムにより、効率的なビュー更新を実現
  • コンポーネントベースアーキテクチャ:シングルファイルコンポーネント(SFC)設計により、スタイル、ロジック、テンプレートの完全なカプセル化を実現
  • 柔軟な漸進的設計:シンプルなビューレイヤーライブラリから完全なSPAソリューションまで拡張可能
  • リッチなエコシステム:Vue Router、Vuex/Pinia、Vue CLIなどの公式ツールチェーンが完備

開発効率: 直感的なテンプレート構文と強力な指令システムにより、複雑なユーザーインタラクションを簡潔に明確にします。優れたTypeScriptサポートと開発者ツールが、大規模プロジェクトに信頼性の高い開発保証を提供します。

コアコード

package com.animalcare;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplication
@MapperScan(basePackages = {"com.animalcare.mapper"})
public class AnimalCareApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(AnimalCareApplication.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder applicationBuilder) {
        return applicationBuilder.sources(AnimalCareApplication.class);
    }
}
package com.animalcare.controller;

import com.animalcare.entity.UserEntity;
import com.animalcare.service.UserService;
import com.animalcare.service.TokenService;
import com.animalcare.utils.PageUtils;
import com.animalcare.utils.R;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.annotation.IgnoreAuth;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.*;

/**
 * ユーザーコントローラ
 * バックエンドインターフェース
 */
@RestController
@RequestMapping("/user")
public class UserController {
    
    @Autowired
    private UserService userService;
    
    @Autowired
    private TokenService tokenService;
    
    /**
     * ログイン
     */
    @IgnoreAuth
    @RequestMapping(value = "/login")
    public R login(String username, String password, HttpServletRequest request) {
        UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
        if(user == null || !user.getPassword().equals(password)) {
            return R.error("アカウントまたはパスワードが正しくありません");
        }
        
        String token = tokenService.generateToken(user.getId(), username, "user", "ユーザー");
        return R.ok().put("token", token);
    }

    /**
     * ユーザー登録
     */
    @IgnoreAuth
    @RequestMapping("/register")
    public R register(@RequestBody UserEntity user) {
        UserEntity existingUser = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername()));
        if(existingUser != null) {
            return R.error("登録済みユーザーです");
        }
        user.setId(System.currentTimeMillis());
        userService.insert(user);
        return R.ok();
    }

    /**
     * ログアウト
     */
    @RequestMapping("/logout")
    public R logout(HttpServletRequest request) {
        request.getSession().invalidate();
        return R.ok("ログアウト成功");
    }
    
    /**
     * 現在のユーザーセッション情報を取得
     */
    @RequestMapping("/session")
    public R getCurrUser(HttpServletRequest request) {
        Long id = (Long) request.getSession().getAttribute("userId");
        UserEntity user = userService.selectById(id);
        return R.ok().put("data", user);
    }
    
    /**
     * パスワードリセット
     */
    @IgnoreAuth
    @RequestMapping(value = "/resetPassword")
    public R resetPassword(String username, HttpServletRequest request) {
        UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
        if(user == null) {
            return R.error("アカウントが存在しません");
        }
        user.setPassword("123456");
        userService.updateById(user);
        return R.ok("パスワードがリセットされました:123456");
    }

    /**
     * 管理者向けユーザーリスト
     */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params, UserEntity user, HttpServletRequest request) {
        EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();
        PageUtils page = userService.queryPage(params, com.animalcare.utils.MPUtil.sort(
            com.animalcare.utils.MPUtil.between(
                com.animalcare.utils.MPUtil.likeOrEq(ew, user), params), params));
        return R.ok().put("data", page);
    }
    
    /**
     * 一般ユーザー向けリスト
     */
    @IgnoreAuth
    @RequestMapping("/list")
    public R list(@RequestParam Map<String, Object> params, UserEntity user, HttpServletRequest request) {
        EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();
        PageUtils page = userService.queryPage(params, com.animalcare.utils.MPUtil.sort(
            com.animalcare.utils.MPUtil.between(
                com.animalcare.utils.MPUtil.likeOrEq(ew, user), params), params));
        return R.ok().put("data", page);
    }

    /**
     * ユーザー詳細取得
     */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") Long id) {
        UserEntity user = userService.selectById(id);
        return R.ok().put("data", user);
    }

    /**
     * 一般ユーザー向け詳細
     */
    @IgnoreAuth
    @RequestMapping("/detail/{id}")
    public R detail(@PathVariable("id") Long id) {
        UserEntity user = userService.selectById(id);
        return R.ok().put("data", user);
    }
    
    /**
     * ユーザー保存(管理者向け)
     */
    @RequestMapping("/save")
    public R save(@RequestBody UserEntity user, HttpServletRequest request) {
        if(userService.selectCount(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) > 0) {
            return R.error("ユーザー名が既に存在します");
        }
        user.setId(System.currentTimeMillis());
        userService.insert(user);
        return R.ok();
    }
    
    /**
     * ユーザー追加(一般ユーザー向け)
     */
    @RequestMapping("/add")
    public R add(@RequestBody UserEntity user, HttpServletRequest request) {
        if(userService.selectCount(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) > 0) {
            return R.error("ユーザー名が既に存在します");
        }
        user.setId(System.currentTimeMillis());
        userService.insert(user);
        return R.ok();
    }

    /**
     * ユーザー情報更新
     */
    @RequestMapping("/update")
    @Transactional
    public R update(@RequestBody UserEntity user, HttpServletRequest request) {
        if(userService.selectCount(new EntityWrapper<UserEntity>()
            .ne("id", user.getId())
            .eq("username", user.getUsername())) > 0) {
            return R.error("ユーザー名が既に存在します");
        }
        userService.updateById(user);
        return R.ok();
    }

    /**
     * ユーザー削除
     */
    @RequestMapping("/delete")
    public R delete(@RequestBody Long[] ids) {
        userService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }
}

本システムは、流浪動物管理のための包括的なソリューションを提供し、効率的なデータ管理とスムーズなオペレーションを実現します。フロントエンドとバックエンドの分離設計により、システムの保守性と拡張性が向上しています。

タグ: 流浪動物管理システム、SpringBoot、Vue.js、MyBatis、MySQL、フロントエンドとバックエンドの分離

6月12日 16:15 投稿