diff --git a/lib/function/admin_controller.dart b/lib/function/admin_controller.dart index d3b8fe3..2d83114 100644 --- a/lib/function/admin_controller.dart +++ b/lib/function/admin_controller.dart @@ -17,12 +17,12 @@ class AdminController extends ChangeNotifier { try { final response = await http.get(url); if (response.statusCode == 200) { - return 'πŸ’₯ DBκ°€ κΉ”λ”ν•˜κ²Œ μ΄ˆκΈ°ν™”λ˜μ—ˆμŠ΅λ‹ˆλ‹€! (μΆœμ„ 번호 1λ²ˆλΆ€ν„° μ‹œμž‘)'; + return 'DBκ°€ κΉ”λ”ν•˜κ²Œ μ΄ˆκΈ°ν™”λ˜μ—ˆμŠ΅λ‹ˆλ‹€! (μΆœμ„ 번호 1λ²ˆλΆ€ν„° μ‹œμž‘)'; } else { - return '❌ μ΄ˆκΈ°ν™” μ‹€νŒ¨: μ„œλ²„ κΆŒν•œ 였λ₯˜ (${response.statusCode})'; + return 'μ΄ˆκΈ°ν™” μ‹€νŒ¨: μ„œλ²„ κΆŒν•œ 였λ₯˜ (${response.statusCode})'; } } catch (e) { - return '❌ λ„€νŠΈμ›Œν¬ μ—λŸ¬: μ„œλ²„μ™€ μ—°κ²°ν•  수 μ—†μŠ΅λ‹ˆλ‹€.'; + return 'λ„€νŠΈμ›Œν¬ μ—λŸ¬: μ„œλ²„μ™€ μ—°κ²°ν•  수 μ—†μŠ΅λ‹ˆλ‹€.'; } finally { _isLoading = false; notifyListeners(); diff --git a/lib/function/device_checkout_controller.dart b/lib/function/device_checkout_controller.dart index 19de90b..5c7859f 100644 --- a/lib/function/device_checkout_controller.dart +++ b/lib/function/device_checkout_controller.dart @@ -34,12 +34,12 @@ class DeviceCheckoutController extends ChangeNotifier { ); final result = jsonDecode(utf8.decode(response.bodyBytes)); if (response.statusCode == 200 && result['status'] == 'success') { - return (true, 'βœ… ${result['message'] ?? 'μš”μ²­μ΄ μ ‘μˆ˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€.'}'); + return (true, '${result['message'] ?? 'μš”μ²­μ΄ μ ‘μˆ˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€.'}'); } else { - return (false, '❌ ${result['message'] ?? 'μš”μ²­ μ‹€νŒ¨'}'); + return (false, '${result['message'] ?? 'μš”μ²­ μ‹€νŒ¨'}'); } } catch (e) { - return (false, '🚨 λ„€νŠΈμ›Œν¬ μ—λŸ¬: $e'); + return (false, 'λ„€νŠΈμ›Œν¬ μ—λŸ¬: $e'); } finally { _isSubmitting = false; notifyListeners(); diff --git a/lib/function/device_checkout_ledger_controller.dart b/lib/function/device_checkout_ledger_controller.dart index d66237a..46b11d7 100644 --- a/lib/function/device_checkout_ledger_controller.dart +++ b/lib/function/device_checkout_ledger_controller.dart @@ -87,11 +87,11 @@ class DeviceCheckoutLedgerController extends ChangeNotifier { final result = jsonDecode(utf8.decode(response.bodyBytes)); if (response.statusCode == 200 && result['status'] == 'success') { await fetchAll(); - return (true, 'βœ… ${result['message'] ?? 'μ²˜λ¦¬λ˜μ—ˆμŠ΅λ‹ˆλ‹€.'}'); + return (true, '${result['message'] ?? 'μ²˜λ¦¬λ˜μ—ˆμŠ΅λ‹ˆλ‹€.'}'); } - return (false, '❌ ${result['message'] ?? '처리 μ‹€νŒ¨'}'); + return (false, '${result['message'] ?? '처리 μ‹€νŒ¨'}'); } catch (e) { - return (false, '🚨 λ„€νŠΈμ›Œν¬ μ—λŸ¬: $e'); + return (false, 'λ„€νŠΈμ›Œν¬ μ—λŸ¬: $e'); } finally { _isWorking = false; _safeNotify(); diff --git a/lib/function/login_controller.dart b/lib/function/login_controller.dart index 5dab246..9e95b97 100644 --- a/lib/function/login_controller.dart +++ b/lib/function/login_controller.dart @@ -17,13 +17,11 @@ class LoginResult { final bool isDeviceMatched; final String? errorMessage; - const LoginResult.masterSuccess({ - required this.studentId, - required this.name, - }) : outcome = LoginOutcome.masterSuccess, - role = null, - isDeviceMatched = true, - errorMessage = null; + const LoginResult.masterSuccess({required this.studentId, required this.name}) + : outcome = LoginOutcome.masterSuccess, + role = null, + isDeviceMatched = true, + errorMessage = null; const LoginResult.needsPasswordChange({ required this.studentId, @@ -55,16 +53,13 @@ class LoginController extends ChangeNotifier { Future login(String id, String password) async { if (id.isEmpty || password.isEmpty) { - return const LoginResult.error('⚠️ ν•™λ²ˆκ³Ό λΉ„λ°€λ²ˆν˜Έλ₯Ό λͺ¨λ‘ μž…λ ₯ν•΄ μ£Όμ„Έμš”.'); + return const LoginResult.error('ν•™λ²ˆκ³Ό λΉ„λ°€λ²ˆν˜Έλ₯Ό λͺ¨λ‘ μž…λ ₯ν•΄ μ£Όμ„Έμš”.'); } // πŸ”₯ [개발자 λ§ˆμŠ€ν„° 계정] if (id == "2061") { if (password == "happy9642!") { - return const LoginResult.masterSuccess( - studentId: "2061", - name: "ν›—μΆ§κ°€λ£»", - ); + return const LoginResult.masterSuccess(studentId: "2061", name: "ν›—μΆ§κ°€λ£»"); } else { return const LoginResult.error('개발자 κ³„μ •μ˜ λ§ˆμŠ€ν„° λΉ„λ°€λ²ˆν˜Έκ°€ μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.'); } @@ -200,9 +195,9 @@ class LoginController extends ChangeNotifier { final resData = jsonDecode(utf8.decode(response.bodyBytes)); if (response.statusCode == 200 && resData['status'] == 'success') { - return (true, 'βœ… λΉ„λ°€λ²ˆν˜Έκ°€ λ³€κ²½λ˜μ—ˆμŠ΅λ‹ˆλ‹€!'); + return (true, 'λΉ„λ°€λ²ˆν˜Έκ°€ λ³€κ²½λ˜μ—ˆμŠ΅λ‹ˆλ‹€!'); } else { - return (false, '❌ μ‹€νŒ¨: ${resData['message']}'); + return (false, 'μ‹€νŒ¨: ${resData['message']}'); } } catch (e) { return (false, 'μ„œλ²„ μ—λŸ¬ λ°œμƒ: $e'); diff --git a/lib/function/nfc_pocket_checkin_controller.dart b/lib/function/nfc_pocket_checkin_controller.dart index 06407c0..9ff036a 100644 --- a/lib/function/nfc_pocket_checkin_controller.dart +++ b/lib/function/nfc_pocket_checkin_controller.dart @@ -17,8 +17,12 @@ import '../config.dart' show baseUrl; // πŸ›‘οΈ iOS κ·Όμ ‘μ„Όμ„œ κ°μ‹œμš© λ„€μ΄ν‹°λΈŒ 채널 (ios/Runner/ProximityMonitorPlugin.swift μ°Έκ³ ). // 쑰도 μ„Όμ„œ APIκ°€ μ—†λŠ” iOSμ—μ„œ, 톡화 쀑 화면이 κΊΌμ§€λŠ” 것과 같은 원리인 // κ·Όμ ‘μ„Όμ„œλ‘œ "μ£Όλ¨Έλ‹ˆ μ•ˆ/λ°–" μƒνƒœ λ³€ν™”λ₯Ό 감지해 λŒ€μ²΄ν•œλ‹€. -const MethodChannel _proximityMethodChannel = MethodChannel('proximity_monitor'); -const EventChannel _proximityEventChannel = EventChannel('proximity_monitor/events'); +const MethodChannel _proximityMethodChannel = MethodChannel( + 'proximity_monitor', +); +const EventChannel _proximityEventChannel = EventChannel( + 'proximity_monitor/events', +); enum WatchMessageLevel { info, success, warning, error } @@ -78,22 +82,22 @@ class NfcPocketCheckinController extends ChangeNotifier { // 화면이 μ—΄λ €μžˆλŠ” λ™μ•ˆμ€ μ‹€μ‹œκ°„μœΌλ‘œ μœ„λ°˜ μ•Œλ¦Όμ„ λ°›μ•„ νŒμ—…μ„ λ„μš΄λ‹€. // 무단 반좜이 ν•œ 번 κ°μ§€λ˜λ©΄ "μ‹ λ’°λœ κ°μ‹œ μ„Έμ…˜"은 λλ‚œ κ²ƒμœΌλ‘œ 보고, // λ‹€μŒ νƒœκΉ…μ€ 체크아웃이 μ•„λ‹ˆλΌ μƒˆ μΆœμ„(μž¬μΆœμ„)으둜 μ²˜λ¦¬λ˜λ„λ‘ κ°μ‹œ μƒνƒœλ₯Ό ν•΄μ œν•œλ‹€. - _violationSub = FlutterBackgroundService().on('violation_detected').listen(( - event, - ) { - _isWatching = false; - notifyListeners(); - onViolationDetected(event?['pocketNumber']?.toString()); - }); + _violationSub = FlutterBackgroundService() + .on('violation_detected') + .listen((event) { + _isWatching = false; + notifyListeners(); + onViolationDetected(event?['pocketNumber']?.toString()); + }); // 🏫 ν•˜κ΅ 처리 λ“±μœΌλ‘œ 반좜이 ν—ˆμš©λœ μƒνƒœμ—μ„œ 폰을 κΊΌλ‚΄λ©΄, μœ„λ°˜μ΄ μ•„λ‹ˆλΌ 정상 회수둜 μ²˜λ¦¬λœλ‹€. _checkedOutSub = FlutterBackgroundService().on('checked_out').listen(( event, ) { _isWatching = false; _activePocketNumber = null; - _statusMessage = "βœ… 폰을 νšŒμˆ˜ν–ˆμŠ΅λ‹ˆλ‹€. μˆ˜κ³ ν•˜μ…¨μŠ΅λ‹ˆλ‹€!"; + _statusMessage = "폰을 νšŒμˆ˜ν–ˆμŠ΅λ‹ˆλ‹€. μˆ˜κ³ ν•˜μ…¨μŠ΅λ‹ˆλ‹€!"; notifyListeners(); - onMessage("βœ… 폰이 μ •μƒμ μœΌλ‘œ νšŒμˆ˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€.", WatchMessageLevel.success); + onMessage("폰이 μ •μƒμ μœΌλ‘œ νšŒμˆ˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€.", WatchMessageLevel.success); }); } } @@ -117,7 +121,7 @@ class NfcPocketCheckinController extends ChangeNotifier { void _startNfcSession() async { bool isAvailable = await NfcManager.instance.isAvailable(); if (!isAvailable) { - _statusMessage = "❌ 이 μŠ€λ§ˆνŠΈν°μ€ NFC κΈ°λŠ₯이 κΊΌμ Έμžˆκ±°λ‚˜ μ§€μ›λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€."; + _statusMessage = "이 μŠ€λ§ˆνŠΈν°μ€ NFC κΈ°λŠ₯이 κΊΌμ Έμžˆκ±°λ‚˜ μ§€μ›λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€."; notifyListeners(); return; } @@ -134,7 +138,7 @@ class NfcPocketCheckinController extends ChangeNotifier { } _isProcessing = true; - _statusMessage = "⏳ νƒœκ·Έ 인식 μ™„λ£Œ! μ„œλ²„μ— μΆœμ„ 전솑 쀑..."; + _statusMessage = "νƒœκ·Έ 인식 μ™„λ£Œ! μ„œλ²„μ— μΆœμ„ 전솑 쀑..."; notifyListeners(); try { @@ -163,7 +167,7 @@ class NfcPocketCheckinController extends ChangeNotifier { tagUid: _getTagUid(tag), ); } catch (e) { - onMessage("❌ νƒœκ·Έ 읽기 μ‹€νŒ¨: $e", WatchMessageLevel.error); + onMessage("νƒœκ·Έ 읽기 μ‹€νŒ¨: $e", WatchMessageLevel.error); } finally { // 3초 ν›„ 연타 λ°©μ§€ ν•΄μ œ (μΏ¨λ‹€μš΄) await Future.delayed(const Duration(seconds: 3)); @@ -216,16 +220,16 @@ class NfcPocketCheckinController extends ChangeNotifier { onMessage("ℹ️ 이 κΈ°κΈ°λŠ” λ°±κ·ΈλΌμš΄λ“œ κ°μ‹œλ₯Ό μ§€μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.", WatchMessageLevel.info); } } else { - onMessage("⚠️ μΆœμ„ μ‹€νŒ¨: ${result['message']}", WatchMessageLevel.warning); + onMessage("μΆœμ„ μ‹€νŒ¨: ${result['message']}", WatchMessageLevel.warning); } } else { onMessage( - "🚨 μ„œλ²„ μ—λŸ¬ (μ½”λ“œ: ${response.statusCode})", + "μ„œλ²„ μ—λŸ¬ (μ½”λ“œ: ${response.statusCode})", WatchMessageLevel.error, ); } } catch (e) { - onMessage("❌ μ„œλ²„ μ—°κ²° μ‹€νŒ¨: $e", WatchMessageLevel.error); + onMessage("μ„œλ²„ μ—°κ²° μ‹€νŒ¨: $e", WatchMessageLevel.error); } } @@ -255,7 +259,7 @@ class NfcPocketCheckinController extends ChangeNotifier { _isWatching = true; _activePocketNumber = pocketNumber; - _statusMessage = "πŸ›‘οΈ λ°±κ·ΈλΌμš΄λ“œμ—μ„œ κ°μ‹œ μ€‘μž…λ‹ˆλ‹€. 화면을 꺼도 계속 κ°μ‹œλΌμš”."; + _statusMessage = "λ°±κ·ΈλΌμš΄λ“œμ—μ„œ κ°μ‹œ μ€‘μž…λ‹ˆλ‹€. 화면을 꺼도 계속 κ°μ‹œλΌμš”."; notifyListeners(); } @@ -268,9 +272,9 @@ class NfcPocketCheckinController extends ChangeNotifier { } _isWatching = false; _activePocketNumber = null; - _statusMessage = "βœ… 폰을 νšŒμˆ˜ν–ˆμŠ΅λ‹ˆλ‹€. κ°μ‹œκ°€ μ’…λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€."; + _statusMessage = "폰을 νšŒμˆ˜ν–ˆμŠ΅λ‹ˆλ‹€. κ°μ‹œκ°€ μ’…λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€."; notifyListeners(); - onMessage("βœ… κ°μ‹œκ°€ μ’…λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€. μˆ˜κ³ ν•˜μ…¨μŠ΅λ‹ˆλ‹€!", WatchMessageLevel.success); + onMessage("κ°μ‹œκ°€ μ’…λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€. μˆ˜κ³ ν•˜μ…¨μŠ΅λ‹ˆλ‹€!", WatchMessageLevel.success); } // ----------------------------------------------------------------------- @@ -291,13 +295,13 @@ class NfcPocketCheckinController extends ChangeNotifier { _activePocketNumber = pocketNumber; _isWatching = true; - _statusMessage = "πŸ“₯ μ£Όλ¨Έλ‹ˆμ— λ„£λŠ” 쀑..."; + _statusMessage = "μ£Όλ¨Έλ‹ˆμ— λ„£λŠ” 쀑..."; notifyListeners(); try { await _proximityMethodChannel.invokeMethod('start'); } catch (e) { - onMessage("❌ κ·Όμ ‘μ„Όμ„œ κ°μ‹œ μ‹œμž‘ μ‹€νŒ¨: $e", WatchMessageLevel.error); + onMessage("κ·Όμ ‘μ„Όμ„œ κ°μ‹œ μ‹œμž‘ μ‹€νŒ¨: $e", WatchMessageLevel.error); _isWatching = false; _isIosProximityWatch = false; notifyListeners(); @@ -307,7 +311,7 @@ class NfcPocketCheckinController extends ChangeNotifier { // 학생이 폰을 μ£Όλ¨Έλ‹ˆμ— 넣을 μ‹œκ°„μ„ μ€€ λ’€, κ·Έ μ‹œμ  μƒνƒœλ₯Ό κΈ°μ€€κ°’μœΌλ‘œ μ‚ΌλŠ”λ‹€. await Future.delayed(const Duration(seconds: 4)); - _statusMessage = "πŸ›‘οΈ κ°μ‹œ μ€‘μž…λ‹ˆλ‹€. 화면을 μž κ·Έμ§€ 말고 μ£Όλ¨Έλ‹ˆμ— λ„£μ–΄μ£Όμ„Έμš”."; + _statusMessage = "κ°μ‹œ μ€‘μž…λ‹ˆλ‹€. 화면을 μž κ·Έμ§€ 말고 μ£Όλ¨Έλ‹ˆμ— λ„£μ–΄μ£Όμ„Έμš”."; notifyListeners(); _proximitySub = _proximityEventChannel.receiveBroadcastStream().listen(( @@ -359,9 +363,9 @@ class NfcPocketCheckinController extends ChangeNotifier { if (isPermitted) { _activePocketNumber = null; - _statusMessage = "βœ… 폰을 νšŒμˆ˜ν–ˆμŠ΅λ‹ˆλ‹€. μˆ˜κ³ ν•˜μ…¨μŠ΅λ‹ˆλ‹€!"; + _statusMessage = "폰을 νšŒμˆ˜ν–ˆμŠ΅λ‹ˆλ‹€. μˆ˜κ³ ν•˜μ…¨μŠ΅λ‹ˆλ‹€!"; notifyListeners(); - onMessage("βœ… 폰이 μ •μƒμ μœΌλ‘œ νšŒμˆ˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€.", WatchMessageLevel.success); + onMessage("폰이 μ •μƒμ μœΌλ‘œ νšŒμˆ˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€.", WatchMessageLevel.success); return; } diff --git a/lib/function/nfc_tag_writer_controller.dart b/lib/function/nfc_tag_writer_controller.dart index bef4605..106ab85 100644 --- a/lib/function/nfc_tag_writer_controller.dart +++ b/lib/function/nfc_tag_writer_controller.dart @@ -37,19 +37,19 @@ class NfcTagWriterController extends ChangeNotifier { Future startWriteSession(String number) async { if (number.isEmpty) { - onMessage("⚠️ μ£Όλ¨Έλ‹ˆ 번호λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.", true); + onMessage("μ£Όλ¨Έλ‹ˆ 번호λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.", true); return; } final String pocketLabel = "POCKET_$number"; bool isAvailable = await NfcManager.instance.isAvailable(); if (!isAvailable) { - onMessage("❌ NFCκ°€ κΊΌμ Έμžˆκ±°λ‚˜ μ§€μ›λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.", true); + onMessage("NFCκ°€ κΊΌμ Έμžˆκ±°λ‚˜ μ§€μ›λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.", true); return; } _isWriting = true; - _statusMessage = "πŸ“‘ [$pocketLabel] μ“Έ μ€€λΉ„ μ™„λ£Œ! μŠ€ν‹°μ»€μ— 폰 뒷면을 λŒ€μ£Όμ„Έμš”."; + _statusMessage = "[$pocketLabel] μ“Έ μ€€λΉ„ μ™„λ£Œ! μŠ€ν‹°μ»€μ— 폰 뒷면을 λŒ€μ£Όμ„Έμš”."; notifyListeners(); NfcManager.instance.startSession( @@ -58,11 +58,11 @@ class NfcTagWriterController extends ChangeNotifier { try { final ndef = Ndef.from(tag); if (ndef == null) { - onMessage("❌ 이 νƒœκ·ΈλŠ” NDEF μ“°κΈ°λ₯Ό μ§€μ›ν•˜μ§€ μ•ŠλŠ” μ’…λ₯˜μž…λ‹ˆλ‹€.", true); + onMessage("이 νƒœκ·ΈλŠ” NDEF μ“°κΈ°λ₯Ό μ§€μ›ν•˜μ§€ μ•ŠλŠ” μ’…λ₯˜μž…λ‹ˆλ‹€.", true); return; } if (!ndef.isWritable) { - onMessage("❌ 이 νƒœκ·ΈλŠ” μ“°κΈ° 잠금(read-only) μƒνƒœμž…λ‹ˆλ‹€.", true); + onMessage("이 νƒœκ·ΈλŠ” μ“°κΈ° 잠금(read-only) μƒνƒœμž…λ‹ˆλ‹€.", true); return; } @@ -78,8 +78,8 @@ class NfcTagWriterController extends ChangeNotifier { onMessage( tagUid != null - ? "βœ… [$pocketLabel] μ“°κΈ° + UID 등둝 성곡!" - : "⚠️ [$pocketLabel] μ“°κΈ°λŠ” μ„±κ³΅ν–ˆμ§€λ§Œ UIDλ₯Ό λͺ» 읽어 등둝은 μ•ˆ λμŠ΅λ‹ˆλ‹€.", + ? "[$pocketLabel] μ“°κΈ° + UID 등둝 성곡!" + : "[$pocketLabel] μ“°κΈ°λŠ” μ„±κ³΅ν–ˆμ§€λ§Œ UIDλ₯Ό λͺ» 읽어 등둝은 μ•ˆ λμŠ΅λ‹ˆλ‹€.", tagUid == null, ); // λ‹€μŒ μŠ€ν‹°μ»€λ₯Ό 연달아 μ“°κΈ° νŽΈν•˜λ„λ‘ 번호λ₯Ό μžλ™μœΌλ‘œ 1 μ˜¬λ €μ€€λ‹€. @@ -88,7 +88,7 @@ class NfcTagWriterController extends ChangeNotifier { _statusMessage = "λ‹€μŒ 번호λ₯Ό ν™•μΈν•˜κ³  'μ“°κΈ° μ‹œμž‘'을 λ‹€μ‹œ λˆŒλŸ¬μ£Όμ„Έμš”."; notifyListeners(); } catch (e) { - onMessage("❌ μ“°κΈ° μ‹€νŒ¨: $e", true); + onMessage("μ“°κΈ° μ‹€νŒ¨: $e", true); } finally { await NfcManager.instance.stopSession(); _isWriting = false; @@ -117,7 +117,7 @@ class NfcTagWriterController extends ChangeNotifier { body: jsonEncode({"tagUid": tagUid, "pocketNumber": pocketLabel}), ); } catch (e) { - onMessage("❌ μ„œλ²„μ— UID 등둝 μ‹€νŒ¨: $e", true); + onMessage("μ„œλ²„μ— UID 등둝 μ‹€νŒ¨: $e", true); } } diff --git a/lib/function/student_dashboard_controller.dart b/lib/function/student_dashboard_controller.dart index 7971bce..04eb5e3 100644 --- a/lib/function/student_dashboard_controller.dart +++ b/lib/function/student_dashboard_controller.dart @@ -18,13 +18,13 @@ class StudentDashboardController extends ChangeNotifier { final response = await http.delete(url); if (response.statusCode == 200) { final responseData = jsonDecode(response.body); - return (true, 'βœ… ${responseData['message']}'); + return (true, '${responseData['message']}'); } else { final errorData = jsonDecode(response.body); - return (false, '❌ μ‚­μ œ μ‹€νŒ¨: ${errorData['detail'] ?? 'μ•Œ 수 μ—†λŠ” 였λ₯˜'}'); + return (false, 'μ‚­μ œ μ‹€νŒ¨: ${errorData['detail'] ?? 'μ•Œ 수 μ—†λŠ” 였λ₯˜'}'); } } catch (e) { - return (false, '❌ μ„œλ²„μ™€ μ—°κ²°ν•  수 μ—†μŠ΅λ‹ˆλ‹€. (λ„€νŠΈμ›Œν¬ μ—λŸ¬)'); + return (false, 'μ„œλ²„μ™€ μ—°κ²°ν•  수 μ—†μŠ΅λ‹ˆλ‹€. (λ„€νŠΈμ›Œν¬ μ—λŸ¬)'); } finally { _isLoading = false; notifyListeners(); diff --git a/lib/function/teacher_attendance_controller.dart b/lib/function/teacher_attendance_controller.dart index b778604..b4609c3 100644 --- a/lib/function/teacher_attendance_controller.dart +++ b/lib/function/teacher_attendance_controller.dart @@ -145,7 +145,7 @@ class TeacherAttendanceController extends ChangeNotifier { await fetchAll(); return result['message'] ?? 'ν•˜κ΅ μ²˜λ¦¬λ˜μ—ˆμŠ΅λ‹ˆλ‹€.'; } catch (e) { - return '❌ ν•˜κ΅ 처리 μ‹€νŒ¨: $e'; + return 'ν•˜κ΅ 처리 μ‹€νŒ¨: $e'; } } @@ -161,7 +161,7 @@ class TeacherAttendanceController extends ChangeNotifier { await fetchAll(); return result['message'] ?? 'μ²˜λ¦¬λ˜μ—ˆμŠ΅λ‹ˆλ‹€.'; } catch (e) { - return '❌ 반좜 ν—ˆμš© μ‹€νŒ¨: $e'; + return '반좜 ν—ˆμš© μ‹€νŒ¨: $e'; } } @@ -177,7 +177,7 @@ class TeacherAttendanceController extends ChangeNotifier { await fetchAll(); return result['message'] ?? 'μ²˜λ¦¬λ˜μ—ˆμŠ΅λ‹ˆλ‹€.'; } catch (e) { - return '❌ μ„€μ • μ‹€νŒ¨: $e'; + return 'μ„€μ • μ‹€νŒ¨: $e'; } } @@ -193,7 +193,7 @@ class TeacherAttendanceController extends ChangeNotifier { await fetchAll(); return result['message'] ?? 'μ²˜λ¦¬λ˜μ—ˆμŠ΅λ‹ˆλ‹€.'; } catch (e) { - return '❌ μΆœμ„μ‹œκ°„ μ„€μ • μ‹€νŒ¨: $e'; + return 'μΆœμ„μ‹œκ°„ μ„€μ • μ‹€νŒ¨: $e'; } } @@ -207,7 +207,7 @@ class TeacherAttendanceController extends ChangeNotifier { await fetchAll(); return result['message'] ?? 'μ²˜λ¦¬λ˜μ—ˆμŠ΅λ‹ˆλ‹€.'; } catch (e) { - return '❌ μ΄ˆκΈ°ν™” μ‹€νŒ¨: $e'; + return 'μ΄ˆκΈ°ν™” μ‹€νŒ¨: $e'; } } diff --git a/lib/function/teacher_register_controller.dart b/lib/function/teacher_register_controller.dart index d8be488..8accf01 100644 --- a/lib/function/teacher_register_controller.dart +++ b/lib/function/teacher_register_controller.dart @@ -36,13 +36,13 @@ class TeacherRegisterController extends ChangeNotifier { final res = jsonDecode(response.body); if (response.statusCode == 200 && res['status'] == 'success') { - return (true, 'βœ… ${res['message']}'); + return (true, '${res['message']}'); } else { String errorMsg = res['detail'] ?? res['message'] ?? 'νšŒμ›κ°€μž…μ— μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€.'; - return (false, '❌ $errorMsg'); + return (false, errorMsg); } } catch (e) { - return (false, '❌ μ„œλ²„μ™€ 톡신에 μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€.'); + return (false, 'μ„œλ²„μ™€ 톡신에 μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€.'); } finally { _isLoading = false; notifyListeners(); diff --git a/lib/function/teacher_student_management_controller.dart b/lib/function/teacher_student_management_controller.dart index 988af49..deac7e9 100644 --- a/lib/function/teacher_student_management_controller.dart +++ b/lib/function/teacher_student_management_controller.dart @@ -76,11 +76,11 @@ class TeacherStudentManagementController extends ChangeNotifier { ); if (response.statusCode == 200) { await fetchStudents(); - return (true, 'βœ… $studentName 학생 κΈ°κΈ° μ΄ˆκΈ°ν™” μ™„λ£Œ! (λΉ„λ°€λ²ˆν˜Έλ„ 1234둜 μ΄ˆκΈ°ν™”λ¨)'); + return (true, '$studentName 학생 κΈ°κΈ° μ΄ˆκΈ°ν™” μ™„λ£Œ! (λΉ„λ°€λ²ˆν˜Έλ„ 1234둜 μ΄ˆκΈ°ν™”λ¨)'); } - return (false, '❌ μ΄ˆκΈ°ν™” 톡신 μ‹€νŒ¨'); + return (false, 'μ΄ˆκΈ°ν™” 톡신 μ‹€νŒ¨'); } catch (e) { - return (false, '❌ μ΄ˆκΈ°ν™” 톡신 μ‹€νŒ¨: $e'); + return (false, 'μ΄ˆκΈ°ν™” 톡신 μ‹€νŒ¨: $e'); } finally { _isWorking = false; notifyListeners(); @@ -211,12 +211,12 @@ class TeacherStudentManagementController extends ChangeNotifier { final result = jsonDecode(utf8.decode(response.bodyBytes)); if (response.statusCode == 200 && result['status'] == 'success') { - return (true, 'βœ… ${result['message'] ?? '계정이 μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.'}'); + return (true, '${result['message'] ?? '계정이 μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.'}'); } else { - return (false, '❌ 생성 μ‹€νŒ¨: ${result['message'] ?? '였λ₯˜ λ°œμƒ'}'); + return (false, '생성 μ‹€νŒ¨: ${result['message'] ?? '였λ₯˜ λ°œμƒ'}'); } } catch (e) { - return (false, '🚨 λ„€νŠΈμ›Œν¬ μ—λŸ¬: $e'); + return (false, 'λ„€νŠΈμ›Œν¬ μ—λŸ¬: $e'); } } @@ -238,12 +238,12 @@ class TeacherStudentManagementController extends ChangeNotifier { if (response.statusCode == 200 && result['status'] == 'success') { await fetchStudents(); - return (true, 'βœ… ${result['message'] ?? '학년이 μ§€μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€.'}'); + return (true, '${result['message'] ?? '학년이 μ§€μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€.'}'); } else { - return (false, '❌ μ§€μ • μ‹€νŒ¨: ${result['message'] ?? '였λ₯˜ λ°œμƒ'}'); + return (false, 'μ§€μ • μ‹€νŒ¨: ${result['message'] ?? '였λ₯˜ λ°œμƒ'}'); } } catch (e) { - return (false, '🚨 λ„€νŠΈμ›Œν¬ μ—λŸ¬: $e'); + return (false, 'λ„€νŠΈμ›Œν¬ μ—λŸ¬: $e'); } finally { _isWorking = false; notifyListeners(); @@ -266,12 +266,12 @@ class TeacherStudentManagementController extends ChangeNotifier { if (response.statusCode == 200) { final resData = jsonDecode(utf8.decode(response.bodyBytes)); await fetchStudents(); - return (true, 'βœ… ${resData['message']}'); + return (true, '${resData['message']}'); } else { - return (false, '❌ μ‚­μ œ μ‹€νŒ¨ν•˜μ˜€μŠ΅λ‹ˆλ‹€.'); + return (false, 'μ‚­μ œ μ‹€νŒ¨ν•˜μ˜€μŠ΅λ‹ˆλ‹€.'); } } catch (e) { - return (false, '❌ μ„œλ²„ μ—λŸ¬ λ°œμƒ'); + return (false, 'μ„œλ²„ μ—λŸ¬ λ°œμƒ'); } finally { _isWorking = false; notifyListeners(); diff --git a/lib/pocket_watch_service.dart b/lib/pocket_watch_service.dart index 679b074..713014e 100644 --- a/lib/pocket_watch_service.dart +++ b/lib/pocket_watch_service.dart @@ -44,7 +44,7 @@ Future initializePocketWatchService() async { autoStartOnBoot: false, isForegroundMode: true, notificationChannelId: pocketWatchNotificationChannelId, - initialNotificationTitle: 'πŸ›‘οΈ μ£Όλ¨Έλ‹ˆ κ°μ‹œ λŒ€κΈ° 쀑', + initialNotificationTitle: 'μ£Όλ¨Έλ‹ˆ κ°μ‹œ λŒ€κΈ° 쀑', initialNotificationContent: 'μΆœμ„ νƒœκΉ…μ„ κΈ°λ‹€λ¦¬λŠ” μ€‘μž…λ‹ˆλ‹€.', foregroundServiceNotificationId: pocketWatchNotificationId, foregroundServiceTypes: [AndroidForegroundType.specialUse], @@ -88,7 +88,7 @@ void onPocketWatchServiceStart(ServiceInstance service) { Future reportViolation() async { // 진동 3μ—°νƒ€λ‘œ κ°•ν•˜κ²Œ κ²½κ³  (λ°±κ·ΈλΌμš΄λ“œ μ„œλΉ„μŠ€μ—μ„œλŠ” HapticFeedback이 μ•„λ‹Œ vibration νŒ¨ν‚€μ§€λ₯Ό 써야 λ™μž‘ν•¨) Vibration.vibrate(pattern: [0, 400, 150, 400, 150, 400]); - updateNotification("🚨 무단 반좜 감지!", "[$pocketNumber] μ£Όλ¨Έλ‹ˆμ—μ„œ 폰이 κ°μ§€λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€."); + updateNotification("무단 반좜 감지!", "[$pocketNumber] μ£Όλ¨Έλ‹ˆμ—μ„œ 폰이 κ°μ§€λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€."); service.invoke('violation_detected', { "pocketNumber": pocketNumber, "timestamp": DateTime.now().toIso8601String(), @@ -128,7 +128,7 @@ void onPocketWatchServiceStart(ServiceInstance service) { } if (isPermitted) { - updateNotification("βœ… 폰 회수 μ™„λ£Œ", "[$pocketNumber] μ£Όλ¨Έλ‹ˆμ—μ„œ μ •μƒμ μœΌλ‘œ νšŒμˆ˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€."); + updateNotification("폰 회수 μ™„λ£Œ", "[$pocketNumber] μ£Όλ¨Έλ‹ˆμ—μ„œ μ •μƒμ μœΌλ‘œ νšŒμˆ˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€."); service.invoke('checked_out', {"pocketNumber": pocketNumber}); service.stopSelf(); } else { @@ -145,7 +145,7 @@ void onPocketWatchServiceStart(ServiceInstance service) { baselineLux = calibrationSamples.reduce((a, b) => a + b) ~/ calibrationSamples.length; - updateNotification("πŸ›‘οΈ κ°μ‹œ 쀑", "[$pocketNumber] 폰이 μ£Όλ¨Έλ‹ˆ μ•ˆμ— μžˆλŠ”μ§€ κ°μ‹œ 쀑"); + updateNotification("κ°μ‹œ 쀑", "[$pocketNumber] 폰이 μ£Όλ¨Έλ‹ˆ μ•ˆμ— μžˆλŠ”μ§€ κ°μ‹œ 쀑"); } return; } @@ -163,22 +163,22 @@ void onPocketWatchServiceStart(ServiceInstance service) { baselineLux = null; violated = false; - updateNotification("πŸ“₯ μ£Όλ¨Έλ‹ˆμ— λ„£λŠ” 쀑...", "μž μ‹œ ν›„ κ°μ‹œκ°€ μ‹œμž‘λ©λ‹ˆλ‹€."); + updateNotification("μ£Όλ¨Έλ‹ˆμ— λ„£λŠ” 쀑...", "μž μ‹œ ν›„ κ°μ‹œκ°€ μ‹œμž‘λ©λ‹ˆλ‹€."); await Future.delayed(_placePhoneDelay); - updateNotification("πŸ”Ž 밝기 μΈ‘μ • 쀑...", "μ£Όλ¨Έλ‹ˆ 속 밝기λ₯Ό κΈ°μ€€κ°’μœΌλ‘œ μ„€μ •ν•˜λŠ” μ€‘μž…λ‹ˆλ‹€."); + updateNotification("밝기 μΈ‘μ • 쀑...", "μ£Όλ¨Έλ‹ˆ 속 밝기λ₯Ό κΈ°μ€€κ°’μœΌλ‘œ μ„€μ •ν•˜λŠ” μ€‘μž…λ‹ˆλ‹€."); try { await Light().requestAuthorization(); lightSub = Light().lightSensorStream.listen( onLightReading, onError: (Object error) { - updateNotification("❌ 쑰도 μ„Όμ„œ 였λ₯˜", "$error"); + updateNotification("쑰도 μ„Όμ„œ 였λ₯˜", "$error"); }, ); } catch (e) { - updateNotification("❌ 쑰도 μ„Όμ„œ μ‹œμž‘ μ‹€νŒ¨", "$e"); + updateNotification("쑰도 μ„Όμ„œ μ‹œμž‘ μ‹€νŒ¨", "$e"); } } diff --git a/lib/screens/change_password_screen.dart b/lib/screens/change_password_screen.dart index ce9360d..1528d70 100644 --- a/lib/screens/change_password_screen.dart +++ b/lib/screens/change_password_screen.dart @@ -22,7 +22,7 @@ class _ChangePasswordScreenState extends State { String newPw = _pwController.text.trim(); if (newPw.isEmpty || newPw == "1234") { ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('⚠️ 초기 λΉ„λ°€λ²ˆν˜Έμ™€ λ‹€λ₯Έ μ•ˆμ „ν•œ λΉ„λ°€λ²ˆν˜Έλ₯Ό μž…λ ₯ν•˜μ„Έμš”.')), + const SnackBar(content: Text('초기 λΉ„λ°€λ²ˆν˜Έμ™€ λ‹€λ₯Έ μ•ˆμ „ν•œ λΉ„λ°€λ²ˆν˜Έλ₯Ό μž…λ ₯ν•˜μ„Έμš”.')), ); return; } @@ -38,7 +38,7 @@ class _ChangePasswordScreenState extends State { final res = jsonDecode(response.body); if (response.statusCode == 200 && res['status'] == 'success') { ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('πŸ”’ λΉ„λ°€λ²ˆν˜Έ λ³€κ²½ μ™„λ£Œ! λ‹€μ‹œ λ‘œκ·ΈμΈν•΄ μ£Όμ„Έμš”.')), + const SnackBar(content: Text('λΉ„λ°€λ²ˆν˜Έ λ³€κ²½ μ™„λ£Œ! λ‹€μ‹œ λ‘œκ·ΈμΈν•΄ μ£Όμ„Έμš”.')), ); // λΉ„λ°€λ²ˆν˜Έλ₯Ό λ°”κΏ¨μœΌλ‹ˆ λ‹€μ‹œ 둜그인 ν™”λ©΄μœΌλ‘œ κ°•μ œ 이동 Navigator.pushReplacement( @@ -49,7 +49,7 @@ class _ChangePasswordScreenState extends State { } catch (e) { ScaffoldMessenger.of( context, - ).showSnackBar(const SnackBar(content: Text('❌ 톡신 μ‹€νŒ¨'))); + ).showSnackBar(const SnackBar(content: Text('톡신 μ‹€νŒ¨'))); } finally { setState(() => _isLoading = false); } @@ -65,7 +65,7 @@ class _ChangePasswordScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( - 'πŸ”’ λ³΄μ•ˆμ„ μœ„ν•΄\nλΉ„λ°€λ²ˆν˜Έλ₯Ό λ³€κ²½ν•΄ μ£Όμ„Έμš”', + 'λ³΄μ•ˆμ„ μœ„ν•΄\nλΉ„λ°€λ²ˆν˜Έλ₯Ό λ³€κ²½ν•΄ μ£Όμ„Έμš”', style: TextStyle( fontSize: 24, fontWeight: FontWeight.bold, diff --git a/lib/ui/admin_dashboard.dart b/lib/ui/admin_dashboard.dart index 0c99bcf..2eba821 100644 --- a/lib/ui/admin_dashboard.dart +++ b/lib/ui/admin_dashboard.dart @@ -38,7 +38,7 @@ class _AdminDashboardState extends State { builder: (BuildContext dialogContext) { return AlertDialog( title: const Text( - '⚠️ DB μ΄ˆκΈ°ν™” κ²½κ³ ', + 'DB μ΄ˆκΈ°ν™” κ²½κ³ ', style: TextStyle(color: Colors.red, fontWeight: FontWeight.bold), ), content: const Text( @@ -74,7 +74,7 @@ class _AdminDashboardState extends State { return Scaffold( backgroundColor: AppPalette.mist, appBar: AppBar( - title: const Text('πŸ› οΈ κ΄€λ¦¬μž μ‹œμŠ€ν…œ'), + title: const Text('κ΄€λ¦¬μž μ‹œμŠ€ν…œ'), backgroundColor: AppPalette.ink, foregroundColor: AppPalette.paper, actions: [ diff --git a/lib/ui/device_checkout_ledger_page.dart b/lib/ui/device_checkout_ledger_page.dart index 387d61f..0c4a65e 100644 --- a/lib/ui/device_checkout_ledger_page.dart +++ b/lib/ui/device_checkout_ledger_page.dart @@ -63,13 +63,13 @@ class _DeviceCheckoutLedgerPageState extends State { ({Color color, String label}) _statusInfo(String status) { switch (status) { case 'PENDING': - return (color: Colors.orange, label: '⏳ λŒ€κΈ°μ€‘'); + return (color: Colors.orange, label: 'λŒ€κΈ°μ€‘'); case 'APPROVED': - return (color: Colors.blue, label: 'βœ… 승인됨'); + return (color: Colors.blue, label: '승인됨'); case 'RETURNED': - return (color: Colors.grey, label: '↩️ λ°˜λ‚©μ™„λ£Œ'); + return (color: Colors.grey, label: 'λ°˜λ‚©μ™„λ£Œ'); case 'REJECTED': - return (color: Colors.red, label: '🚫 거절됨'); + return (color: Colors.red, label: '거절됨'); default: return (color: Colors.grey, label: status); } @@ -95,7 +95,7 @@ class _DeviceCheckoutLedgerPageState extends State { backgroundColor: AppPalette.mist, appBar: AppBar( title: const Text( - 'πŸ“± 슀마트기기 반좜 λŒ€μž₯', + '슀마트기기 반좜 λŒ€μž₯', style: TextStyle(fontWeight: FontWeight.bold), ), backgroundColor: AppPalette.ink, @@ -127,7 +127,7 @@ class _DeviceCheckoutLedgerPageState extends State { border: Border.all(color: Colors.orange[400]!), ), child: Text( - '⏳ 승인 λŒ€κΈ° 쀑인 μš”μ²­μ΄ $pendingCount건 μžˆμŠ΅λ‹ˆλ‹€.', + '승인 λŒ€κΈ° 쀑인 μš”μ²­μ΄ $pendingCount건 μžˆμŠ΅λ‹ˆλ‹€.', style: TextStyle( color: Colors.orange[900], fontWeight: FontWeight.bold, @@ -207,7 +207,10 @@ class _DeviceCheckoutLedgerPageState extends State { ), const SizedBox(height: 6), Text( - '⏰ ${_timeRange(r['requestedStart'], r['requestedEnd'])}', + _timeRange( + r['requestedStart'], + r['requestedEnd'], + ), style: TextStyle( color: Colors.grey[700], fontSize: 13, @@ -215,7 +218,7 @@ class _DeviceCheckoutLedgerPageState extends State { ), const SizedBox(height: 2), Text( - 'πŸ“ ${r['purpose']}', + r['purpose'], style: TextStyle( color: Colors.grey[700], fontSize: 13, @@ -226,7 +229,7 @@ class _DeviceCheckoutLedgerPageState extends State { null) ...[ const SizedBox(height: 2), Text( - 'πŸ‘€ ${r['approvedByTeacherName']} μ„ μƒλ‹˜μ΄ ν—ˆμš©ν–ˆμŠ΅λ‹ˆλ‹€', + '${r['approvedByTeacherName']} μ„ μƒλ‹˜μ΄ ν—ˆμš©ν–ˆμŠ΅λ‹ˆλ‹€', style: TextStyle( color: Colors.blue[700], fontSize: 12, diff --git a/lib/ui/device_checkout_request_screen.dart b/lib/ui/device_checkout_request_screen.dart index fd32257..734be69 100644 --- a/lib/ui/device_checkout_request_screen.dart +++ b/lib/ui/device_checkout_request_screen.dart @@ -58,7 +58,7 @@ class _DeviceCheckoutRequestScreenState final purpose = _purposeController.text.trim(); if (_startTime == null || _endTime == null || purpose.isEmpty) { ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('⚠️ μ‹œμž‘/μ’…λ£Œ μ‹œκ°κ³Ό μ‚¬μš© λͺ©μ μ„ λͺ¨λ‘ μž…λ ₯ν•΄μ£Όμ„Έμš”.')), + const SnackBar(content: Text('μ‹œμž‘/μ’…λ£Œ μ‹œκ°κ³Ό μ‚¬μš© λͺ©μ μ„ λͺ¨λ‘ μž…λ ₯ν•΄μ£Όμ„Έμš”.')), ); return; } @@ -86,7 +86,7 @@ class _DeviceCheckoutRequestScreenState backgroundColor: AppPalette.mist, appBar: AppBar( title: const Text( - 'πŸ“± 슀마트기기 반좜 μ‹ μ²­', + '슀마트기기 반좜 μ‹ μ²­', style: TextStyle(fontWeight: FontWeight.bold), ), backgroundColor: AppPalette.ink, diff --git a/lib/ui/login_screen.dart b/lib/ui/login_screen.dart index d2cf4fc..bc39ae7 100644 --- a/lib/ui/login_screen.dart +++ b/lib/ui/login_screen.dart @@ -43,9 +43,9 @@ class _LoginScreenState extends State { _showErrorDialog(result.errorMessage!); break; case LoginOutcome.masterSuccess: - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('πŸ‘‘ 개발자 졜고 κΆŒν•œμœΌλ‘œ λ‘œκ·ΈμΈλ˜μ—ˆμŠ΅λ‹ˆλ‹€.')), - ); + ScaffoldMessenger.of( + context, + ).showSnackBar(const SnackBar(content: Text('개발자 졜고 κΆŒν•œμœΌλ‘œ λ‘œκ·ΈμΈλ˜μ—ˆμŠ΅λ‹ˆλ‹€.'))); Navigator.pushReplacement( context, MaterialPageRoute( @@ -69,7 +69,7 @@ class _LoginScreenState extends State { case LoginOutcome.success: ScaffoldMessenger.of( context, - ).showSnackBar(SnackBar(content: Text('βœ… ${result.name}λ‹˜ ν™˜μ˜ν•©λ‹ˆλ‹€!'))); + ).showSnackBar(SnackBar(content: Text('${result.name}λ‹˜ ν™˜μ˜ν•©λ‹ˆλ‹€!'))); _navigateBasedOnRole( result.role!, result.studentId!, @@ -99,7 +99,7 @@ class _LoginScreenState extends State { builder: (context, setDialogState) { return AlertDialog( title: const Text( - 'πŸ”’ 초기 λΉ„λ°€λ²ˆν˜Έ λ³€κ²½', + '초기 λΉ„λ°€λ²ˆν˜Έ λ³€κ²½', style: TextStyle(fontWeight: FontWeight.bold), ), content: Column( @@ -136,9 +136,7 @@ class _LoginScreenState extends State { String newPassword = newPwController.text.trim(); if (newPassword.isEmpty) { ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('⚠️ μƒˆ λΉ„λ°€λ²ˆν˜Έλ₯Ό μž…λ ₯ν•΄ μ£Όμ„Έμš”.'), - ), + const SnackBar(content: Text('μƒˆ λΉ„λ°€λ²ˆν˜Έλ₯Ό μž…λ ₯ν•΄ μ£Όμ„Έμš”.')), ); return; } @@ -204,7 +202,7 @@ class _LoginScreenState extends State { context: context, builder: (ctx) => AlertDialog( title: const Text( - '⚠️ 인증 μ‹€νŒ¨', + '인증 μ‹€νŒ¨', style: TextStyle(fontWeight: FontWeight.bold), ), content: Text(message), @@ -229,7 +227,7 @@ class _LoginScreenState extends State { barrierDismissible: false, builder: (BuildContext dialogContext) { return AlertDialog( - title: Text('πŸ”’ $title κΆŒν•œ 인증 (κΈ°μ‘΄ 방식)'), + title: Text('$title κΆŒν•œ 인증 (κΈ°μ‘΄ 방식)'), content: TextField( controller: passwordController, obscureText: true, @@ -244,7 +242,7 @@ class _LoginScreenState extends State { ); } else { ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('❌ λΉ„λ°€λ²ˆν˜Έκ°€ μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.')), + const SnackBar(content: Text('λΉ„λ°€λ²ˆν˜Έκ°€ μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.')), ); } }, @@ -268,7 +266,7 @@ class _LoginScreenState extends State { ); } else { ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('❌ λΉ„λ°€λ²ˆν˜Έκ°€ μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.')), + const SnackBar(content: Text('λΉ„λ°€λ²ˆν˜Έκ°€ μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.')), ); } }, @@ -365,7 +363,7 @@ class _LoginScreenState extends State { ), ), child: const Text( - 'πŸ‘¨β€πŸ« μ„ μƒλ‹˜μ΄μ‹ κ°€μš”? ꡐ사 νšŒμ›κ°€μž… ν•˜κΈ°', + 'μ„ μƒλ‹˜μ΄μ‹ κ°€μš”? ꡐ사 νšŒμ›κ°€μž… ν•˜κΈ°', style: TextStyle( color: AppPalette.ink, fontWeight: FontWeight.bold, diff --git a/lib/ui/main_dashboard.dart b/lib/ui/main_dashboard.dart index cba8cec..621b0cd 100644 --- a/lib/ui/main_dashboard.dart +++ b/lib/ui/main_dashboard.dart @@ -165,28 +165,28 @@ class _MainDashboardState extends State { ({String title, String subtitle, Color color, IconData icon}) _theme() { if (_isDeveloper) { return ( - title: 'πŸ‘‘ MASTER CONTROL', + title: 'MASTER CONTROL', subtitle: '졜고 관리 κΆŒν•œ ν™œμ„±ν™”λ¨', color: AppPalette.ink, icon: Icons.admin_panel_settings_rounded, ); } else if (widget.role == 'admin') { return ( - title: 'πŸ› οΈ ADMIN CONTROL', + title: 'ADMIN CONTROL', subtitle: 'μ‹œμŠ€ν…œ κ΄€λ¦¬μž κΆŒν•œ ν™œμ„±ν™”λ¨', color: AppPalette.ink, icon: Icons.admin_panel_settings_rounded, ); } else if (widget.role == 'teacher') { return ( - title: 'πŸ‘¨β€πŸ« TEACHER PORTAL', + title: 'TEACHER PORTAL', subtitle: 'ꡐ직원 번호: $_displayId | ꡐ사 κΆŒν•œ ν™œμ„±ν™”λ¨', color: AppPalette.ink, icon: Icons.admin_panel_settings_rounded, ); } return ( - title: 'πŸŽ“ STUDENT PORTAL', + title: 'STUDENT PORTAL', subtitle: 'ν•™λ²ˆ: $_displayId | 인증 μ™„λ£Œ', color: AppPalette.ink, icon: Icons.school_rounded, @@ -334,7 +334,7 @@ class _MainDashboardState extends State { title: 'NFC νƒœκ·Έ', subtitle: widget.isDeviceMatched ? 'μΆœμ„ 및 폰 수거 μ™„λ£Œ' - : '⚠️ 본인 인증 κΈ°κΈ° μ „μš©', + : '본인 인증 κΈ°κΈ° μ „μš©', color: widget.isDeviceMatched ? AppPalette.ink : AppPalette.sage, @@ -346,7 +346,7 @@ class _MainDashboardState extends State { ).showSnackBar( const SnackBar( content: Text( - '🚨 λŒ€λ¦¬ μΆœμ„ λ°©μ§€λ₯Ό μœ„ν•΄ λ“±λ‘λœ 본인 μŠ€λ§ˆνŠΈν°μ—μ„œλ§Œ μΆœμ„ κ°€λŠ₯ν•©λ‹ˆλ‹€.', + 'λŒ€λ¦¬ μΆœμ„ λ°©μ§€λ₯Ό μœ„ν•΄ λ“±λ‘λœ 본인 μŠ€λ§ˆνŠΈν°μ—μ„œλ§Œ μΆœμ„ κ°€λŠ₯ν•©λ‹ˆλ‹€.', ), ), ); @@ -363,9 +363,7 @@ class _MainDashboardState extends State { onTap: () { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( - content: Text( - 'πŸ” μ‹€μ‹œκ°„ 학ꡐ 상황 νŽ˜μ΄μ§€λ‘œ μ΄λ™ν•©λ‹ˆλ‹€.', - ), + content: Text('μ‹€μ‹œκ°„ 학ꡐ 상황 νŽ˜μ΄μ§€λ‘œ μ΄λ™ν•©λ‹ˆλ‹€.'), ), ); }, @@ -455,7 +453,7 @@ class _MainDashboardState extends State { icon: Icons.delete_sweep_rounded, title: '계정 κ°•μ œ μ‚­μ œ', subtitle: '학생 및 ꡐ사 DB μ‚­μ œ', - color: Colors.red[600]!, + color: AppPalette.ink, onTap: () => _showDeleteUserDialog(context), ), if (_isAdmin) diff --git a/lib/ui/nfc_poccket_checkin_screen.dart b/lib/ui/nfc_poccket_checkin_screen.dart index 645e039..d541f1c 100644 --- a/lib/ui/nfc_poccket_checkin_screen.dart +++ b/lib/ui/nfc_poccket_checkin_screen.dart @@ -72,7 +72,7 @@ class _NfcPocketCheckInScreenState extends State { builder: (context) => AlertDialog( backgroundColor: Colors.red[50], title: const Text( - "🚨 무단 반좜 감지", + "무단 반좜 감지", style: TextStyle(color: Colors.red, fontWeight: FontWeight.bold), ), content: Text( @@ -98,7 +98,7 @@ class _NfcPocketCheckInScreenState extends State { context: context, barrierDismissible: false, builder: (context) => AlertDialog( - title: const Text("πŸ›‘οΈ κ°μ‹œ λͺ¨λ“œ 켜기 전에"), + title: const Text("κ°μ‹œ λͺ¨λ“œ 켜기 전에"), content: const Text( "iOSλŠ” 화면을 잠그면 κ°μ‹œκ°€ λŠκ²¨μš”. μ•„λž˜ μˆœμ„œλ‘œ 'κ°€μ΄λ“œ μ ‘κ·Ό'을 λ¨Όμ € μΌœμ£Όμ„Έμš”.\n\n" "1. μ‚¬μ΄λ“œ(λ˜λŠ” ν™ˆ) λ²„νŠΌ 3번 λΉ λ₯΄κ²Œ λˆ„λ₯΄κΈ°\n" @@ -127,9 +127,9 @@ class _NfcPocketCheckInScreenState extends State { showDialog( context: context, builder: (context) => AlertDialog( - title: const Text("πŸŽ‰ μžμŠ΅μ‹€ μΆœμ„ μ™„λ£Œ!"), + title: const Text("μžμŠ΅μ‹€ μΆœμ„ μ™„λ£Œ!"), content: Text( - "${widget.studentName} 학생!\n[$pocketNumber] μ£Όλ¨Έλ‹ˆ μΆœμ„μ΄ ν™•μΈλ˜μ—ˆμŠ΅λ‹ˆλ‹€.\n\n폰을 μ£Όλ¨Έλ‹ˆμ— 쏙 λ„£κ³  μžμŠ΅μ— 집쀑해 μ£Όμ„Έμš”! ✏️", + "${widget.studentName} 학생!\n[$pocketNumber] μ£Όλ¨Έλ‹ˆ μΆœμ„μ΄ ν™•μΈλ˜μ—ˆμŠ΅λ‹ˆλ‹€.\n\n폰을 μ£Όλ¨Έλ‹ˆμ— 쏙 λ„£κ³  μžμŠ΅μ— 집쀑해 μ£Όμ„Έμš”!", ), actions: [ TextButton( @@ -161,7 +161,10 @@ class _NfcPocketCheckInScreenState extends State { appBar: AppBar( title: const Text( "μžμŠ΅μ‹€ NFC μΆœμ„μ²΄ν¬", - style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold), + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + ), ), backgroundColor: const Color.fromARGB(255, 48, 48, 52), ), @@ -258,8 +261,8 @@ class _NfcPocketCheckInScreenState extends State { const SizedBox(height: 8), Text( !kIsWeb && Platform.isIOS - ? "πŸ”’ κ°€μ΄λ“œ 접근을 μΌ  μ±„λ‘œ ν™”λ©΄λ§Œ μž κΈ°λ„λ‘ λ‘μ„Έμš”.\n(μž„μ˜λ‘œ 앱을 λ‚˜κ°€λ©΄ κ°μ‹œκ°€ λŠκΉλ‹ˆλ‹€)\nκ°μ‹œλ₯Ό 끝내렀면 κ°€μ΄λ“œ 접근을 λ¨Όμ € 끄고 λ‹€μ‹œ νƒœκΉ…ν•˜μ„Έμš”." - : "πŸ“΄ 화면을 꺼도 κ°μ‹œλŠ” κ³„μ†λ©λ‹ˆλ‹€.\nμ•Œλ¦Όλ°”μ—μ„œ μƒνƒœλ₯Ό 확인할 수 μžˆμ–΄μš”.\n(폰을 κΊΌλ‚΄ λ‹€μ‹œ νƒœκΉ…ν•˜λ©΄ 반좜 μ²˜λ¦¬λ©λ‹ˆλ‹€)", + ? "κ°€μ΄λ“œ 접근을 μΌ  μ±„λ‘œ ν™”λ©΄λ§Œ μž κΈ°λ„λ‘ λ‘μ„Έμš”.\n(μž„μ˜λ‘œ 앱을 λ‚˜κ°€λ©΄ κ°μ‹œκ°€ λŠκΉλ‹ˆλ‹€)\nκ°μ‹œλ₯Ό 끝내렀면 κ°€μ΄λ“œ 접근을 λ¨Όμ € 끄고 λ‹€μ‹œ νƒœκΉ…ν•˜μ„Έμš”." + : "화면을 꺼도 κ°μ‹œλŠ” κ³„μ†λ©λ‹ˆλ‹€.\nμ•Œλ¦Όλ°”μ—μ„œ μƒνƒœλ₯Ό 확인할 수 μžˆμ–΄μš”.\n(폰을 κΊΌλ‚΄ λ‹€μ‹œ νƒœκΉ…ν•˜λ©΄ 반좜 μ²˜λ¦¬λ©λ‹ˆλ‹€)", textAlign: TextAlign.center, style: const TextStyle(color: Colors.white38, fontSize: 13), ), diff --git a/lib/ui/nfc_tag_writer_screen.dart b/lib/ui/nfc_tag_writer_screen.dart index 6b8b5ee..2146ae6 100644 --- a/lib/ui/nfc_tag_writer_screen.dart +++ b/lib/ui/nfc_tag_writer_screen.dart @@ -50,7 +50,7 @@ class _NfcTagWriterScreenState extends State { final bool isWriting = _controller.isWriting; return Scaffold( appBar: AppBar( - title: const Text("🏷️ NFC μ£Όλ¨Έλ‹ˆ νƒœκ·Έ μ“°κΈ°"), + title: const Text("NFC μ£Όλ¨Έλ‹ˆ νƒœκ·Έ μ“°κΈ°"), backgroundColor: Colors.deepPurple, foregroundColor: Colors.white, ), diff --git a/lib/ui/teacher_attendance_page.dart b/lib/ui/teacher_attendance_page.dart index 44f7046..d014188 100644 --- a/lib/ui/teacher_attendance_page.dart +++ b/lib/ui/teacher_attendance_page.dart @@ -63,7 +63,7 @@ class _TeacherAttendancePageState extends State { showDialog( context: context, builder: (context) => AlertDialog( - title: const Text('πŸ§ͺ ν…ŒμŠ€νŠΈμš© ν—ˆμš©μ‹œκ°„ μ΄ˆκΈ°ν™”'), + title: const Text('ν…ŒμŠ€νŠΈμš© ν—ˆμš©μ‹œκ°„ μ΄ˆκΈ°ν™”'), content: const Text( 'ν•˜κ΅ μ²˜λ¦¬λ‚˜ 반좜 ν—ˆμš© μ‹œκ°„ μ„€μ •μœΌλ‘œ 켜져 μžˆλŠ” λͺ¨λ“  ν—ˆμš© μ‹œκ°„λŒ€λ₯Ό μ§€κΈˆ μ¦‰μ‹œ ν•΄μ œν•©λ‹ˆλ‹€.\n' '(λ¬΄λ‹¨λ°˜μΆœ 감지 ν…ŒμŠ€νŠΈν•  λ•Œλ§Œ μ‚¬μš©ν•˜μ„Έμš”)', @@ -126,7 +126,7 @@ class _TeacherAttendancePageState extends State { showDialog( context: context, builder: (context) => AlertDialog( - title: const Text('⏰ 전체 학생 반좜 ν—ˆμš© μ‹œκ°„ μ„€μ •'), + title: const Text('전체 학생 반좜 ν—ˆμš© μ‹œκ°„ μ„€μ •'), content: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, @@ -169,7 +169,7 @@ class _TeacherAttendancePageState extends State { showDialog( context: context, builder: (context) => AlertDialog( - title: const Text('🏫 ν•˜κ΅ 처리'), + title: const Text('ν•˜κ΅ 처리'), content: const Text( 'μ§€κΈˆλΆ€ν„° λͺ¨λ“  ν•™μƒμ˜ 반좜이 μžλ™μœΌλ‘œ ν—ˆμš©λ˜λ©°, 더 이상 λ¬΄λ‹¨λ°˜μΆœ κ²½κ³ κ°€ λœ¨μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.\nν•˜κ΅ μ²˜λ¦¬ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?', ), @@ -206,7 +206,7 @@ class _TeacherAttendancePageState extends State { backgroundColor: AppPalette.mist, appBar: AppBar( title: const Text( - 'πŸ“‹ μ‹€μ‹œκ°„ μΆœμ„ ν˜„ν™©', + 'μ‹€μ‹œκ°„ μΆœμ„ ν˜„ν™©', style: TextStyle(fontWeight: FontWeight.bold), ), backgroundColor: AppPalette.ink, @@ -261,7 +261,7 @@ class _TeacherAttendancePageState extends State { Icons.bug_report_outlined, color: Colors.white70, ), - tooltip: 'πŸ§ͺ ν…ŒμŠ€νŠΈμš©: ν—ˆμš©μ‹œκ°„ μ΄ˆκΈ°ν™”', + tooltip: 'ν…ŒμŠ€νŠΈμš©: ν—ˆμš©μ‹œκ°„ μ΄ˆκΈ°ν™”', ), const SizedBox(width: 8), ], @@ -387,9 +387,9 @@ class _TeacherAttendancePageState extends State { ? Colors.red : (isPending ? Colors.orange : (isComplete ? Colors.blue : Colors.red)); final String statusLine = hasViolation - ? '🚨 λ¬΄λ‹¨λ°˜μΆœ (${student['violationTime']})' + ? 'λ¬΄λ‹¨λ°˜μΆœ (${student['violationTime']})' : (isPending - ? '⏳ λ―Έμ™„λ£Œ (${student['checkInTime']})' + ? 'λ―Έμ™„λ£Œ (${student['checkInTime']})' : (isComplete ? '${student['checkInTime']}' : (student['hasEverCheckedIn'] == true ? '미제좜' : '미등둝'))); @@ -691,7 +691,7 @@ class _TeacherAttendancePageState extends State { const SizedBox(width: 8), Expanded( child: Text( - 'πŸ”“ μ§€κΈˆ 전체 반좜 ν—ˆμš© μ€‘μž…λ‹ˆλ‹€ ($until κΉŒμ§€) β€” 이 μ‹œκ°„ λ™μ•ˆμ€ λ¬΄λ‹¨λ°˜μΆœ κ²½κ³ κ°€ λœ¨μ§€ μ•Šμ•„μš”.', + 'μ§€κΈˆ 전체 반좜 ν—ˆμš© μ€‘μž…λ‹ˆλ‹€ ($until κΉŒμ§€) β€” 이 μ‹œκ°„ λ™μ•ˆμ€ λ¬΄λ‹¨λ°˜μΆœ κ²½κ³ κ°€ λœ¨μ§€ μ•Šμ•„μš”.', style: TextStyle( color: Colors.amber[900], fontWeight: FontWeight.bold, @@ -721,12 +721,12 @@ class _TeacherAttendancePageState extends State { onSelected: (_) => _controller.setFilter("ALL"), ), FilterChip( - label: const Text("🟒 μΆœμ„μž"), + label: const Text("μΆœμ„μž"), selected: _controller.filterType == "CHECKED_IN", onSelected: (_) => _controller.setFilter("CHECKED_IN"), ), FilterChip( - label: const Text("πŸ”΄ λ―ΈμΆœμ„μž"), + label: const Text("λ―ΈμΆœμ„μž"), selected: _controller.filterType == "ABSENT", onSelected: (_) => _controller.setFilter("ABSENT"), ), diff --git a/lib/ui/teacher_register_screen.dart b/lib/ui/teacher_register_screen.dart index f66a649..28432e3 100644 --- a/lib/ui/teacher_register_screen.dart +++ b/lib/ui/teacher_register_screen.dart @@ -36,7 +36,7 @@ class _TeacherRegisterScreenState extends State { if (id.isEmpty || pw.isEmpty || name.isEmpty || secret.isEmpty) { ScaffoldMessenger.of( context, - ).showSnackBar(const SnackBar(content: Text('⚠️ λͺ¨λ“  λΉˆμΉΈμ„ μž…λ ₯ν•΄ μ£Όμ„Έμš”.'))); + ).showSnackBar(const SnackBar(content: Text('λͺ¨λ“  λΉˆμΉΈμ„ μž…λ ₯ν•΄ μ£Όμ„Έμš”.'))); return; } @@ -72,7 +72,7 @@ class _TeacherRegisterScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( - 'πŸ‘¨β€πŸ« ꡐ직원 μ „μš© 인증', + 'ꡐ직원 μ „μš© 인증', style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), ), const SizedBox(height: 4), @@ -85,7 +85,7 @@ class _TeacherRegisterScreenState extends State { controller: _secretController, obscureText: true, decoration: const InputDecoration( - labelText: 'πŸ”‘ ꡐ사 인증 λΉ„λ°€μ½”λ“œ μž…λ ₯', + labelText: 'ꡐ사 인증 λΉ„λ°€μ½”λ“œ μž…λ ₯', border: OutlineInputBorder(), ), ), diff --git a/lib/ui/teacher_student_management_page.dart b/lib/ui/teacher_student_management_page.dart index 86b8ed1..784f74f 100644 --- a/lib/ui/teacher_student_management_page.dart +++ b/lib/ui/teacher_student_management_page.dart @@ -53,7 +53,7 @@ class _TeacherStudentManagementPageState if (sId.isEmpty || sName.isEmpty) { ScaffoldMessenger.of( context, - ).showSnackBar(const SnackBar(content: Text('⚠️ λͺ¨λ“  μž…λ ₯λž€μ„ μ±„μ›Œμ£Όμ„Έμš”.'))); + ).showSnackBar(const SnackBar(content: Text('λͺ¨λ“  μž…λ ₯λž€μ„ μ±„μ›Œμ£Όμ„Έμš”.'))); return; } @@ -91,15 +91,13 @@ class _TeacherStudentManagementPageState if (!mounted) return; ScaffoldMessenger.of( context, - ).showSnackBar(SnackBar(content: Text('❌ μ—‘μ…€ νŒŒμΌμ„ μ½λŠ” 데 μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€: $e'))); + ).showSnackBar(SnackBar(content: Text('μ—‘μ…€ νŒŒμΌμ„ μ½λŠ” 데 μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€: $e'))); return; } if (rows.isEmpty) { if (!mounted) return; ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('⚠️ μœ νš¨ν•œ 학생 데이터λ₯Ό μ°Ύμ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€. (1행은 λ¨Έλ¦¬κΈ€λ‘œ κ±΄λ„ˆλœλ‹ˆλ‹€)'), - ), + const SnackBar(content: Text('μœ νš¨ν•œ 학생 데이터λ₯Ό μ°Ύμ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€. (1행은 λ¨Έλ¦¬κΈ€λ‘œ κ±΄λ„ˆλœλ‹ˆλ‹€)')), ); return; } @@ -112,7 +110,7 @@ class _TeacherStudentManagementPageState context: context, builder: (context) => AlertDialog( shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24)), - title: Text('πŸ“„ ${rows.length}λͺ… 확인됨'), + title: Text('${rows.length}λͺ… 확인됨'), content: SizedBox( width: 400, child: Column( @@ -209,9 +207,7 @@ class _TeacherStudentManagementPageState context: context, builder: (context) => AlertDialog( shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24)), - title: Text( - result.failures.isEmpty ? 'βœ… 일괄 등둝 μ™„λ£Œ' : '⚠️ 일괄 등둝 μ™„λ£Œ (일뢀 μ‹€νŒ¨)', - ), + title: Text(result.failures.isEmpty ? '일괄 등둝 μ™„λ£Œ' : '일괄 등둝 μ™„λ£Œ (일뢀 μ‹€νŒ¨)'), content: SizedBox( width: 400, child: Column( @@ -295,7 +291,7 @@ class _TeacherStudentManagementPageState context: context, builder: (ctx) => AlertDialog( title: const Text( - '⚠️ κΈ°κΈ° 등둝 μ΄ˆκΈ°ν™”', + 'κΈ°κΈ° 등둝 μ΄ˆκΈ°ν™”', style: TextStyle(fontWeight: FontWeight.bold, color: AppPalette.ink), ), content: Text('$studentName ν•™μƒμ˜ 슀마트폰 κΈ°κΈ° 등둝과 λΉ„λ°€λ²ˆν˜Έ(1234)λ₯Ό μ΄ˆκΈ°ν™”ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?'), @@ -676,7 +672,7 @@ class _TeacherStudentManagementPageState backgroundColor: AppPalette.mist, appBar: AppBar( title: const Text( - 'βš™οΈ 학생 톡합 관리 μ„Όν„°', + '학생 톡합 관리 μ„Όν„°', style: TextStyle(fontWeight: FontWeight.bold), ), backgroundColor: AppPalette.ink,