概要
大学の学生数が増加するにつれて、寮の管理はます複雑な課題に直面しており、従来の人的管理方式では現代的な管理要件を満たすことができません。大学寮ゲート管理システムはこの問題を解決するために開発され、情報化手段を通じて管理効率とサービス品質を向上させることを目的としています。このシステムは、寮の出入管理、訪問者登録、機器監視などの機能をスマート化し、大学の后勤管理に便利なツールを提供します。
本システムは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();
}
}
システム機能
本システムは大学寮のゲート管理を効率化するための包括的なソリューションを提供します。主な機能には以下のものがあります:
- 学生情報の管理と認証
- ゲート機器のリアルタイム監視と制御
- 訪問者登録と管理
- 出入記録の追跡と分析
- 多レベルの権限管理
- 直感的なユーザーインターフェース
これらの機能を通じて、大学の后勤管理は大幅に効率化され、学生の安全性と利便性が向上します。