학교별 배포를 위해 서버주소/학교이름을 빌드타임 설정으로 전환

- config.dart의 baseUrl/webVapidKey와 학교 이름을 String.fromEnvironment로 전환
- 기본값은 기존 백산고 값 그대로라 인자 없이 빌드하면 지금과 동일하게 동작
- 다른 학교는 --dart-define=BASE_URL=...=SCHOOL_NAME=...=WEB_VAPID_KEY=...로 빌드
This commit is contained in:
2026-08-06 14:36:10 +09:00
parent 26d143d713
commit f9fa05f817
3 changed files with 24 additions and 8 deletions
+19 -4
View File
@@ -5,13 +5,28 @@ import 'package:device_info_plus/device_info_plus.dart';
import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/foundation.dart' show kIsWeb; import 'package:flutter/foundation.dart' show kIsWeb;
// 🌐 기존에 사용하시던 실제 백엔드 서버 도메인 주소로 통일합니다. // 🌐 학교마다 다른 값들. 빌드할 때 --dart-define으로 안 넘기면 지금 쓰는
const String baseUrl = 'https://backsanhi.mcv.kr'; // 백산고 값이 그대로 기본값이 된다 (기존 빌드 명령이 안 깨지게 하기 위함).
// 예: flutter build web --dart-define=BASE_URL=https://다른학교도메인.com
const String baseUrl = String.fromEnvironment(
'BASE_URL',
defaultValue: 'https://backsanhi.mcv.kr',
);
// 🔑 웹에서 FCM 토큰을 받으려면 필요한 VAPID 키 // 🔑 웹에서 FCM 토큰을 받으려면 필요한 VAPID 키
// (Firebase Console > 프로젝트 설정 > Cloud Messaging > 웹 구성 > 웹 푸시 인증서에서 발급) // (Firebase Console > 프로젝트 설정 > Cloud Messaging > 웹 구성 > 웹 푸시 인증서에서 발급)
const String webVapidKey = // 학교마다 Firebase 프로젝트가 다르므로 VAPID 키도 학교별로 --dart-define=WEB_VAPID_KEY=...로 지정.
'BG4LnirukBdW3cXVWxhvY9pcjevBKDhpsaq1SLZdBs2cOEiwLAFyuuZLkMqpEGp9uOuHdPOe_y3FdwdZaz3qdfk'; const String webVapidKey = String.fromEnvironment(
'WEB_VAPID_KEY',
defaultValue:
'BG4LnirukBdW3cXVWxhvY9pcjevBKDhpsaq1SLZdBs2cOEiwLAFyuuZLkMqpEGp9uOuHdPOe_y3FdwdZaz3qdfk',
);
// 🏫 앱/로그인 화면에 표시할 학교 이름. --dart-define=SCHOOL_NAME=...으로 학교별 지정.
const String schoolName = String.fromEnvironment(
'SCHOOL_NAME',
defaultValue: '백산고등학교',
);
// 권한 요청 및 FCM 토큰을 가져와서 콘솔에 출력하는 함수 // 권한 요청 및 FCM 토큰을 가져와서 콘솔에 출력하는 함수
Future<void> printFCMToken() async { Future<void> printFCMToken() async {
+1 -1
View File
@@ -26,7 +26,7 @@ class SchoolAttendanceApp extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return MaterialApp( return MaterialApp(
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
title: '백산고등학교 학생 도우미', title: '$schoolName 학생 도우미',
theme: ThemeData(primarySwatch: Colors.indigo, useMaterial3: true), theme: ThemeData(primarySwatch: Colors.indigo, useMaterial3: true),
home: const LoginScreen(), // 🚪 앱을 켜면 무조건 로그인 화면이 먼저 등장합니다. home: const LoginScreen(), // 🚪 앱을 켜면 무조건 로그인 화면이 먼저 등장합니다.
); );
+4 -3
View File
@@ -1,6 +1,7 @@
// 🔑 로그인 화면 (UI 전용). 입력폼/다이얼로그/화면 이동만 담당한다. // 🔑 로그인 화면 (UI 전용). 입력폼/다이얼로그/화면 이동만 담당한다.
// 인증 로직/서버 통신은 lib/function/login_controller.dart가 담당한다. // 인증 로직/서버 통신은 lib/function/login_controller.dart가 담당한다.
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../config.dart' show schoolName;
import '../function/login_controller.dart'; import '../function/login_controller.dart';
import 'student_dashboard.dart'; import 'student_dashboard.dart';
import 'teacher_dashboard.dart'; import 'teacher_dashboard.dart';
@@ -310,9 +311,9 @@ class _LoginScreenState extends State<LoginScreen> {
children: [ children: [
const Icon(Icons.school, size: 80, color: Colors.indigo), const Icon(Icons.school, size: 80, color: Colors.indigo),
const SizedBox(height: 16), const SizedBox(height: 16),
const Text( Text(
'백산고등학교 모니터', '$schoolName 모니터',
style: TextStyle( style: const TextStyle(
fontSize: 26, fontSize: 26,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
color: Colors.indigo, color: Colors.indigo,