概要
都市化の進展に伴い、流浪動物の数は年々増加しており、社会管理と公共安全に厳しい課題をもたらしています。伝統的な流浪動物管理方式は手動記録と紙ベースのアーカイブに依存しており、効率が低くデータが失われやすく、現代の管理ニーズに対応できません。したがって、効率的でスマートな流浪動物管理システムの開発には、現実的な意義があります。本システムは、動物登録、救助、養子縁組などの機能を含む流浪動物情報のデジタル管理を実現し、管理効率を向上させ社会参加を促進することを目的としています。キーワード:流浪動物、管理システム、デジタル化、社会参加、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();
}
}
本システムは、流浪動物管理のための包括的なソリューションを提供し、効率的なデータ管理とスムーズなオペレーションを実現します。フロントエンドとバックエンドの分離設計により、システムの保守性と拡張性が向上しています。