login and begin listView

This commit is contained in:
2026-04-11 00:05:06 +02:00
parent 122ae48754
commit da7f59f47e
8 changed files with 122 additions and 47 deletions

View File

@@ -1,13 +1,14 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_mssql_node_filament_app/helpers/services_repos.dart'; import 'package:http/http.dart' as http;
import 'package:flutter_mssql_node_filament_app/pages/list_view.dart'; import '../helpers/services_repos.dart';
import 'package:flutter_mssql_node_filament_app/pages/signin_view.dart'; import '../pages/list_view.dart';
import '../pages/signin_view.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
class HomeController extends GetxController { class HomeController extends GetxController {
final benutzerController = TextEditingController(); final benutzerController = TextEditingController();
final passwordController = TextEditingController(); final passwordController = TextEditingController();
final serviceRepos = ServiceRepos(); final serviceRepos = ServiceRepos(httpClient: http.Client());
@override @override
void onClose() { void onClose() {
@@ -41,10 +42,10 @@ class HomeController extends GetxController {
if (!validateLogin()) return; if (!validateLogin()) return;
String benutzer = benutzerController.text.trim(); String benutzer = benutzerController.text.trim();
String password = passwordController.text.trim(); String password = passwordController.text.trim();
var response = await serviceRepos.getUserIsValide(benutzer, password); var user = await serviceRepos.loginService(benutzer, password);
if (response.statusCode == 200 && response.body['valid'] == true) { if (user.uuid != '') {
// Navigiere zur Listenseite // Navigiere zur Listenseite
Get.offAllNamed(ListPage.namedRoute); Get.offAllNamed(ListPage.namedRoute, arguments: user.username);
} else { } else {
Get.snackbar( Get.snackbar(
'Fehler', 'Fehler',

View File

@@ -1,11 +1,16 @@
import 'package:get/get.dart'; import 'package:get/get.dart';
import '../pages/home_view.dart';
class ListController extends GetxController { class ListController extends GetxController {
final username = ''.obs;
@override @override
void onInit() { void onInit() {
super.onInit(); super.onInit();
username(Get.arguments ?? '');
} }
@override @override
@@ -14,5 +19,9 @@ class ListController extends GetxController {
super.onClose(); super.onClose();
} }
void exitApp() {
Get.offAllNamed(HomePage.namedRoute);
}
} }

View File

@@ -1,32 +1,43 @@
import 'package:get/get.dart'; import 'dart:convert';
class ServiceRepos extends GetConnect { import 'package:get/get.dart';
@override import 'package:http/http.dart' as http;
void onInit() { import '../models/user_model.dart';
super.onInit();
// Setze die Basis-URL für deine API class ServiceRepos{
httpClient.baseUrl = 'https://node.joshihomeserver.ipv64.net/api'; final http.Client httpClient;
final String baseUrl = 'https://node.joshihomeserver.ipv64.net/api';
ServiceRepos({required this.httpClient});
Future<http.Response> getUsersList() {
return httpClient.get(
Uri.parse('$baseUrl/GetFilamentUsers'),
headers: {'Content-Type': 'application/json'},
);
} }
Future<Response> getUsersList() => get('$baseUrl/GetFilamentUsers', headers: {'Content-Type': 'application/json'}); Future<UserModel> loginService(String username, String password) async {
Future<Response> getUserIsValide(String username, String password) => final responseUser = await getUsersList();
getUsersList().then((response) {
if (response.statusCode == 200 && response.body is List) {
final users = response.body as List;
final user = users.firstWhere(
(u) => u['benutzer'] == username && u['kennwort'] == password,
orElse: () => null,
);
return Response(
statusCode: user != null ? 200 : 401,
body: user != null ? {'valid': true} : {'valid': false},
);
} else {
return Response(statusCode: response.statusCode, body: response.body);
}
});
Future<Response> getFilamentsList(String username) => if (responseUser.statusCode != 200) {
post('$baseUrl/GetFilamentDataByUser', {'username': username}); return UserModel(uuid: '', username: '', passwort: '');
} }
final users = responseUser.body.isNotEmpty
? List<Map<String, dynamic>>.from(json.decode(responseUser.body))
: <Map<String, dynamic>>[];
List<UserModel> userModels = users.map((u) => UserModel.fromMap(u)).toList();
final UserModel? searchUser = userModels.firstWhereOrNull(
(u) => u.username == username && u.passwort == password);
if (searchUser == null || searchUser.uuid.isEmpty) {
return UserModel(uuid: '', username: '', passwort: '');
}
return searchUser;
}
}

View File

@@ -53,16 +53,16 @@ class FilamentModel {
// JSON Deserialisierung // JSON Deserialisierung
factory FilamentModel.fromJson(Map<String, dynamic> json) { factory FilamentModel.fromJson(Map<String, dynamic> json) {
return FilamentModel( return FilamentModel(
id: json['id'] as String, id: ( json['id'] as String).trim(),
name: json['name'] as String, name: (json['name'] as String).trim(),
type: json['type'] as String, type: (json['type'] as String).trim(),
color: json['color'] as String, color: (json['color'] as String).trim(),
weight: json['weight'] as int? ?? 0, weight: json['weight'] as int? ?? 0,
weightUsed: json['weightUsed'] as int? ?? 0, weightUsed: json['weightUsed'] as int? ?? 0,
price: (json['price'] as num).toDouble(), price: (json['price'] as num).toDouble(),
manufacturer: json['manufacturer'] as String?, manufacturer: (json['manufacturer'] as String?)?.trim(),
purchaseDate: json['purchaseDate'] as String?, purchaseDate: (json['purchaseDate'] as String?)?.trim(),
notes: json['notes'] as String?, notes: (json['notes'] as String?)?.trim(),
pices: json['pices'] as int, pices: json['pices'] as int,
printingTemp: json['printingTemp'] as int, printingTemp: json['printingTemp'] as int,
bedTemp: json['bedTemp'] as int, bedTemp: json['bedTemp'] as int,

View File

@@ -33,9 +33,9 @@ class UserModel {
factory UserModel.fromMap(Map<String, dynamic> map) { factory UserModel.fromMap(Map<String, dynamic> map) {
return UserModel( return UserModel(
uuid: map['pk_userUuid'] as String, uuid: (map['pk_userUuid'] as String).trim(),
username: map['benutzer'] as String, username: (map['benutzer'] as String).trim(),
passwort: map['kennwort'] as String, passwort: (map['kennwort'] as String).trim(),
); );
} }

View File

@@ -1,4 +1,4 @@
import 'package:flutter/widgets.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import '../controllers/list_controller.dart'; import '../controllers/list_controller.dart';
@@ -9,7 +9,36 @@ class ListPage extends GetView<ListController> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var maxWidth = MediaQuery.sizeOf(context).width;
var maxHeight = MediaQuery.sizeOf(context).height;
var listCtrl = controller; var listCtrl = controller;
return const Placeholder(); return Obx(
() => SafeArea(
child: Scaffold(
appBar: AppBar(
backgroundColor: Get.theme.colorScheme.primary,
foregroundColor: Get.theme.colorScheme.onPrimary,
title: Text('Liste'),
centerTitle: true,
actions: [IconButton(onPressed: () => listCtrl.exitApp(), icon: Icon(Icons.logout))],
),
body: Container(
width: maxWidth,
height: maxHeight,
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [
Get.theme.colorScheme.primary.withAlpha(26),
Get.theme.colorScheme.primary.withAlpha(13),
],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
),
),
child: Center(child: Text(listCtrl.username.value)),
),
),
),
);
} }
} }

View File

@@ -83,6 +83,22 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.7.3" version: "4.7.3"
http:
dependency: "direct main"
description:
name: http
sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412"
url: "https://pub.dev"
source: hosted
version: "1.6.0"
http_parser:
dependency: transitive
description:
name: http_parser
sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
url: "https://pub.dev"
source: hosted
version: "4.1.2"
intl: intl:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -208,6 +224,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.7.10" version: "0.7.10"
typed_data:
dependency: transitive
description:
name: typed_data
sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
url: "https://pub.dev"
source: hosted
version: "1.4.0"
vector_math: vector_math:
dependency: transitive dependency: transitive
description: description:

View File

@@ -13,6 +13,7 @@ dependencies:
flutter: flutter:
sdk: flutter sdk: flutter
get: ^4.7.3 get: ^4.7.3
http: ^1.6.0
intl: ^0.20.2 intl: ^0.20.2
dev_dependencies: dev_dependencies: