システム概要
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();
}
}