kazpgmの日記

『プログラム自動作成@自動生成』作成の日記

フロント側をFlutter(スマホ)Thymeleaf(PC)、バックエンド側SpringBootの自動作成勉強中

9:21
①昨日の11:44のつづき。
 これからのフロントFlutter側のuser_form.dart(MessageFormを包含している)の「プロパティ エラーメッセージ用変数」を別のクラス(UserErrFormクラスを作成)にして包含するように修正する。
■修正後のuser_form.dart

import 'dart:convert';
import 'package:flutter/cupertino.dart';
import 'package:flutter_app/form/user_err_form.dart';
import 'message_form.dart';

/// ユーザー情報画面Form
class UserForm {
  //プロパティ 入出力データ用
  late int id; // ID
  late String name; // 名前
  late String email; // メールアドレス
  late String password; // パスワード
  late String passwordConfirm; // パスワード確認
  late List<String> rolesArray; // ロール
  late String roles; // ロール (詳細表示用)
  // バックエンド(SpringBoot)のFormでBooleanだけどStringで処理する
  late String enableFlag; // 可否フラグ
  //プロパティ エラーメッセージ
  late UserErrForm userErrForm; // プロパティ エラーメッセージ
  // 共通・メッセージ
  late MessageForm messageForm; // 共通・メッセージ

  /// コンストラクタ
  // Dartでは「コンストラクタ名.任意名称」で複数のコンストラクタを定義する
  // 「UserForm(this.name,・・・);」コンストラクタはいらないので,
  // これだけにする。
  // 初期値のクラスを作成している
  UserForm.initData()  {
    //入出力データ用
    id = 0;
    name = "";
    email = "";
    password = "";
    passwordConfirm = "";
    rolesArray = <String>[];
    roles = "";
    enableFlag = "";
    // プロパティ エラーメッセージ
    userErrForm = UserErrForm.initData();
    // 共通・メッセージ
    messageForm = MessageForm.initData();
  }

  /// HTTPレスポンスデータを反映する
  fromJson(String resData) {
    Map<String,dynamic> _resDataMap =
              jsonDecode(resData);
    //入出力データ用
    if (_resDataMap["resForm"]==null) {
      id = 0;
      name = "";
      email = "";
      password = "";
      passwordConfirm = "";
      rolesArray = <String>[];
      roles = "";
      enableFlag = "";
    } else {
      id = _resDataMap["resForm"]["id"] ?? 0;
      name = _resDataMap["resForm"]["name"] ?? "";
      email = _resDataMap["resForm"]["email"] ?? "";
      password = _resDataMap["resForm"]["password"] ?? "";
      passwordConfirm = _resDataMap["resForm"]["passwordConfirm"] ?? "";
      //jsonから読み込んだときのエラー(”type 'List<dynamic>' is not a subtype of type 'List<String>'”)に
      // 対応し、".cast<String>()"でキャストした
      rolesArray = _resDataMap["resForm"]["rolesArray"]!=null?_resDataMap["resForm"]["rolesArray"].cast<String>():<String>[];
      roles = _resDataMap["resForm"]["roles"] ?? "";
      enableFlag = "";
      if (_resDataMap["resForm"]["enableFlag"] != null) {
        if (_resDataMap["resForm"]["enableFlag"]) {
          enableFlag = "true";
        } else {
          enableFlag = "false";
        }
      }
    }
    // プロパティ エラーメッセージ
    userErrForm.fromJson(resData);
    // 共通・メッセージ
    messageForm.fromJson(resData);
  }

  /// HTTPレスポンスデータを作成する
  Map<String,dynamic> toJsonMap (String _mode, String _csrf, int page) {
    Map<String,dynamic> userFormMap = {
      'id': id,
      'name': name,
      'email': email,
      'password': password,
      'passwordConfirm': passwordConfirm,
      'rolesArray': rolesArray,
      'enableFlag': enableFlag,
    };
    Map<String,dynamic> rtnMap = {
      'userForm': userFormMap,
      'formComm': messageForm.toJsonMap(_mode, _csrf, page),
    };
    return rtnMap;
  }

  /// http.postのbodyで使用するJsonデータを返却する
  String toJson(String _mode, String _csrf, [int page=1]) {
    return json.encode(toJsonMap(_mode, _csrf, page));
  }

  /// 入出力データを、TextFormFieldに設定する
  forUserFormController(
      TextEditingController nameController,
      TextEditingController emailController,
      TextEditingController passwordController,
      TextEditingController passwordConfirmController
      ) {
    nameController.text = name;
    emailController.text = email;
    passwordController.text = password;
    passwordConfirmController.text = passwordConfirm;
  }

  /// TextFormField値を、入出力データに設定する
  fromUserFormController(
      TextEditingController nameController,
      TextEditingController emailController,
      TextEditingController passwordController,
      TextEditingController passwordConfirmController
      ) {
    name = nameController.text;
    email = emailController.text;
    password = passwordController.text;
    passwordConfirm = passwordConfirmController.text;
  }
}

■修正後のuser_err_form.dart

import 'dart:convert';
import 'package:flutter/cupertino.dart';

import 'message_form.dart';

/// ユーザー情報画面プロパティ エラーメッセージ用Form
class UserErrForm {
  //プロパティ エラーメッセージ用
  late List<String> idErr; // ID
  late List<String> nameErr; // 名前
  late List<String> emailErr; // メールアドレス
  late List<String> passwordErr; // パスワード
  late List<String> passwordConfirmErr; // パスワード確認
  late List<String> checkPasswordPasswordConfirmErr; // パスワード、パスワード確認の相関チェック
  late List<String> rolesArrayErr; // ロール
  late List<String> enableFlagErr; // 可否フラグ

  /// コンストラクタ
  // Dartでは「コンストラクタ名.任意名称」で複数のコンストラクタを定義する
  // 「UserForm(this.name,・・・);」コンストラクタはいらないので,
  // これだけにする。
  // 初期値のクラスを作成している
  UserErrForm.initData()  {
    //エラーメッセージ用
    idErr = <String>[];
    nameErr = <String>[];
    emailErr = <String>[];
    passwordErr = <String>[];
    passwordConfirmErr = <String>[];
    checkPasswordPasswordConfirmErr = <String>[];
    rolesArrayErr = <String>[];
    enableFlagErr = <String>[];
  }

  /// HTTPレスポンスデータを反映する
  fromJson(String resData) {
    Map<String,dynamic> _resDataMap =
              jsonDecode(resData);
    //エラーメッセージ用
    if (_resDataMap["resErrorData"]==null) {
      idErr = <String>[];
      nameErr = <String>[];
      emailErr = <String>[];
      passwordErr = <String>[];
      passwordConfirmErr = <String>[];
      checkPasswordPasswordConfirmErr = <String>[];
      rolesArrayErr = <String>[];
      enableFlagErr = <String>[];
    } else {
      idErr = _resDataMap["resErrorData"]["userForm.id"]!=null?_resDataMap["resErrorData"]["userForm.id"].cast<String>():<String>[];
      nameErr = _resDataMap["resErrorData"]["userForm.name"]!=null?_resDataMap["resErrorData"]["userForm.name"].cast<String>():<String>[];
      emailErr = _resDataMap["resErrorData"]["userForm.email"]!=null?_resDataMap["resErrorData"]["userForm.email"].cast<String>():<String>[];
      passwordErr = _resDataMap["resErrorData"]["userForm.password"]!=null?_resDataMap["resErrorData"]["userForm.password"].cast<String>():<String>[];
      passwordConfirmErr = _resDataMap["resErrorData"]["userForm.passwordConfirm"]!=null?_resDataMap["resErrorData"]["userForm.passwordConfirm"].cast<String>():<String>[];
      checkPasswordPasswordConfirmErr = _resDataMap["resErrorData"]["userForm.checkPasswordPasswordConfirm"]!=null?_resDataMap["resErrorData"]["userForm.checkPasswordPasswordConfirm"].cast<String>():<String>[];
      rolesArrayErr = _resDataMap["resErrorData"]["userForm.rolesArray"]!=null?_resDataMap["resErrorData"]["userForm.rolesArray"].cast<String>():<String>[];
      enableFlagErr = _resDataMap["resErrorData"]["userForm.enableFlag"]!=null?_resDataMap["resErrorData"]["userForm.enableFlag"].cast<String>():<String>[];
    }
  }
}

■修正後のmessage_form.dart

import 'dart:convert';

/// 共通・メッセージForm。各、Formのベースクラス
class MessageForm {
  //プロパティ 実行結果メッセージ用
  late String itemErrorMessages; // 項目エラーメッセージ
  late String errorMessage; // 実行結果エラーメッセージ
  late String successMessage; // 実行結果OKメッセージ
  //そのた
  late String mode; // モード
  late int page; // ページ番号
  late int pageObjSize; // 検索結果の当ページの行数
  late int pageObjTotalPages; //  検索結果の総ページ数

  /// コンストラクタ
  // Dartでは「コンストラクタ名.任意名称」で複数のコンストラクタを定義する
  // 「MessageForm(this.name,・・・);」コンストラクタはいらないので,
  // これだけにする。
  // 初期値のクラスを作成している
  MessageForm.initData() {
    //実行結果メッセージ用
    itemErrorMessages = "";
    errorMessage = "";
    successMessage = "";
    //そのた
    mode = "";
    page = 1;
    pageObjSize = 0;
    pageObjTotalPages = 0;
  }

  /// http.postのbodyで使用するJsonデータを返却する
  String toJson(String _mode, String _csrf, [int page=1]) {
    return json.encode(toJsonMap(_mode, _csrf, page));
  }

  /// HTTPレスポンスデータを反映する
  fromJson(String resData) {
    Map<String,dynamic> _resDataMap =
              jsonDecode(resData);
    //実行結果メッセージ用
    itemErrorMessages = _resDataMap["itemErrorMessages"] ?? "";
    errorMessage = _resDataMap["errorMessage"] ?? "";
    successMessage = _resDataMap["successMessage"] ?? "";
    //そのた
    mode = _resDataMap["mode"] ?? "";
    Map<String,dynamic> pageObj; // 検索結果のページ情報
    if (_resDataMap["pageObj"]==null || _resDataMap["pageObj"].length < 1) {
      pageObj = {};
      page = _resDataMap["resForm"]["page"] ?? 1;
      pageObjSize = 0;
      pageObjTotalPages = 0;
    } else {
      pageObj = _resDataMap["pageObj"];
      page = pageObj["pageNumber"] + 1;
      pageObjSize = pageObj["size"];
      pageObjTotalPages = pageObj["totalPages"];
    }
  }

  /// HTTPレスポンスデータを作成する
  Map<String,dynamic> toJsonMap (String _mode, String _csrf, int page) {
    Map<String,dynamic> rtnMap = {
      'mode': _mode,
      '_csrf': _csrf,
      'page': page,
    };
    return rtnMap;
  }

}

16:58
①上記のつづき。
 フロントFlutter側のuser_srch_form.dartも同じように、UserSrchErrForm、SrchOrderForm(SrchOrderErrFormを包含する)、MessageFormを包含するように修正する。
■修正後のuser_srch_form.dart

import 'dart:convert';
import 'package:flutter/cupertino.dart';
import 'package:flutter_app/form/comm/srch_order_form.dart';
import 'package:flutter_app/form/user_srch_err_form.dart';

import 'comm/message_form.dart';

/// ユーザー情報検索画面Form
class UserSrchForm {
  //プロパティ 入出力データ用
  late String name; // 名前
  late String email; // メールアドレス
  late String roles; // ロール
  late String enableFlag; // 可否フラグ
  late List<dynamic> resListForm; // 情報一覧
  // プロパティ エラーメッセージ
  late UserSrchErrForm userSrchErrForm; // プロパティ エラーメッセージ
  // 共通・検索ソート順Form
  late SrchOrderForm srchOrderForm; // 共通・検索ソート順Form
  // 共通・メッセージ
  late MessageForm messageForm; // 共通・メッセージ

  /// コンストラクタ
  // Dartでは「コンストラクタ名.任意名称」で複数のコンストラクタを定義する
  // 「クラス名(this.name,・・・);」コンストラクタはいらないので,
  // これだけにする。
  // 初期値のクラスを作成している
  UserSrchForm.initData() {
    //入出力データ用
    name = "";
    email = "";
    roles = "";
    enableFlag = "";
    //出力データ用
    resListForm = [{}];
    // プロパティ エラーメッセージ
    userSrchErrForm = UserSrchErrForm.initData();
    // 共通・検索ソート順Form
    srchOrderForm = SrchOrderForm.initData();
    // 共通・メッセージ
    messageForm = MessageForm.initData();
  }

  /// HTTPレスポンスデータを反映する
  fromJson(String resData) {
    Map<String,dynamic> _resDataMap =
              jsonDecode(resData);
    //入出力データ用
    if (_resDataMap["resForm"]==null) {
      name = "";
      email = "";
      roles = "";
      enableFlag = "";
    } else {
      name = _resDataMap["resForm"]["name"] ?? "";
      email = _resDataMap["resForm"]["email"] ?? "";
      roles = _resDataMap["resForm"]["roles"] ?? "";
      enableFlag = _resDataMap["resForm"]["enableFlag"] ?? "";
    }
    //出力データ用
    if (_resDataMap["resListForm"]==null) {
      resListForm = [{}];
    } else {
      resListForm = _resDataMap["resListForm"];
    }
    // プロパティ エラーメッセージ
    userSrchErrForm.fromJson(resData);
    // 共通・検索ソート順Form
    srchOrderForm.fromJson(resData);
    // 共通・メッセージ
    messageForm.fromJson(resData);
   }

  /// HTTPレスポンスデータを作成する
  Map<String,dynamic> toJsonMap (String _mode, String _csrf, [int page=1]) {
    Map<String,dynamic> userSrchFormMap = {
      'name': name,
      'email': email,
      'roles': roles,
      'enableFlag': enableFlag,
    };
    Map<String,dynamic> rtnMap = {
      'userSrchForm': userSrchFormMap,
      'srchOrderForm': srchOrderForm.toJsonMap(_mode, _csrf, page),
      'formComm': messageForm.toJsonMap(_mode, _csrf, page),
    };
    return rtnMap;
  }

  /// http.postのbodyで使用するJsonデータを返却する
  String toJson(String _mode, String _csrf, [int page=1]) {
    return json.encode(toJsonMap(_mode, _csrf, page));
  }

  /// 入出力データを、TextFormFieldに設定する
  forUserSrchFormController(
      TextEditingController nameController,
      TextEditingController emailController,
      ) {
    nameController.text = name;
    emailController.text = email;
  }

  /// TextFormField値を、入出力データに設定する
  fromUserSrchFormController(
      TextEditingController nameController,
      TextEditingController emailController,
      ) {
    name = nameController.text;
    email = emailController.text;
  }
}

■修正後のuser_srch_err_form.dart

import 'dart:convert';

/// ユーザー情報画面プロパティ エラーメッセージ用Form
class UserSrchErrForm {
  //プロパティ エラーメッセージ用
  late List<String> nameErr; // 名前
  late List<String> emailErr; // メールアドレス
  late List<String> rolesErr; // ロール
  late List<String> enableFlagErr; // 可否フラグ

  /// コンストラクタ
  // Dartでは「コンストラクタ名.任意名称」で複数のコンストラクタを定義する
  // 「クラス名(this.name,・・・);」コンストラクタはいらないので,
  // これだけにする。
  // 初期値のクラスを作成している
  UserSrchErrForm.initData()  {
    //エラーメッセージ用
    nameErr = <String>[];
    emailErr = <String>[];
    rolesErr = <String>[];
    enableFlagErr = <String>[];
  }

  /// HTTPレスポンスデータを反映する
  fromJson(String resData) {
    Map<String,dynamic> _resDataMap =
              jsonDecode(resData);
    //エラーメッセージ用
    if (_resDataMap["resErrorData"]==null) {
      nameErr = <String>[];
      emailErr = <String>[];
      rolesErr = <String>[];
      enableFlagErr = <String>[];
    } else {
      nameErr = _resDataMap["resErrorData"]["name"]!=null?_resDataMap["resErrorData"]["name"].cast<String>():<String>[];
      emailErr = _resDataMap["resErrorData"]["email"]!=null?_resDataMap["resErrorData"]["email"].cast<String>():<String>[];
      rolesErr = _resDataMap["resErrorData"]["roles"]!=null?_resDataMap["resErrorData"]["roles"].cast<String>():<String>[];
      enableFlagErr = _resDataMap["resErrorData"]["enableFlag"]!=null?_resDataMap["resErrorData"]["enableFlag"].cast<String>():<String>[];
    }
  }
}

■修正後のsrch_order_form.dart

import 'dart:convert';
import 'package:flutter/cupertino.dart';
import 'package:flutter_app/form/comm/message_form.dart';
import 'package:flutter_app/form/comm/srch_order_err_form.dart';

/// 共通・検索ソート順Formのベースクラス
class SrchOrderForm {
  //プロパティ 入出力データ用
  late String sortItemName;
  late String sortOrder;
  late String updMode;
  // プロパティ エラーメッセージ
  late SrchOrderErrForm srchOrderErrForm; // プロパティ エラーメッセージ

  /// コンストラクタ
  // Dartでは「コンストラクタ名.任意名称」で複数のコンストラクタを定義する
  // 「クラス名(this.sortItemName,・・・);」コンストラクタはいらないので,
  // これだけにする。
  // 初期値のクラスを作成している
  SrchOrderForm.initData() {
    //入出力データ用
    sortItemName = "";
    sortOrder = "";
    updMode = "lstMode";
    // プロパティ エラーメッセージ
    srchOrderErrForm = SrchOrderErrForm.initData();
  }

  /// HTTPレスポンスデータを反映する
  fromJson(String resData) {
    Map<String,dynamic> _resDataMap =
              jsonDecode(resData);
    //入出力データ用
    if (_resDataMap["resForm"]==null) {
      sortItemName = "";
      sortOrder = "";
      updMode = "";
    } else {
      sortItemName = _resDataMap["resForm"]["sortItemName"] ?? "";
      sortOrder = _resDataMap["resForm"]["sortOrder"] ?? "";
      updMode = _resDataMap["resForm"]["updMode"] ?? "";
    }
    // プロパティ エラーメッセージ
    srchOrderErrForm.fromJson(resData);
  }

  /// HTTPレスポンスデータを作成する
  Map<String,dynamic> toJsonMap (String _mode, String _csrf, [int page=0]) {
    Map<String,dynamic> rtnMap = {
      'sortItemName': sortItemName,
      'sortOrder': sortOrder,
      'updMode': updMode,
    };
    return rtnMap;
  }

  /// 入出力データを、TextFormFieldに設定する
  forSrchOrderFormController(
      TextEditingController sortItemNameController,
      TextEditingController sortOrderController,
      TextEditingController updModeController,
      ) {
    sortItemNameController.text = sortItemName;
    sortOrderController.text = sortOrder;
    updModeController.text = updMode;
  }

  /// TextFormField値を、入出力データに設定する
  fromSrchOrderFormController(
      TextEditingController sortItemNameController,
      TextEditingController sortOrderController,
      TextEditingController updModeController,
      ) {
    sortItemName = sortItemNameController.text;
    sortOrder = sortOrderController.text;
    updMode = updModeController.text;
  }
}

■修正後のsrch_order_err_form.dart

import 'dart:convert';

/// ユーザー情報画面プロパティ エラーメッセージ用Form
class SrchOrderErrForm {
  //プロパティ エラーメッセージ用
  late List<String> sortItemNameErr;
  late List<String> sortOrderErr;
  late List<String> updModeErr;

  /// コンストラクタ
  // Dartでは「コンストラクタ名.任意名称」で複数のコンストラクタを定義する
  // 「クラス名(this.name,・・・);」コンストラクタはいらないので,
  // これだけにする。
  // 初期値のクラスを作成している
  SrchOrderErrForm.initData()  {
    //エラーメッセージ用
    sortItemNameErr = <String>[];
    sortOrderErr = <String>[];
    updModeErr = <String>[];
  }

  /// HTTPレスポンスデータを反映する
  fromJson(String resData) {
    Map<String,dynamic> _resDataMap =
              jsonDecode(resData);
    //エラーメッセージ用
    if (_resDataMap["resErrorData"]==null) {
      sortItemNameErr = <String>[];
      sortOrderErr = <String>[];
      updModeErr = <String>[];
    } else {
      sortItemNameErr = _resDataMap["resErrorData"]["sortItemName"]!=null?_resDataMap["resErrorData"]["sortItemName"].cast<String>():<String>[];
      sortOrderErr = _resDataMap["resErrorData"]["sortOrder"]!=null?_resDataMap["resErrorData"]["sortOrder"].cast<String>():<String>[];
      updModeErr = _resDataMap["resErrorData"]["updMode"]!=null?_resDataMap["resErrorData"]["updMode"].cast<String>():<String>[];
    }
  }
}

②上記のつづき。
 フロントFlutter側のsrch_order_form_in_msg_form.dartも同じように、SrchOrderForm(SrchOrderErrFormを包含する)、MessageFormを包含するように修正する。
■修正後のsrch_order_form_in_msg_form.dart

import 'dart:convert';
import 'package:flutter_app/form/comm/message_form.dart';
import 'package:flutter_app/form/comm/srch_order_form.dart';

/// 共通・検索ソート順Form。(MessageFormクラスを包含している)
class SrchOrderFormInMsgForm {
  // 共通・検索ソート順Form
  late SrchOrderForm srchOrderForm; // 共通・検索ソート順Form
  // 共通・メッセージ
  late MessageForm messageForm; // 共通・メッセージ

  /// コンストラクタ
  // Dartでは「コンストラクタ名.任意名称」で複数のコンストラクタを定義する
  // 「クラス名(this.sortItemName,・・・);」コンストラクタはいらないので,
  // これだけにする。
  // 初期値のクラスを作成している
  SrchOrderFormInMsgForm.initData()  {
    // 共通・検索ソート順Form
    srchOrderForm = SrchOrderForm.initData();
    // 共通・メッセージ
    messageForm = MessageForm.initData();
  }

  /// HTTPレスポンスデータを反映する
  fromJson(String resData) {
    // 共通・検索ソート順Form
    srchOrderForm.fromJson(resData);
    // 共通・メッセージ
    messageForm.fromJson(resData);
  }

  /// HTTPレスポンスデータを作成する
  Map<String,dynamic> toJsonMap (String _mode, String _csrf, [int page=0]) {
    Map<String,dynamic> rtnMap = {
      'srchOrderForm': srchOrderForm.toJsonMap(_mode, _csrf, page),
      'formComm': messageForm.toJsonMap(_mode, _csrf, page),
    };
    return rtnMap;
  }

  /// http.postのbodyで使用するJsonデータを返却する
  String toJson(String _mode, String _csrf, [int page=1]) {
    return json.encode(toJsonMap(_mode, _csrf, page));
  }
}

■2022/06/15に、勉強した成果:『Flutter_JavaSpringプログラム自動作成◎自動生成ツール』をVectorに載せました。Zenn本も書きました。使ってみての感想や間違いの指定や、こうやったほうがいいとかの情報があればメールください。
Vector
www.vector.co.jp
・Zenn本(Flutter_JavaSpringプログラム自動作成)
zenn.dev