feat: 更新代码仓库全部修改
Build Android APK / 编译 libcore.aar (push) Has been cancelled
Build Android APK / 编译 Android APK (release) (push) Has been cancelled
Build Android APK / 创建 GitHub Release (push) Has been cancelled
Build Multi-Platform / 编译 libcore (Android) (push) Has been cancelled
Build Multi-Platform / 编译 libcore (Windows) (push) Has been cancelled
Build Multi-Platform / 编译 libcore (macOS) (push) Has been cancelled
Build Multi-Platform / 编译 libcore (Linux) (push) Has been cancelled
Build Multi-Platform / 构建 Android APK (push) Has been cancelled
Build Multi-Platform / 构建 Windows (push) Has been cancelled
Build Multi-Platform / 构建 macOS (push) Has been cancelled
Build Multi-Platform / 构建 Linux (push) Has been cancelled
Build Multi-Platform / 创建 Release (push) Has been cancelled
Build Windows / build (push) Has been cancelled

This commit is contained in:
2025-10-30 04:47:53 -07:00
parent 145832093e
commit f42a481452
134 changed files with 8032 additions and 4270 deletions
+12
View File
@@ -0,0 +1,12 @@
import 'package:get/get.dart';
import '../controllers/hi_help_controller.dart';
class HIHelpBinding extends Bindings {
@override
void dependencies() {
Get.lazyPut<HIHelpController>(
() => HIHelpController(),
);
}
}
+139
View File
@@ -0,0 +1,139 @@
import 'package:get/get.dart';
import 'package:easy_refresh/easy_refresh.dart';
import '../../../services/api_service/kr_api.user.dart';
import '../../../utils/kr_common_util.dart';
class KRMessage {
final String title;
final List<String> content; // content 是一个字符串列表
KRMessage({required this.title, required this.content});
}
class HIHelpController extends GetxController {
final KRUserApi kr_userApi = KRUserApi();
// 通知列表数据
final RxList<KRMessage> kr_messages = <KRMessage>[
KRMessage(
title: '客户端下载问题',
content: [
'iOS设备下载客户端,需要使用除中国大陆以外的Apple ID[link]点击这里[/link]获取海外Apple ID注册教程。',
'Mac OS设备下载客户端,可以直接前往Hi快VPN官网下载dmg格式文件安装。',
'Android设备下载客户端,可以直接前往Hi快VPN官网下载apk格式文件安装。',
'PC设备下载客户端,可以直接前往Hi快VPN官网下载exe格式文件安装。',
],
),
KRMessage(
title: '套餐支付问题',
content: [
'支付页面无法打开:尝试更换网络,或检查并断开连接其它VPN软件。',
'支付页面无法正确显示:请退出客户端重新进入,如仍无法正确显示,请截图并联系在线客服。',
'支付成功但套餐未正确激活:请退出客户端后五分钟重新进入,如仍未正确激活,请截图您的支付记录,与在线客服联系,核实后会帮您手动激活。',
],
),
KRMessage(
title: '账号问题',
content: [
'每部设备在安装客户端后会自动生成一个账号,购买套餐后可以正常使用,如需登陆其他设备使用,则需要绑定邮箱。更换设备前建议先绑定邮箱。',
'注销账号后会自动清除您已经购买的套餐信息,无法找回,请谨慎对待您的账号。',
'无法收到邮箱验证码:请检查营销邮件箱或垃圾邮件箱。',
],
),
KRMessage(
title: '连接相关问题',
content: [
'无法连接:请检查设备网络是否畅通,如仍无法连接,请退出客户端并重新启动设备。',
'连接后速度慢,无法打开页面:请进入菜单-节点列表,手动切换节点或选择自动匹配最快网络。',
'连接后无法打开本地页面:请进入菜单-节点列表,切换为智能模式即可绕过本地ip,但会暴露您的ip地址。选择全局模式则可以保证您始终处于隐私ip状态。',
],
),
KRMessage(
title: '线路相关问题',
content: [
'Hi快VPN所有线路均为IEPL专线,最大程度保证线路纯净与连接速度。',
'Hi快VPN所有线路均不限流量不限带宽,请放心使用。',
'Hi快VPN所有线路均不保存任何用户网络日志,最大程度保障用户的隐私安全。',
],
),
KRMessage(
title: '设备与绑定问题',
content: [
'在绑定新设备之前请先添加您的邮箱。',
'Hi快VPN支持最多两台设备同时在线,包括一台iOS设备或Android,加一台Mac或PC。',
'如超出设备数量限制,最早登陆的同类设备将会自动下线,需要重新登陆,设备限制为系统固定设定,不支持调整。',
],
),
KRMessage(
title: '邀请用户相关问题',
content: [
'邀请用户请进入菜单-邀请好友页面,点击“我的邀请码”分享链接,直接分享至任意平台。受邀好友在根据流程安装好客户端后,进入菜单-邀请好友页面,贴入邀请码,保存后购买任一套餐,您和好友将会同时获得3天免费使用时长。',
'请务必先行让受邀好友填写邀请码后再购买套餐,否则将无法激活免费时长。',
],
),
KRMessage(
title: '闪连功能相关问题',
content: [
'闪连功能可以为您提供最便捷的VPN使用体验,在设置好您的使用偏好并开启闪连功能后,未来只需要点击打开客户端,软件即自动连接,无需再点击任意按钮。',
'在后台关闭客户端后,连接自动断开。如未在后台关闭,则连接不会断开。如长时间设备锁屏并没有任何操作,连接会自动断开。',
],
),
].obs;
final RxBool kr_isLoading = false.obs;
final RxBool kr_hasMore = true.obs;
int kr_page = 1;
final int kr_size = 10;
final EasyRefreshController refreshController = EasyRefreshController();
@override
void onInit() {
super.onInit();
// 隐藏全局订阅按钮
// kr_getMessageList();
}
// 刷新列表
Future<void> kr_onRefresh() async {
kr_page = 1;
kr_hasMore.value = true;
kr_messages.clear();
await kr_getMessageList();
refreshController.finishRefresh();
}
// 加载更多
Future<void> kr_onLoadMore() async {
if (!kr_hasMore.value || kr_isLoading.value) {
refreshController.finishLoad(IndicatorResult.noMore);
return;
}
kr_page++;
await kr_getMessageList();
refreshController.finishLoad(kr_hasMore.value ? IndicatorResult.success : IndicatorResult.noMore);
}
Future<void> kr_getMessageList() async {
if (kr_isLoading.value) return;
kr_isLoading.value = true;
final either = await kr_userApi.kr_getMessageList(kr_page, kr_size);
either.fold(
(error) {
KRCommonUtil.kr_showToast(error.msg);
if (kr_page > 1) kr_page--;
},
(list) {
},
);
kr_isLoading.value = false;
}
@override
void onClose() {
refreshController.dispose();
super.onClose();
}
}
+89
View File
@@ -0,0 +1,89 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:easy_refresh/easy_refresh.dart';
import 'package:flutter_html/flutter_html.dart';
import 'package:flutter_markdown/flutter_markdown.dart';
import '../../../model/response/kr_message_list.dart';
import '../controllers/hi_help_controller.dart';
import 'package:kaer_with_panels/app/widgets/kr_app_text_style.dart';
import 'package:kaer_with_panels/app/localization/app_translations.dart';
import 'package:kaer_with_panels/app/widgets/hi_base_scaffold.dart';
import 'package:kaer_with_panels/app/widgets/hi_collapsible_list.dart';
import 'package:kaer_with_panels/app/widgets/hi_fixed_scrollbar.dart';
import 'package:kaer_with_panels/app/modules/hi_menu/widgets/hi_menu_list_item.dart';
import '../../../routes/app_pages.dart';
class HIHelpView extends GetView<HIHelpController> {
const HIHelpView({super.key});
@override
Widget build(BuildContext context) {
final ScrollController scrollController = ScrollController();
return HIBaseScaffold(
child: Column(
children: [
Expanded(
child: Obx(
() => EasyRefresh(
// controller: controller.refreshController,
// onRefresh: controller.kr_onRefresh,
// onLoad: controller.kr_onLoadMore,
// header: const DeliveryHeader(
// triggerOffset: 50.0,
// springRebound: true,
// ),
// footer: const DeliveryFooter(
// triggerOffset: 50.0,
// springRebound: true,
// ),
onRefresh: null, // 设置为 null 来禁用下拉刷新
onLoad: null, // 设置为 null 来禁用上拉加载
child: Padding(
padding: EdgeInsets.only(right: 0.w), // 滚动条与内容间距
child: HiFixedScrollbar(
controller: scrollController,
child: ListView.builder(
controller: scrollController,
padding: EdgeInsets.symmetric(horizontal: 40.w),
itemCount: controller.kr_messages.length,
itemBuilder: (context, index) {
final message = controller.kr_messages[index];
final collapsibleItemData = HICollapsibleItem(
title: message.title,
content: message.content,
);
return Padding(
padding: EdgeInsets.only(bottom: 10.w),
child: HICollapsibleItemWidget(item: collapsibleItemData),
);
},
),
),
),
),
),
),
SizedBox(height: 60.w),
// 增加在线客服入口
Padding(
padding: EdgeInsets.symmetric(horizontal: 40.w),
child: MenuListItem(
// 2. 创建一个 MenuItem 数据对象
item: MenuItem(
iconName: 'icon-5',
title: '在线客服',
// 3. 使用 onTap 回调来处理跳转逻辑
onTap: () {
Get.toNamed(Routes.KR_CRISP);
},
),
),
),
SizedBox(height: 30.w)
],
),
);
}
}