first commit

This commit is contained in:
git
2025-01-29 21:14:24 +01:00
commit d676ba34f4
143 changed files with 5468 additions and 0 deletions

View File

@@ -0,0 +1,74 @@
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_itis4you_with_jde_user_login_app/pages/main/main_view.dart';
import 'package:get/get.dart';
import '../../utils/constants.dart';
class LoginController extends GetConnect {
//check diverse
final isLoading = true.obs;
final loginUserNameController = TextEditingController();
final loginUserPasswortController = TextEditingController();
var _listUsers = [];
final isPermitted = false.obs;
@override
void onInit() {
_getListUsers();
loginUserNameController.text = 'Seiringer Josef';
loginUserPasswortController.text = '1234';
super.onInit();
}
@override
void onReady() {}
@override
void onClose() {
loginUserNameController.dispose();
loginUserPasswortController.dispose();
}
Future<void> _getListUsers() async {
isLoading(false);
final response =
await rootBundle.loadString('lib/markup/login/login_markup.json');
if (response.isNotEmpty) {
String jsonString = response;
print(jsonString);
//clear all Caracter returns and spaces from jsonString to resultData
var decodeResult = json.decode(jsonString);
_listUsers = decodeResult['users'] as List<dynamic>;
isLoading(true);
}
}
void logInUser() {
isPermitted(false);
if (loginUserNameController.text == '' ||
loginUserPasswortController.text == '') {
kDisplaySnackBarRed('Es fehlen Eingaben bei den Anmelde Daten!');
isLoading(false);
} else {
kLoginUser = loginUserNameController.text;
kLoginPassword = loginUserPasswortController.text;
if (_listUsers.isNotEmpty) {
for (var mapItem in _listUsers) {
String user = mapItem['username'];
String pass = mapItem['password'];
if (user == kLoginUser && pass == kLoginPassword) {
isPermitted(true);
}
print(mapItem);
Get.offAllNamed(MainPage.namedRoute);
}
}
print(isPermitted.value);
}
}
}

View File

@@ -0,0 +1,51 @@
import 'package:get/get.dart';
import 'package:intl/date_symbol_data_local.dart';
import 'package:mobile_scanner/mobile_scanner.dart';
import '../../pages/login/login_view.dart';
class MainController extends GetxController {
final qrText = ''.obs;
MobileScannerController scannerController = MobileScannerController();
@override
void onInit() {
_initializeDateFormatting();
super.onInit();
}
@override
void onReady() {
stopScanning();
super.onReady();
}
void _initializeDateFormatting() async {
await initializeDateFormatting('de_DE', null);
}
void startScanning() {
scannerController.start();
}
void stopScanning() {
scannerController.stop();
}
void onDetect(Barcode barcode, args) {
final String code = barcode.rawValue ?? 'Unknown';
qrText.value = code;
stopScanning();
}
@override
void onClose() {
scannerController.dispose();
}
void goToLoginPage() {
Get.offAllNamed(LoginPage.namedRoute);
}
}

28
lib/main.dart Normal file
View File

@@ -0,0 +1,28 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'pages/login/login_view.dart';
import 'utils/http_overrides.dart';
import 'utils/sample_routes.dart';
void main() {
HttpOverrides.global = MyHttpOverrides();
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return GetMaterialApp(
title: 'Itis4You App',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
initialRoute: LoginPage.namedRoute,
getPages: SampleRouts.samplePages,
);
}
}

View File

@@ -0,0 +1,19 @@
{
"users":[
{
"id":"1000",
"username":"Zimmermann Harald",
"password":"1234"
},
{
"id":"1001",
"username":"Seiringer Josef",
"password":"1234"
},
{
"id":"1002",
"username":"Frizenwallner Andreas",
"password":"1234"
}
]
}

View File

@@ -0,0 +1,11 @@
class HttpException implements Exception {
final String message;
HttpException(this.message);
@override
String toString() {
return message;
// return super.toString(); // Instance of HttpException
}
}

78
lib/models/its_data.dart Normal file
View File

@@ -0,0 +1,78 @@
class ItsData {
final Data data;
ItsData({required this.data});
factory ItsData.fromJson(Map<String, dynamic> json) {
final data = json['data'] != null ? Data.fromJson(json['data']) : null;
return ItsData(data: data!);
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['data'] = this.data.toJson();
return data;
}
}
class Data {
List<Users> users;
Data({required this.users});
factory Data.fromJson(Map<String, dynamic> json) {
List<Users> users = [];
if (json['users'] != null) {
json['users'].forEach((v) {
users.add(Users.fromJson(v));
});
}
return Data(users: users);
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['users'] = users.map((v) => v.toJson()).toList();
return data;
}
}
class Users {
final User user;
Users({required this.user});
factory Users.fromJson(Map<String, dynamic> json) {
final user = json['user'] != null ? User.fromJson(json['user']) : throw Exception('User data is null');
return Users(user: user);
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['user'] = user.toJson();
return data;
}
}
class User {
final String userID;
final String name;
final String eMail;
User({required this.userID, required this.name, required this.eMail});
factory User.fromJson(Map<String, dynamic> json) {
final userID = json['userID'];
final name = json['name'];
final eMail = json['eMail'];
return User(userID: userID, name: name, eMail: eMail);
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['userID'] = userID;
data['name'] = name;
data['eMail'] = eMail;
return data;
}
}

View File

@@ -0,0 +1,30 @@
import '../models/its_data.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
import '../utils/constants.dart';
class MyNetwork {
final String networkUrl;
MyNetwork({required this.networkUrl});
Future<List<User>> getAllUsers() async {
List<User> myUserList = [];
var result =
await http.get(Uri.parse(kGetAllUsersURL), headers: kHttpHeaderBasicApiRest);
if (result.statusCode == 200) {
var jsonRequest = jsonDecode(result.body);
var apiRestUserlist = jsonRequest['data']['users'];
for (var user in apiRestUserlist) {
User u = User(
eMail: user['user']['eMail'],
userID: user['user']['userID'],
name: user['user']['name']);
myUserList.add(u);
}
}
return myUserList;
}
}

View File

@@ -0,0 +1,87 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '/controller/login/login_controller.dart';
import '/utils/my_text_button.dart';
class LoginPage extends GetView<LoginController> {
static const namedRoute = '/login-page';
const LoginPage({super.key});
@override
Widget build(BuildContext context) {
var logCtrl = controller;
var screenWidth = MediaQuery.of(context).size.width;
//var screenHeight = MediaQuery.of(context).size.height;
return SafeArea(
child: Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const SizedBox(height: 25.0),
Container(
width: screenWidth*0.4,
padding: const EdgeInsets.all(10.0),
decoration: BoxDecoration(
color: Colors.red,
borderRadius: BorderRadius.all(Radius.circular(8.0)),
),
child: const Text(
'Internorm',
style: TextStyle(
fontSize: 50.0,
color: Colors.white,
fontWeight: FontWeight.bold,
),
),
),
const SizedBox(height: 10),
const Text('Itis4You Inventory',
style:
TextStyle(fontSize: 30.0, fontStyle: FontStyle.italic)),
const SizedBox(height: 50.0),
SizedBox(
width: screenWidth*0.5,
child: TextField(
textAlign: TextAlign.center,
decoration: InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(5.0),
),
labelText: 'Nachname Vorname',
),
keyboardType: TextInputType.text,
controller: logCtrl.loginUserNameController,
),
),
SizedBox(height: 10.0),
SizedBox(
width: screenWidth*0.5,
child: TextField(
textAlign: TextAlign.center,
decoration: InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(5.0),
),
labelText: 'Passwort 4 Stellen',
),
keyboardType: TextInputType.text,
obscureText: true,
controller: logCtrl.loginUserPasswortController,
),
),
SizedBox(height: 20.0),
MyTextButton(
onTap: () => logCtrl.logInUser(),
screenWidth: screenWidth * 0.4,
buttonText: 'ANMELDEN',
),
],
),
),
),
);
}
}

View File

@@ -0,0 +1,90 @@
import 'package:flutter/material.dart';
import 'package:flutter_itis4you_with_jde_user_login_app/utils/my_text_button.dart';
import 'package:get/get.dart';
import 'package:mobile_scanner/mobile_scanner.dart';
import '../../controller/main/main_controller.dart';
class MainPage extends GetView<MainController> {
static const namedRoute = '/main-page';
const MainPage({super.key});
@override
Widget build(BuildContext context) {
var mainCtrl = controller;
double screenWidth = MediaQuery.of(context).size.width;
double screenHeight = MediaQuery.of(context).size.height;
return SafeArea(
child: Scaffold(
appBar: AppBar(
centerTitle: true,
title: const Text(
'Inventarcode Scannen',
style: TextStyle(color: Colors.white, fontSize: 25.0),
),
toolbarHeight: 120.0,
backgroundColor: Colors.grey.shade700,
leading: IconButton(
icon: const Icon(Icons.arrow_back),
onPressed: () => mainCtrl.goToLoginPage(),
),
//centerTitle: true,
),
body: SafeArea(
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Container(
width: screenWidth * 0.7,
height: screenHeight * 0.35,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10.0),
),
child: MobileScanner(
controller: mainCtrl.scannerController,
onDetect: (barcode) {
var bar = barcode.barcodes.first;
var args = barcode.image;
mainCtrl.onDetect(bar, args);
},
),
),
SizedBox(height: 50.0),
Obx(() => Center(
child: Container(
alignment: Alignment.center,
width: screenWidth*0.6,
height: 80.0,
decoration: BoxDecoration(
border: Border.all(
color: Colors.grey.shade600,
width: 5.0,
),
borderRadius: BorderRadius.circular(20.0),
),
child: Text(
mainCtrl.qrText.value,
style: TextStyle(
fontSize: 35.0,
fontWeight: FontWeight.bold,
),
),
),
)),
SizedBox(height: 50.0),
SizedBox(
width: screenWidth * 0.4,
child: MyTextButton(
onTap: () => mainCtrl.startScanning(),
screenWidth: screenWidth * 0.4,
buttonText: 'Start Scannen',
),
),
],
),
),
),
),
);
}
}

63
lib/utils/constants.dart Normal file
View File

@@ -0,0 +1,63 @@
import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
const kLoginURL = 'http://ifnweb12.ifndom.net:8789/jderest/v2/tokenrequest';
const kGetAllUsersURL =
'https://api.internorm.com:4481/gateway/ITIS4U_Inventory_Management/1.0/ITIS4U_Inventory/users';
const kGetAssetsByUserIdBaseURL =
'https://api.internorm.com:4481/gateway/ITIS4U_Inventory_Management/1.0/ITIS4U_Inventory/assetsByUser';
const kGetAssetByInventoryIdBaseURL =
'https://api.internorm.com:4481/gateway/ITIS4U_Inventory_Management/1.0/ITIS4U_Inventory/asset';
var szApiUsername = 'Service';
var szApiPassword = 'manage';
var kLoginToken = '';
var kLoginUser = '';
var kLoginPassword = '';
//HttpHeader Authentification Login
var kBasicAuthLogin =
'Basic ${base64.encode(utf8.encode('$kLoginUser:$kLoginPassword'))}';
var kHttpHeaderBasic = {HttpHeaders.authorizationHeader: kBasicAuthLogin};
var kBasicAuthApiRest = 'Basic ${base64.encode(utf8.encode('$szApiUsername:$szApiPassword'))}';
var kHttpHeaderBasicApiRest = {HttpHeaders.authorizationHeader: kBasicAuthLogin};
var kFontSizeDouble = 15.0;
var kTextSyleLittleGrey =
TextStyle(fontSize: 12.0, color: Colors.grey.shade500);
//DropDown Styles
var kInputDecorationDropDownMenue = InputDecoration(
//prefixIcon: Icon(Icons.date_range),
hintText: 'User'.toUpperCase(),
contentPadding: const EdgeInsets.all(10),
hintStyle: TextStyle(letterSpacing: 2, fontSize: kFontSizeDouble),
filled: true,
fillColor: Colors.grey.shade400,
errorStyle: const TextStyle(color: Colors.yellow),
);
SnackbarController kDisplaySnackBarRed(String szInfoText) {
return Get.snackbar('Info', szInfoText,
backgroundColor: Colors.red[600],
snackPosition: SnackPosition.TOP,
colorText: Colors.white,
snackStyle: SnackStyle.GROUNDED);
}
SnackbarController kDisplaySnackBarGreen(String szInfoText) {
return Get.snackbar('Info', szInfoText,
backgroundColor: Colors.green[600],
snackPosition: SnackPosition.TOP,
colorText: Colors.black,
snackStyle: SnackStyle.GROUNDED);
}
String? kHandyModel;

View File

@@ -0,0 +1,10 @@
import 'dart:io';
class MyHttpOverrides extends HttpOverrides {
@override
HttpClient createHttpClient(SecurityContext? context) {
return super.createHttpClient(context)
..badCertificateCallback =
(X509Certificate cert, String host, int port) => true;
}
}

View File

@@ -0,0 +1,40 @@
import 'package:flutter/material.dart';
class MyTextButton extends StatelessWidget {
const MyTextButton({
super.key,
required this.onTap,
required this.screenWidth,
required this.buttonText,
});
final void Function()? onTap;
final double screenWidth;
final String buttonText;
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: onTap,
child: Container(
alignment: Alignment.center,
width: screenWidth,
height: 80.0,
decoration: BoxDecoration(
color: Colors.blue.shade700,
borderRadius: BorderRadius.circular(5.0)
),
child: Text(
buttonText,
style: const TextStyle(
fontSize: 30.0,
color: Colors.white,
fontWeight: FontWeight.bold,
letterSpacing: 2.0,
wordSpacing: 8.0,
),
),
),
);
}
}

View File

@@ -0,0 +1,11 @@
import 'package:get/get.dart';
import '../controller/login/login_controller.dart';
import '../controller/main/main_controller.dart';
class SampleBindings extends Bindings {
@override
void dependencies() {
Get.lazyPut<LoginController>(() => LoginController());
Get.lazyPut<MainController>(() => MainController());
}
}

View File

@@ -0,0 +1,21 @@
import 'package:get/get.dart';
import './sample_bindings.dart';
import '../../pages/main/main_view.dart';
import '../../pages/login/login_view.dart';
class SampleRouts {
static final sampleBindings = SampleBindings();
static final samplePages = [
GetPage(
name: LoginPage.namedRoute,
binding: sampleBindings,
page: () => const LoginPage(),
),
GetPage(
name: MainPage.namedRoute,
binding: sampleBindings,
page: () => const MainPage(),
),
];
}

View File

@@ -0,0 +1,43 @@
import 'package:flutter/material.dart';
class MyTextButton extends StatelessWidget {
const MyTextButton({
super.key,
required this.onTap,
required this.screenWidth,
this.screenHeight = 80.0,
this.fontSize = 20.0,
this.backgroundColor = const Color.fromARGB(255, 66, 66, 66),
this.textColor = Colors.white,
required this.buttonText,
});
final void Function()? onTap;
final double screenWidth;
final double screenHeight;
final double fontSize;
final Color backgroundColor;
final Color textColor;
final String buttonText;
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: onTap,
child: Container(
alignment: Alignment.center,
width: screenWidth,
height: screenHeight,
color: backgroundColor,
child: Text(
buttonText,
textAlign: TextAlign.center,
style: TextStyle(
fontSize: fontSize,
color: textColor,
),
),
),
);
}
}