大学寮ゲート管理システム:SpringBootバックエンドとVueフロントエンドによるソリューション

概要

大学の学生数が増加するにつれて、寮の管理はます複雑な課題に直面しており、従来の人的管理方式では現代的な管理要件を満たすことができません。大学寮ゲート管理システムはこの問題を解決するために開発され、情報化手段を通じて管理効率とサービス品質を向上させることを目的としています。このシステムは、寮の出入管理、訪問者登録、機器監視などの機能をスマート化し、大学の后勤管理に便利なツールを提供します。

本システムはSpringBootをバックエンドフレームワークとして採用し、Vueフロントエンド技術と組み合わせて、フロントエンドとバックエンドの分離された開発モデルを実装し、システムの保守性と拡張性を向上させています。データベースにはMySQLを採用し、データの効率的な保存とクエリを確保しています。システム機能には、学生情報管理、ゲート機器制御、訪問者登録、データ分析などのモジュールが含まれ、多ロール権限管理をサポートし、さまざまなユーザーのニーズに応えます。

データベーステーブル

学生情報テーブル

学生情報テーブルは、学生の基本情報と寮の出入記録を保存し、作成時間は関数によって自動的に取得されます。学生IDはこのテーブルの主キーであり、学生の身元を一意に識別するために使用されます。構造は表3-1のとおりです。

フィールド名 データ型 NULL可否 説明
student_id VARCHAR(20) 不可 学生ID(主キー)
student_name VARCHAR(50) 不可 学生名
gender CHAR(1) 不可 性別(M/F)
dorm_number VARCHAR(10) 不可 寮番号
faculty VARCHAR(50) 不可 所属学部
entry_time DATETIME 最終入室時間
exit_time DATETIME 最終退室時間
create_time TIMESTAMP 不可 記録作成時間
ゲート機器テーブル

ゲート機器テーブルは、ゲート機器の基本情報と稼働状態を記録し、機器IDはこのテーブルの主キーとして、各機器を一意に識別するために使用されます。構造は表3-2のとおりです。

フィールド名 データ型 NULL可否 説明
device_id VARCHAR(20) 不可 機器ID(主キー)
device_name VARCHAR(50) 不可 機器名
location VARCHAR(100) 不可 設置場所
status TINYINT 不可 稼働状態(0/1)
last_maintenance DATE 最終保守日
create_time TIMESTAMP 不可 記録作成時間
訪問者登録テーブル

訪問者登録テーブルは、訪問者の出入記録と訪問先の学生情報を保存し、登録IDはこのテーブルの主キーとして、各訪問記録を一意に識別するために使用されます。構造は表3-3のとおりです。

フィールド名 データ型 NULL可否 説明
record_id VARCHAR(20) 不可 登録ID(主キー)
visitor_name VARCHAR(50) 不可 訪問者名
visitor_phone VARCHAR(20) 不可 訪問者連絡先
student_id VARCHAR(20) 不可 訪問先学生ID
visit_purpose VARCHAR(200) 訪問目的
entry_time DATETIME 不可 入室時間
exit_time DATETIME 退室時間
create_time TIMESTAMP 不可 記録作成時間

技術アーキテクチャ

バックエンド技術: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.university;

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.university.dao"})
public class DormitoryGateApplication extends SpringBootServletInitializer {

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

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

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;

import com.university.utils.ValidatorUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.annotation.IgnoreAuth;

import com.university.entity.StudentEntity;
import com.university.entity.view.StudentView;

import com.university.service.StudentService;
import com.university.service.TokenService;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.MPUtil;
import com.utils.MapUtils;
import com.utils.CommonUtil;
import java.io.IOException;

/**
 * 学生管理
 * バックエンドAPI
 */
@RestController
@RequestMapping("/student")
public class StudentController {
    @Autowired
    private StudentService studentService;

    @Autowired
    private TokenService tokenService;

    /**
     * ログイン
     */
    @IgnoreAuth
    @RequestMapping(value = "/login")
    public R login(String username, String password, String captcha, HttpServletRequest request) {
        StudentEntity user = studentService.selectOne(new EntityWrapper<StudentEntity>().eq("student_account", username));
        if(user == null || !user.getPassword().equals(password)) {
            return R.error("アカウントまたはパスワードが正しくありません");
        }
        
        String token = tokenService.generateToken(user.getId(), username, "student", "学生");
        return R.ok().put("token", token);
    }

    /**
     * ユーザー登録
     */
    @IgnoreAuth
    @RequestMapping("/register")
    public R register(@RequestBody StudentEntity student){
        StudentEntity existingUser = studentService.selectOne(new EntityWrapper<StudentEntity>().eq("student_account", student.getStudentAccount()));
        if(existingUser != null) {
            return R.error("このアカウントは既に登録されています");
        }
        Long userId = new Date().getTime();
        student.setId(userId);
        studentService.insert(student);
        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");
        StudentEntity user = studentService.selectById(id);
        return R.ok().put("data", user);
    }
    
    /**
     * パスワードリセット
     */
    @IgnoreAuth
    @RequestMapping(value = "/resetPass")
    public R resetPass(String username, HttpServletRequest request){
        StudentEntity user = studentService.selectOne(new EntityWrapper<StudentEntity>().eq("student_account", username));
        if(user == null) {
            return R.error("アカウントが存在しません");
        }
        user.setPassword("123456");
        studentService.updateById(user);
        return R.ok("パスワードが123456にリセットされました");
    }

    /**
     * 管理者向けリスト
     */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params, StudentEntity student, HttpServletRequest request){
        EntityWrapper<StudentEntity> ew = new EntityWrapper<StudentEntity>();
        PageUtils page = studentService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, student), params), params));
        return R.ok().put("data", page);
    }
    
    /**
     * 学生向けリスト
     */
    @IgnoreAuth
    @RequestMapping("/list")
    public R list(@RequestParam Map<String, Object> params, StudentEntity student, HttpServletRequest request){
        EntityWrapper<StudentEntity> ew = new EntityWrapper<StudentEntity>();
        PageUtils page = studentService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, student), params), params));
        return R.ok().put("data", page);
    }

    /**
     * 詳細リスト
     */
    @RequestMapping("/lists")
    public R list(StudentEntity student){
        EntityWrapper<StudentEntity> ew = new EntityWrapper<StudentEntity>();
        ew.allEq(MPUtil.allEQMapPre(student, "student"));
        return R.ok().put("data", studentService.selectListView(ew));
    }

    /**
     * 検索
     */
    @RequestMapping("/query")
    public R query(StudentEntity student){
        EntityWrapper<StudentEntity> ew = new EntityWrapper<StudentEntity>();
        ew.allEq(MPUtil.allEQMapPre(student, "student"));
        StudentView studentView = studentService.selectView(ew);
        return R.ok("検索成功").put("data", studentView);
    }
    
    /**
     * 管理者向け詳細
     */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") Long id){
        StudentEntity student = studentService.selectById(id);
        return R.ok().put("data", student);
    }

    /**
     * 学生向け詳細
     */
    @IgnoreAuth
    @RequestMapping("/detail/{id}")
    public R detail(@PathVariable("id") Long id){
        StudentEntity student = studentService.selectById(id);
        return R.ok().put("data", student);
    }
    
    /**
     * 管理者向け保存
     */
    @RequestMapping("/save")
    public R save(@RequestBody StudentEntity student, HttpServletRequest request){
        if(studentService.selectCount(new EntityWrapper<StudentEntity>().eq("student_account", student.getStudentAccount())) > 0) {
            return R.error("アカウントは既に存在します");
        }
        student.setId(new Date().getTime());
        studentService.insert(student);
        return R.ok();
    }
    
    /**
     * 学生向け保存
     */
    @RequestMapping("/add")
    public R add(@RequestBody StudentEntity student, HttpServletRequest request){
        if(studentService.selectCount(new EntityWrapper<StudentEntity>().eq("student_account", student.getStudentAccount())) > 0) {
            return R.error("アカウントは既に存在します");
        }
        student.setId(new Date().getTime());
        studentService.insert(student);
        return R.ok();
    }

    /**
     * 更新
     */
    @RequestMapping("/update")
    @Transactional
    public R update(@RequestBody StudentEntity student, HttpServletRequest request){
        if(studentService.selectCount(new EntityWrapper<StudentEntity>().ne("id", student.getId()).eq("student_account", student.getStudentAccount())) > 0) {
            return R.error("アカウントは既に存在します");
        }
        studentService.updateById(student);
        return R.ok();
    }

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

システム機能

本システムは大学寮のゲート管理を効率化するための包括的なソリューションを提供します。主な機能には以下のものがあります:

  • 学生情報の管理と認証
  • ゲート機器のリアルタイム監視と制御
  • 訪問者登録と管理
  • 出入記録の追跡と分析
  • 多レベルの権限管理
  • 直感的なユーザーインターフェース

これらの機能を通じて、大学の后勤管理は大幅に効率化され、学生の安全性と利便性が向上します。

タグ: SpringBoot vue.js MySQL 寮管理 ゲートシステム

6月22日 18:27 投稿