更新默认本地语言

This commit is contained in:
wyf
2025-08-11 14:55:09 +08:00
parent 50e1ebea20
commit da6da14d6a
16 changed files with 1468 additions and 1290 deletions

View File

@@ -1,10 +1,10 @@
class ServiceConstant {
// static const String baseHost = "zhmht.swes.com.cn:27021"; //服务地址 眠花糖测试地址
static const String baseHost = "zhmht.swes.com.cn:27020"; //服务地址 眠花糖正式地址
// static const String baseHost = "vsbs-test.he-info.cn"; //服务地址 本地测试地址
// static const String baseHost = "zhmht.swes.com.cn:27020"; //服务地址 眠花糖正式地址
static const String baseHost = "vsbs-test.he-info.cn"; //服务地址 本地测试地址
// static const String baseHost = "vsbst-api.he-info.cn";//服务地址
// static const String service_address = "http://$baseHost";
static const String service_address = "https://$baseHost";
static const String service_address = "http://$baseHost";
// static const String service_address = "https://$baseHost";
static String server_service = "/vsbs_app_server"; //服务名称

View File

@@ -17,42 +17,6 @@ class SleepdateWidget extends StatelessWidget {
this.highlightColor = Colors.black, // 默认值黑色
});
@override
// Widget build(BuildContext context) {
// return ClickableContainer(
// onTap: onTap,
// backgroundColor: Colors.transparent,
// highlightColor: Colors.transparent,
// padding: EdgeInsets.all(4.rpx),
// child: Container(
// width: 90.rpx,
// height: 90.rpx,
// decoration: BoxDecoration(
// borderRadius: BorderRadius.circular(30.rpx),
// color: isSelected ? highlightColor : Colors.transparent, // 使用传入的颜色
// ),
// child: Padding(
// padding:
// EdgeInsetsDirectional.fromSTEB(10.rpx, 10.rpx, 10.rpx, 10.rpx),
// child: Container(
// decoration: BoxDecoration(
// color: Color(0xFF757575),
// shape: BoxShape.circle,
// ),
// alignment: Alignment.center,
// child: Text(
// '${date.day}',
// style: TextStyle(
// color: Colors.white,
// fontSize: 26.rpx,
// letterSpacing: 0.0,
// ),
// ),
// ),
// ),
// ),
// );
// }
@override
Widget build(BuildContext context) {
Color? fillColor;

View File

@@ -6,7 +6,6 @@ import 'package:ef/ef.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:vbvs_app/common/color/ServiceConstant.dart';
import 'package:vbvs_app/common/color/app_uri_status.dart';
import 'package:vbvs_app/controller/mh_controller/mh_language_controller.dart';
import 'package:vbvs_app/controller/setting/language/language_controller.dart';
import 'package:vbvs_app/model/api_response.dart';
@@ -40,7 +39,7 @@ class DeviceTypeController extends GetControllerEx<DeviceTypeModel> {
attr = GetModel(DeviceTypeModel()).obs;
}
RxList deviceTypeList = [].obs;
MHLanguageController languageController = Get.find();
LanguageController languageController = Get.find();
Future<ApiResponse> getDeviceType() async {
ApiResponse apiResponse = ApiResponse(code: -1, msg: "请求失败".tr);

View File

@@ -181,6 +181,10 @@ class MessageController extends GetControllerEx<MessageModel> {
queryUrl += "?lang=$language";
}
}
if (type != null) {
queryUrl = "$queryUrl&type=$type";
}
queryUrl = "$queryUrl&mid=ALL";
var response = await EasyDartModule.dio.post(queryUrl);
if (response != null) {

View File

@@ -5,6 +5,8 @@ import 'package:ef/ef.dart';
import 'package:flutter/services.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:path/path.dart' as path;
import 'package:vbvs_app/common/color/appConstants.dart';
import 'package:vbvs_app/enum/APPPackageType.dart';
import 'package:vbvs_app/language/AppLanguage.dart';
part 'mh_language_controller.g.dart'; // 由json_serializable自动生成的部分
@@ -47,10 +49,25 @@ class MHLanguageController extends GetControllerEx<MHLanguageModel> {
final Map<String, dynamic> manifestMap = json.decode(manifestContent);
// 筛选出 langs 目录下的 .json 文件
final langFiles = manifestMap.keys
.where((String key) =>
key.startsWith('assets/mhlangs/') && key.endsWith('.json'))
.toList();
int code = AppConstants().ent_type;
final langFiles;
if (APPPackageType.TH.code == code) {
langFiles = manifestMap.keys
.where((String key) =>
key.startsWith('assets/langs/') && key.endsWith('.json'))
.toList();
} else if (APPPackageType.MHT.code == code) {
langFiles = manifestMap.keys
.where((String key) =>
key.startsWith('assets/mhlangs/') && key.endsWith('.json'))
.toList();
} else {
langFiles = manifestMap.keys
.where((String key) =>
key.startsWith('assets/langs/') && key.endsWith('.json'))
.toList();
}
// 2. 遍历所有语言文件
for (final filePath in langFiles) {

View File

@@ -6,6 +6,7 @@ import 'package:get_storage/get_storage.dart';
import 'package:img_picker/img_picker.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:vbvs_app/common/color/ServiceConstant.dart';
import 'package:vbvs_app/common/color/appConstants.dart';
import 'package:vbvs_app/common/color/app_uri_status.dart';
import 'package:vbvs_app/common/util/DailyLogUtils.dart';
import 'package:vbvs_app/common/util/MyUtils.dart';
@@ -14,6 +15,7 @@ import 'package:vbvs_app/controller/home/home_controller.dart';
import 'package:vbvs_app/controller/login/login_controller.dart';
import 'package:vbvs_app/controller/message/message_controller.dart';
import 'package:vbvs_app/controller/time/countdown_controller.dart';
import 'package:vbvs_app/enum/APPPackageType.dart';
import 'package:vbvs_app/model/api_response.dart';
import 'package:vbvs_app/model/user_data.dart';
import 'package:vbvs_app/pages/mh_page/homepage/controller/mht_home_controller.dart';
@@ -225,7 +227,11 @@ class UserInfoController extends GetControllerEx<UserInfoModel> {
}
ApiResponse logOut() {
MHTHomeController mhtHomeController = Get.find();
int code = AppConstants().ent_type;
if (APPPackageType.MHT.code == code) {
MHTHomeController mhtHomeController = Get.find();
mhtHomeController.personnelList.value = [];
}
ApiResponse apiResponse = ApiResponse(code: 1, msg: "退出成功".tr);
EasyDartModule.logger.info("退出登录");
DailyLogUtils.writeLog("退出登录");
@@ -246,10 +252,10 @@ class UserInfoController extends GetControllerEx<UserInfoModel> {
messageController.model.system_message_read = 0;
CountdownController countdownController = Get.find();
countdownController.countdown.value = 0;
mhtHomeController.personnelList.value = [];
return apiResponse;
}
ApiResponse deleteAccount() {
ApiResponse deleteAccount() {
MHTHomeController mhtHomeController = Get.find();
ApiResponse apiResponse = ApiResponse(code: 1, msg: "注销成功".tr);
EasyDartModule.logger.info("注销账号");
@@ -273,7 +279,7 @@ class UserInfoController extends GetControllerEx<UserInfoModel> {
CountdownController countdownController = Get.find();
countdownController.countdown.value = 0;
mhtHomeController.personnelList.value = [];
return apiResponse;
}
}

View File

@@ -91,7 +91,7 @@ Future<void> main() async {
final Locale? deviceLocale = Get.deviceLocale;
print('系统语言: ${deviceLocale?.languageCode}');
await loadLanguageSetting();
await loadLanguageSetting(deviceLocale?.languageCode);
await initLanguageSetting();
WidgetsFlutterBinding.ensureInitialized();
@@ -121,12 +121,37 @@ Future<void> main() async {
});
}
loadLanguageSetting() async {
await ef.kvdb.openDir("mht");
String? language = await ef.kvdb.read("mht/language");
// languageCode 系统默认语言码 en/zh
loadLanguageSetting(String? languageCode) async {
int code = AppConstants().ent_type;
String? language;
language ??= 'zh_CN';
await AppLanguage().loadLanguage(language, project: APPPackageType.MHT.code);
if (APPPackageType.MHT.code == code) {
await ef.kvdb.openDir("mht");
language = await ef.kvdb.read("mht/language");
} else if (APPPackageType.TH.code == code) {
await ef.kvdb.openDir("th");
language = await ef.kvdb.read("th/language");
} else {
await ef.kvdb.openDir("th");
language = await ef.kvdb.read("th/language");
}
// 如果 kvdb 没有存储
if (language == null || language.isEmpty) {
if (languageCode == null || languageCode.isEmpty) {
language = 'en_US'; // 系统默认为空时用 en_US
} else {
language = (languageCode.toLowerCase() == 'zh') ? 'zh_CN' : 'en_US';
}
}
await AppLanguage().loadLanguage(
language,
project: (APPPackageType.MHT.code == code)
? APPPackageType.MHT.code
: APPPackageType.TH.code,
);
}
void initwebService() {

View File

@@ -1,5 +1,6 @@
import 'package:EasyDartModule/EasyDartModule.dart' as edm;
import 'package:ef/ef.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutterflow_ui/flutterflow_ui.dart';
import 'package:fluwx/fluwx.dart';
@@ -19,6 +20,8 @@ import 'package:vbvs_app/controller/theme_controller/ThemeController.dart';
import 'package:vbvs_app/controller/time/countdown_controller.dart';
import 'package:vbvs_app/controller/user_info_controller.dart';
import 'package:vbvs_app/model/api_response.dart';
import 'package:vbvs_app/pages/user/privacy_scheme_page.dart';
import 'package:vbvs_app/pages/user/user_scheme_page.dart';
class OtherLoginPage extends StatefulWidget {
const OtherLoginPage({super.key});
@@ -34,10 +37,32 @@ class _OtherLoginPageState extends State<OtherLoginPage> {
CountdownController countdownController = Get.find();
LoginController loginController = Get.find();
late TapGestureRecognizer _tapRecognizer2;
late TapGestureRecognizer _tapRecognizer4;
@override
void dispose() {
_tapRecognizer2.dispose();
_tapRecognizer4.dispose();
super.dispose();
}
@override
void initState() {
// TODO: implement initState
super.initState();
_tapRecognizer2 = TapGestureRecognizer()
..onTap = () {
// 协议2点击事件逻辑
print('点击了协议2');
// Get.to(() => UserSchemePage());
Get.toNamed("/userSchemePage");
};
_tapRecognizer4 = TapGestureRecognizer()
..onTap = () {
// 协议4点击事件逻辑
print('点击了协议4');
Get.toNamed("/privacyPage");
};
super.initState();
LoginController loginController = Get.find();
Fluwx fluwx = loginController.fluwx;
@@ -668,6 +693,86 @@ class _OtherLoginPageState extends State<OtherLoginPage> {
checkColor: Colors.white,
),
)),
// Expanded(
// child: Padding(
// padding: EdgeInsetsDirectional.fromSTEB(
// 0.rpx, 10.rpx, 0.rpx, 0.rpx),
// child: Container(
// width: bodysize.maxWidth,
// constraints: BoxConstraints(
// minWidth: 500.rpx,
// minHeight: 90.rpx,
// ),
// child: RichText(
// text: TextSpan(
// children: [
// TextSpan(
// text: '登录页.协议1'.tr,
// style: TextStyle(
// fontFamily: 'Inter',
// letterSpacing: 0.0,
// fontSize: 20.rpx,
// color: themeController
// .currentColor.sc3,
// ),
// ),
// TextSpan(
// text: '登录页.协议2'.tr,
// style: TextStyle(
// fontFamily: 'Inter',
// letterSpacing: 0.0,
// fontSize: 20.rpx,
// color:
// stringToColor("#FF9F66"),
// ),
// ),
// TextSpan(
// text: '登录页.协议3'.tr,
// style: TextStyle(
// fontFamily: 'Inter',
// letterSpacing: 0.0,
// fontSize: 20.rpx,
// color: themeController
// .currentColor.sc3,
// ),
// ),
// TextSpan(
// text: '登录页.协议4'.tr,
// style: TextStyle(
// fontFamily: 'Inter',
// letterSpacing: 0.0,
// fontSize: 20.rpx,
// color:
// stringToColor("#FF9F66"),
// ),
// ),
// TextSpan(
// text: '登录页.协议5'.tr,
// style: TextStyle(
// fontFamily: 'Inter',
// letterSpacing: 0.0,
// fontSize: 20.rpx,
// color: themeController
// .currentColor.sc3,
// ),
// ),
// TextSpan(
// text: '登录页.协议6'.tr,
// style: TextStyle(
// fontFamily: 'Inter',
// letterSpacing: 0.0,
// fontSize: 20.rpx,
// color:
// stringToColor("#FF9F66"),
// ),
// ),
// ],
// ),
// ),
// ),
// ),
// ),
Expanded(
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(
@@ -700,6 +805,7 @@ class _OtherLoginPageState extends State<OtherLoginPage> {
color:
stringToColor("#FF9F66"),
),
recognizer: _tapRecognizer2,
),
TextSpan(
text: '登录页.协议3'.tr,
@@ -720,27 +826,28 @@ class _OtherLoginPageState extends State<OtherLoginPage> {
color:
stringToColor("#FF9F66"),
),
recognizer: _tapRecognizer4,
),
TextSpan(
text: '登录页.协议5'.tr,
style: TextStyle(
fontFamily: 'Inter',
letterSpacing: 0.0,
fontSize: 20.rpx,
color: themeController
.currentColor.sc3,
),
),
TextSpan(
text: '登录页.协议6'.tr,
style: TextStyle(
fontFamily: 'Inter',
letterSpacing: 0.0,
fontSize: 20.rpx,
color:
stringToColor("#FF9F66"),
),
),
// TextSpan(
// text: '登录页.协议5'.tr,
// style: TextStyle(
// fontFamily: 'Inter',
// letterSpacing: 0.0,
// fontSize: 20.rpx,
// color: themeController
// .currentColor.sc3,
// ),
// ),
// TextSpan(
// text: '登录页.协议6'.tr,
// style: TextStyle(
// fontFamily: 'Inter',
// letterSpacing: 0.0,
// fontSize: 20.rpx,
// color:
// stringToColor("#FF9F66"),
// ),
// ),
],
),
),

View File

@@ -7,6 +7,7 @@ import 'package:vbvs_app/component/tool/ClickableContainer.dart';
import 'package:vbvs_app/component/tool/TopSlideNotification.dart';
import 'package:vbvs_app/controller/main_bottom/global_controller.dart';
import 'package:vbvs_app/controller/user_info_controller.dart';
import 'package:vbvs_app/enum/LoginStatus.dart';
class EPage extends StatefulWidget {
const EPage({super.key});
@@ -69,7 +70,17 @@ class _EPageState extends State<EPage> {
highlightColor: Colors.transparent,
padding: EdgeInsets.all(0.rpx),
onTap: () {
TopSlideNotification.show(context, text: "待开发功能".tr);
UserInfoController userInfoController = Get.find();
bool isLoggedIn =
userInfoController.model.login == LoginStatus.LOGIN.code;
if (!isLoggedIn) {
TopSlideNotification.show(context,
text: "必须登录提示".tr,
textColor: themeController.currentColor.sc9);
Get.toNamed("/otherLoginPage");
} else {
TopSlideNotification.show(context, text: "待开发功能".tr);
}
},
child: Container(
// child: widget.webView,

View File

@@ -995,86 +995,80 @@ class _HomePageState extends State<HomePage> {
}
return Expanded(
child: SingleChildScrollView(child:
Column(
children: [
SizedBox(height: 26.rpx), // 第一个上方间距
...List.generate(deviceList.length, (i) {
String mac = macList[i];
List<dynamic> dailyDataList =
reportData[mac]!;
Map? targetDevice =
deviceList.firstWhereOrNull(
(device) => device['mac'] == mac,
);
List stateModule = [];
String currentTime = "";
String goalMac = targetDevice?['mac'];
var person = targetDevice?['person'];
child: SingleChildScrollView(
child: Column(
children: [
SizedBox(height: 26.rpx), // 第一个上方间距
...List.generate(deviceList.length, (i) {
String mac = macList[i];
List<dynamic> dailyDataList = reportData[mac]!;
Map? targetDevice = deviceList.firstWhereOrNull(
(device) => device['mac'] == mac,
);
List stateModule = [];
String currentTime = "";
String goalMac = targetDevice?['mac'];
var person = targetDevice?['person'];
return Column(
children: [
DynamicReportDetailWidget(
key: ValueKey(
'${targetDevice!['mac']}_${homeController.model.type}'),
targetDevice: targetDevice!,
sleepDateWidgets: List.generate(
dailyDataList.length, (j) {
var dayData = dailyDataList[j];
DateTime date = DateTime
.fromMillisecondsSinceEpoch(
dayData['time'] is String
? int.parse(dayData['time'])
: dayData['time'],
);
if (dayData['selected'] == true &&
dayData['state'] != null) {
stateModule = dayData['state'];
currentTime = dayData['time'];
}
return SleepDateWidget(
mac: mac,
time: dayData['time'],
date: date,
score: dayData['score']?['socre']
?.toString() ??
'',
comment: dayData['score']?['name'],
textColor: dayData['score']
?['color'] ==
null
? null
: stringToColor(
dayData['score']?['color']),
isSelected: dayData['selected'],
);
}),
sleepDataModuleWidgets: stateModule
.isNotEmpty
? List.generate(stateModule.length,
(j) {
stateModule[j]['onto'] = true;
stateModule[j]['time'] =
currentTime;
stateModule[j]['mac'] = goalMac;
stateModule[j]['person'] =
person;
return SleepDataModuleWidget(
data: stateModule[j]);
})
: [],
),
SizedBox(
height:
26.rpx), // 每个 widget 下方间距(包括最后一个)
],
);
}),
],
)
),
return Column(
children: [
DynamicReportDetailWidget(
key: ValueKey(
'${targetDevice!['mac']}_${homeController.model.type}'),
targetDevice: targetDevice!,
sleepDateWidgets: List.generate(
dailyDataList.length, (j) {
var dayData = dailyDataList[j];
DateTime date =
DateTime.fromMillisecondsSinceEpoch(
dayData['time'] is String
? int.parse(dayData['time'])
: dayData['time'],
);
if (dayData['selected'] == true &&
dayData['state'] != null) {
stateModule = dayData['state'];
currentTime = dayData['time'];
}
return SleepDateWidget(
mac: mac,
time: dayData['time'],
date: date,
score: dayData['score']?['socre']
?.toString() ??
'',
comment: dayData['score']?['name'],
textColor: dayData['score']
?['color'] ==
null
? null
: stringToColor(
dayData['score']?['color']),
isSelected: dayData['selected'],
);
}),
sleepDataModuleWidgets: stateModule
.isNotEmpty
? List.generate(stateModule.length,
(j) {
stateModule[j]['onto'] = true;
stateModule[j]['time'] =
currentTime;
stateModule[j]['mac'] = goalMac;
stateModule[j]['person'] = person;
return SleepDataModuleWidget(
data: stateModule[j]);
})
: [],
),
SizedBox(
height:
26.rpx), // 每个 widget 下方间距(包括最后一个)
],
);
}),
],
)),
);
}),
],

View File

@@ -141,7 +141,8 @@ class MainPageBottomChange extends GetView<MainPageController> {
bool isLoggedIn = userInfoController.model.login ==
LoginStatus.LOGIN.code;
if ((index == 1 || index == 2) && !isLoggedIn) {
// if ((index == 1 || index == 2) && !isLoggedIn) {
if ((index == 2) && !isLoggedIn) {
TopSlideNotification.show(
context,
text: "必须登录提示".tr,

View File

@@ -6,7 +6,6 @@ import 'package:vbvs_app/common/util/FitTool.dart';
import 'package:vbvs_app/common/util/MyUtils.dart';
import 'package:vbvs_app/component/tool/ClickableContainer.dart';
import 'package:vbvs_app/component/tool/CustomCard.dart';
import 'package:vbvs_app/controller/mh_controller/mh_language_controller.dart';
import 'package:vbvs_app/controller/setting/language/language_controller.dart';
import 'package:vbvs_app/language/AppLanguage.dart';
import 'package:vbvs_app/pages/device_bind/componnet/FancyCircleCheckbox.dart';
@@ -19,7 +18,7 @@ class LanguageSetting extends StatefulWidget {
}
class _LanguageSettingState extends State<LanguageSetting> {
MHLanguageController languageController = Get.find();
LanguageController languageController = Get.find();
@override
void initState() {
// languageController.initLanuageList();
@@ -129,6 +128,15 @@ class _LanguageSettingState extends State<LanguageSetting> {
.language_code); // 加载语言
languageController
.updateAll(); // 更新操作
try {
// ef.kv.set("language",
// language.language_code);
await ef.kvdb.write(
"th/language",
language.language_code);
} catch (e) {
print(e);
}
},
child: Row(
mainAxisSize: MainAxisSize.max,

View File

@@ -57,11 +57,11 @@ var routes = {
// "/loginPage": (contxt) => LoginPage(),
// "/otherLoginPage": (contxt) => OtherLoginPage(),
"/loginPage": (contxt) => OtherLoginPage(),
// "/otherLoginPage": (contxt) => OtherLoginPage(),
"/otherLoginPage": (contxt) => OtherLoginPage(),
"/deviceType": (contxt, {arguments}) => DeviceTypePage(),
"/blueteethDevice": (contxt) => BlueteethDevicePage(),
"/personPage": (contxt) => PersonPage(),
"/bindDeviceSuccess": (contxt) => BindDeviceSuccess(),
"/bindDeviceSuccess": (contxt) => BindDeviceSuccess(),
"/wifiPage": (contxt, {arguments}) => WifiPage(type: arguments),
"/wifiPagePerson": (contxt, {arguments}) => WifiPagePerson(type: arguments),
"/updateUserPage": (contxt) => UpdateUserPage(),
@@ -119,7 +119,9 @@ var onGenerateRoute = (RouteSettings settings) {
// 如果用户未登录且访问的不是登录页面等,展示提示并重定向
if (settings.name != "/loginPage" &&
settings.name != "/otherLoginPage" &&
settings.name != "/mianPageBottomChange") {
settings.name != "/mianPageBottomChange" &&
settings.name != "/userSchemePage" &&
settings.name != "/privacyPage") {
TopSlideNotification.show(
Get.context!,
text: "必须登录提示".tr,