From aea52e482ec7005c933fa6ffdc1c579195f36d21 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Thu, 29 Jan 2026 16:02:41 +0800 Subject: [PATCH] =?UTF-8?q?feat:app=E7=89=88=E6=9C=AC=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 20 +---- lib/common/api/app_api.dart | 15 ++++ lib/common/models/api/app_api_models.dart | 73 ++++++++++++++++++ lib/common/models/api/app_api_models.g.dart | 57 ++++++++++++++ lib/common/models/index.dart | 3 +- .../models/page/setting_page_enum_models.dart | 1 + lib/common/values/constants.dart | 4 +- lib/pages/setting/controller.dart | 5 ++ lib/pages/setting/view.dart | 5 ++ lib/pages/setting/widgets/index.dart | 1 + .../widgets/setting-version-setting.dart | 75 +++++++++++++++++++ 11 files changed, 240 insertions(+), 19 deletions(-) create mode 100644 lib/common/api/app_api.dart create mode 100644 lib/common/models/api/app_api_models.dart create mode 100644 lib/common/models/api/app_api_models.g.dart create mode 100644 lib/pages/setting/widgets/setting-version-setting.dart diff --git a/README.md b/README.md index 01c5075..436c279 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,4 @@ -# pj_supermarket_cloud - -A new Flutter project. - -## Getting Started - -This project is a starting point for a Flutter application. - -A few resources to get you started if this is your first Flutter project: - -- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) -- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) - -For help getting started with Flutter development, view the -[online documentation](https://docs.flutter.dev/), which offers tutorials, -samples, guidance on mobile development, and a full API reference. +## 生成代码命令 +``` +flutter pub run build_runner build --delete-conflicting-outputs~ +``` diff --git a/lib/common/api/app_api.dart b/lib/common/api/app_api.dart new file mode 100644 index 0000000..b7f6791 --- /dev/null +++ b/lib/common/api/app_api.dart @@ -0,0 +1,15 @@ +import 'package:pj_supermarket_cloud/common/index.dart'; + +abstract class AppApi { + /// 获取所有版本列表 + static Future openCardList( + dynamic pa, + ) async { + final res = await HttpManage().dio.get( + "/integrated/app-version/ad/page", + queryParameters: pa, + ); + if (res.data == null) return null; + return ServiceAppVersionPage.fromJson(res.data); + } +} diff --git a/lib/common/models/api/app_api_models.dart b/lib/common/models/api/app_api_models.dart new file mode 100644 index 0000000..5581d12 --- /dev/null +++ b/lib/common/models/api/app_api_models.dart @@ -0,0 +1,73 @@ +import 'package:json_annotation/json_annotation.dart'; +import 'package:pj_supermarket_cloud/common/index.dart'; + +part 'app_api_models.g.dart'; + +@JsonSerializable() +class ServiceAppVersion { + /// 唯一标识符 + final String? id; + + /// app唯一编码 + final String? appUniqueCode; + + /// 平台 + final String? platform; + + /// 内部版本号 + final int? versionCode; + + /// 版本名称 + final String? versionName; + + /// 更新内容/更新日志 + final String? updateContent; + + /// 安装包下载地址(wgt、apk) + final String? downloadUrl; + + /// 是否强制更新 + @JsonKey(fromJson: JsonTool.stringToBoolean, toJson: JsonTool.booleanToString) + final bool? isForce; + + /// 是否静默更新(WGT用) + @JsonKey(fromJson: JsonTool.stringToBoolean, toJson: JsonTool.booleanToString) + final bool? isSilent; + + /// 状态(已发布、未发布、已下架) + final String? status; + + ServiceAppVersion({ + this.id, + this.appUniqueCode, + this.platform, + this.versionCode, + this.versionName, + this.updateContent, + this.downloadUrl, + this.isForce, + this.isSilent, + this.status, + }); + + factory ServiceAppVersion.fromJson(Map json) => + _$ServiceAppVersionFromJson(json); + + Map toJson() => _$ServiceAppVersionToJson(this); +} + +@JsonSerializable() +class ServiceAppVersionPage extends ServicePageBase { + List? records; + + ServiceAppVersionPage({ + this.records, + }); + + factory ServiceAppVersionPage.fromJson(Map json) => + _$ServiceAppVersionPageFromJson( + json, + ); + + Map toJson() => _$ServiceAppVersionPageToJson(this); +} diff --git a/lib/common/models/api/app_api_models.g.dart b/lib/common/models/api/app_api_models.g.dart new file mode 100644 index 0000000..8ac7148 --- /dev/null +++ b/lib/common/models/api/app_api_models.g.dart @@ -0,0 +1,57 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'app_api_models.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +ServiceAppVersion _$ServiceAppVersionFromJson(Map json) => + ServiceAppVersion( + id: json['id'] as String?, + appUniqueCode: json['appUniqueCode'] as String?, + platform: json['platform'] as String?, + versionCode: (json['versionCode'] as num?)?.toInt(), + versionName: json['versionName'] as String?, + updateContent: json['updateContent'] as String?, + downloadUrl: json['downloadUrl'] as String?, + isForce: JsonTool.stringToBoolean(json['isForce'] as String), + isSilent: JsonTool.stringToBoolean(json['isSilent'] as String), + status: json['status'] as String?, + ); + +Map _$ServiceAppVersionToJson(ServiceAppVersion instance) => + { + 'id': instance.id, + 'appUniqueCode': instance.appUniqueCode, + 'platform': instance.platform, + 'versionCode': instance.versionCode, + 'versionName': instance.versionName, + 'updateContent': instance.updateContent, + 'downloadUrl': instance.downloadUrl, + 'isForce': JsonTool.booleanToString(instance.isForce), + 'isSilent': JsonTool.booleanToString(instance.isSilent), + 'status': instance.status, + }; + +ServiceAppVersionPage _$ServiceAppVersionPageFromJson( + Map json) => + ServiceAppVersionPage( + records: (json['records'] as List?) + ?.map((e) => ServiceAppVersion.fromJson(e as Map)) + .toList(), + ) + ..current = (json['current'] as num).toInt() + ..pages = (json['pages'] as num).toInt() + ..size = (json['size'] as num).toInt() + ..total = (json['total'] as num).toInt(); + +Map _$ServiceAppVersionPageToJson( + ServiceAppVersionPage instance) => + { + 'current': instance.current, + 'pages': instance.pages, + 'size': instance.size, + 'total': instance.total, + 'records': instance.records, + }; diff --git a/lib/common/models/index.dart b/lib/common/models/index.dart index d52cc10..8f9da8b 100644 --- a/lib/common/models/index.dart +++ b/lib/common/models/index.dart @@ -1,7 +1,8 @@ library; +export './api/app_api_models.dart'; export './api/base_api_models.dart'; -export 'api/product_api_models.dart'; +export './api/product_api_models.dart'; export './api/hard_api_models.dart'; export './api/user_api_models.dart'; export './api/wallet_api_models.dart'; diff --git a/lib/common/models/page/setting_page_enum_models.dart b/lib/common/models/page/setting_page_enum_models.dart index 529231f..aabb5f5 100644 --- a/lib/common/models/page/setting_page_enum_models.dart +++ b/lib/common/models/page/setting_page_enum_models.dart @@ -9,6 +9,7 @@ enum SettingMenuType implements BaseEnum { backup("40", "资源备份"), faceSetting("50", "支付设置"), productSetting("60", "资源备份"), + versionSetting("70", "版本管理"), ; @override diff --git a/lib/common/values/constants.dart b/lib/common/values/constants.dart index 8f43be7..ff13db9 100644 --- a/lib/common/values/constants.dart +++ b/lib/common/values/constants.dart @@ -10,9 +10,9 @@ class Constants { static const pwdEncKey = 'pigxpigxpigxpigx'; /// 服务 url 线上 - static const apiUrl = 'https://stgl.pj.gov.cn/api'; + // static const apiUrl = 'https://stgl.pj.gov.cn/api'; - // static const apiUrl = 'http://192.168.101.196:9999'; + static const apiUrl = 'http://192.168.101.104:9999'; /// 静态资源 url static const ossUrl = apiUrl; diff --git a/lib/pages/setting/controller.dart b/lib/pages/setting/controller.dart index 5ece8c0..65fd82f 100644 --- a/lib/pages/setting/controller.dart +++ b/lib/pages/setting/controller.dart @@ -64,6 +64,11 @@ class SettingController extends GetxController { title: "商品管理", type: SettingMenuType.productSetting, ), + SettingMenu( + prefixIcon: FAssets.icons.rocket, + title: "版本管理", + type: SettingMenuType.versionSetting, + ), ].obs; Rx cuurentMenuType = SettingMenuType.baseInfo.obs; diff --git a/lib/pages/setting/view.dart b/lib/pages/setting/view.dart index 728b344..ef0f679 100644 --- a/lib/pages/setting/view.dart +++ b/lib/pages/setting/view.dart @@ -118,6 +118,11 @@ class SettingPage extends GetView { return const SizedBox.shrink(); } return settingProduct(context); + case SettingMenuType.versionSetting: + if (!isBand) { + return const SizedBox.shrink(); + } + return settingVersionSetting(context); } }, ); diff --git a/lib/pages/setting/widgets/index.dart b/lib/pages/setting/widgets/index.dart index d631498..79e4037 100644 --- a/lib/pages/setting/widgets/index.dart +++ b/lib/pages/setting/widgets/index.dart @@ -6,3 +6,4 @@ export './setting_face.dart'; export './setting_pay.dart'; export './setting_product.dart'; export './setting_sync.dart'; +export './setting-version-setting.dart'; diff --git a/lib/pages/setting/widgets/setting-version-setting.dart b/lib/pages/setting/widgets/setting-version-setting.dart new file mode 100644 index 0000000..d8b14e8 --- /dev/null +++ b/lib/pages/setting/widgets/setting-version-setting.dart @@ -0,0 +1,75 @@ +import 'package:ducafe_ui_core/ducafe_ui_core.dart'; + +import 'package:flutter/material.dart'; +import 'package:flutter_easyloading/flutter_easyloading.dart'; +import 'package:get/get.dart'; +import 'package:pj_supermarket_cloud/common/index.dart'; + +class VersionManageController extends GetxController { + static const String _tag = "版本管理 Controller"; + + final appC = Get.find(); + + RxInt currentPage = RxInt(1); + + RxInt totalPage = RxInt(0); + + RxInt pageSize = RxInt(15); + + /// 搜索 + Future doPage({int? page}) async { + if (page != null) currentPage.value = page; + await getVersionList(isLoading: true); + } + + /// 获取版本列表 + Future getVersionList({bool isLoading = false}) async { + if (isLoading) { + EasyLoading.show( + status: '查询中...', + maskType: EasyLoadingMaskType.black, + ); + } + try {} finally { + if (isLoading) { + Future.delayed(const Duration(seconds: 1), () { + EasyLoading.dismiss(); + }); + } + } + } +} + +Widget settingVersionSetting(BuildContext context) { + final versionC = Get.put( + VersionManageController(), + ); + return [ + buildSettingVersionSettingSearch(context), + buildSettingVersionSettingList(context).expanded(), + Obx( + () => appPage( + context, + pageNo: versionC.currentPage.value, + pageSize: versionC.pageSize.value, + total: versionC.totalPage.value, + onPageChanged: (pageNo) => versionC.doPage(page: pageNo), + ), + ) + ].toColumn(); +} + +// 版本更新搜索区域 +Widget buildSettingVersionSettingSearch(BuildContext context) { + return Container(); +} + +// 版本更新列表区域 +Widget buildSettingVersionSettingList(BuildContext context) { + return Container(); +} + +// 版本管理卡片 +Widget buildSettingVersionSettingCard(BuildContext context) { + return Container(); +}