Spring Bootによるフィットネス予約管理システムの実装

システム概要

Spring Bootベースのフィットネス予約管理システムでは、以下の3種類のロールを提供します:

  • 管理者: ユーザー管理、トレーナー管理、予約管理、コンテンツ管理、フィットネスプログラム管理、スライドショー管理
  • トレーナー: ログイン/登録、自身の稼働状況更新、予約情報閲覧
  • 利用者: ログイン/登録、予約操作、お気に入り登録、コメント投稿、各種情報閲覧

開発背景

フィットネス施設向けシステムは、会員がトレーニング計画を管理し、クラスを予約し、健康状態をモニタリングすることを支援する技術ベースのソリューションです。個別化されたフィットネス体験や健康データへの需要増加、技術進歩とデジタル化の潮流を背景に開発されました。

本システムにより、ユーザーは施設の営業時間やクラススケジュールを確認し、団体クラスやイベントへの参加が容易になります。また、スマートデバイスや健康追跡装置との連携により、トレーニング効果のモニタリングと計画調整を支援します。

技術スタック

  • バックエンド: Spring Boot, MyBatis
  • フロントエンド: Bootstrap, HTML/CSS, JavaScript, jQuery, Vue.js

Spring Bootフレームワーク

Spring Bootは定型設定を最小化し、開発者が素早くSpringアプリケーションを構築できるように設計されたフレームワークです。主要な開発フレームワークを統合し、迅速なプロジェクト立ち上げを実現します。

MySQLデータベース

MySQLはリレーショナルデータベース管理システムで、軽量かつ高速な動作特性を持ちます。コスト効率が良くオープンソースであるため、中小規模システムに適しています。

開発環境

  • Java: JDK 1.8
  • IDE: IntelliJ IDEA / Eclipse
  • データベース: MySQL 5.7/8.x
  • OS: Windows

実装例

設定ファイル

server:
  port: 8080
  servlet:
    context-path: /fitness-app

spring:
  datasource:
    driver: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/fitness_db?useSSL=false&serverTimezone=UTC
    username: app_user
    password: secure_pass
  servlet:
    multipart:
      max-file-size: 100MB
  resources:
    static-locations: classpath:/static/,file:/static/

mybatis:
  mapper-locations: classpath*:mappers/*.xml
  type-aliases-package: com.fitness.entity

ユーザー認証処理

@RestController
@RequestMapping("/api/users")
public class UserController {
  
  @Autowired
  private UserService userService;
  
  @Autowired
  private AuthTokenService tokenService;

  @PostMapping("/authenticate")
  public ResponseEntity<?> login(@RequestParam String username, 
                                 @RequestParam String password) {
    User user = userService.findByCredentials(username);
    if (user == null || !userService.validatePassword(user, password)) {
      return ResponseEntity.status(HttpStatus.UNAUTHORIZED)
             .body("認証情報が無効です");
    }
    
    String token = tokenService.generateAuthToken(user.getId(), "member");
    return ResponseEntity.ok(Map.of("accessToken", token));
  }

  @PostMapping("/register")
  public ResponseEntity<?> createUser(@RequestBody User newUser) {
    if (userService.existsByUsername(newUser.getUsername())) {
      return ResponseEntity.badRequest().body("ユーザー名が重複しています");
    }
    userService.save(newUser);
    return ResponseEntity.status(HttpStatus.CREATED).build();
  }

  @GetMapping("/current")
  public ResponseEntity<User> getCurrentUser(HttpServletRequest request) {
    Long userId = (Long) request.getAttribute("userId");
    return ResponseEntity.ok(userService.findById(userId));
  }
}

予約管理処理

@RestController
@RequestMapping("/api/bookings")
public class ReservationController {

  @Autowired
  private ReservationService reservationService;

  @PostMapping
  public ResponseEntity<Reservation> createBooking(@RequestBody ReservationRequest request) {
    Reservation booking = reservationService.createReservation(
      request.getUserId(), 
      request.getTrainerId(), 
      request.getSessionTime()
    );
    return ResponseEntity.status(HttpStatus.CREATED).body(booking);
  }

  @GetMapping("/user/{userId}")
  public ResponseEntity<List<Reservation>> getUserBookings(@PathVariable Long userId) {
    return ResponseEntity.ok(reservationService.findByUser(userId));
  }

  @PutMapping("/{id}/status")
  public ResponseEntity<Void> updateStatus(@PathVariable Long id, 
                                          @RequestParam String status) {
    reservationService.updateStatus(id, status);
    return ResponseEntity.noContent().build();
  }
}

タグ: Spring Boot MySQL MyBatis vue.js Bootstrap

7月14日 23:14 投稿