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

View File

@@ -1,11 +1,16 @@
import 'package:get/get.dart';
import '../pages/home_view.dart';
class ListController extends GetxController {
final username = ''.obs;
@override
void onInit() {
super.onInit();
username(Get.arguments ?? '');
}
@override
@@ -14,5 +19,9 @@ class ListController extends GetxController {
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 {
@override
void onInit() {
super.onInit();
// Setze die Basis-URL für deine API
httpClient.baseUrl = 'https://node.joshihomeserver.ipv64.net/api';
import 'package:get/get.dart';
import 'package:http/http.dart' as http;
import '../models/user_model.dart';
class ServiceRepos{
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) =>
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);
}
});
final responseUser = await getUsersList();
Future<Response> getFilamentsList(String username) =>
post('$baseUrl/GetFilamentDataByUser', {'username': username});
}
if (responseUser.statusCode != 200) {
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
factory FilamentModel.fromJson(Map<String, dynamic> json) {
return FilamentModel(
id: json['id'] as String,
name: json['name'] as String,
type: json['type'] as String,
color: json['color'] as String,
id: ( json['id'] as String).trim(),
name: (json['name'] as String).trim(),
type: (json['type'] as String).trim(),
color: (json['color'] as String).trim(),
weight: json['weight'] as int? ?? 0,
weightUsed: json['weightUsed'] as int? ?? 0,
price: (json['price'] as num).toDouble(),
manufacturer: json['manufacturer'] as String?,
purchaseDate: json['purchaseDate'] as String?,
notes: json['notes'] as String?,
manufacturer: (json['manufacturer'] as String?)?.trim(),
purchaseDate: (json['purchaseDate'] as String?)?.trim(),
notes: (json['notes'] as String?)?.trim(),
pices: json['pices'] as int,
printingTemp: json['printingTemp'] as int,
bedTemp: json['bedTemp'] as int,

View File

@@ -33,9 +33,9 @@ class UserModel {
factory UserModel.fromMap(Map<String, dynamic> map) {
return UserModel(
uuid: map['pk_userUuid'] as String,
username: map['benutzer'] as String,
passwort: map['kennwort'] as String,
uuid: (map['pk_userUuid'] as String).trim(),
username: (map['benutzer'] as String).trim(),
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 '../controllers/list_controller.dart';
@@ -9,7 +9,36 @@ class ListPage extends GetView<ListController> {
@override
Widget build(BuildContext context) {
var maxWidth = MediaQuery.sizeOf(context).width;
var maxHeight = MediaQuery.sizeOf(context).height;
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"
source: hosted
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:
dependency: "direct main"
description:
@@ -208,6 +224,14 @@ packages:
url: "https://pub.dev"
source: hosted
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:
dependency: transitive
description:

View File

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