提交 7482d330 authored 作者: yueweilu's avatar yueweilu

Merge remote-tracking branch 'origin/test' into test

差异被折叠。
差异被折叠。
part of help_center;
class HelpCenterController extends GetxController {
final EasyRefreshController refreshController = EasyRefreshController(
controlFinishLoad: true,
controlFinishRefresh: true,
);
final int _limit = 10;
int _page = 1;
bool _noMore = false;
List<HelpCenterModel> helpCenters = [];
@override
void onClose() {
refreshController.dispose();
super.onClose();
}
/// 获取课程内图书列表
Future<void> _gethelpCenters([bool isRefresh = false]) async {
if (isRefresh) _page = 1;
// 网路请求
final result = await MineAPI.helpCenters(
page: _page,
limit: _limit
);
// 如果是刷新 清理数据
if (isRefresh) helpCenters.clear();
helpCenters.addAll(result);
_page ++;
_noMore = result.length < _limit;
update();
}
void onRefresh() async {
try {
await _gethelpCenters(true);
refreshController.finishRefresh(IndicatorResult.success);
refreshController.resetFooter();
} catch (error) {
refreshController.finishRefresh(IndicatorResult.fail);
}
}
void onLoading() async {
if (_noMore) {
refreshController.finishLoad(IndicatorResult.noMore);
return;
}
try {
await _gethelpCenters();
refreshController.finishLoad();
} catch (error) {
refreshController.finishLoad(IndicatorResult.fail);
}
}
List<HelpCenterModel> test(){
return [
HelpCenterModel(id: 1,helpTitle: '账号注册'),
HelpCenterModel(id: 2,helpTitle: '如何进行充值'),
HelpCenterModel(id: 3,helpTitle: '如何对内容进行划线'),
];
}
}
\ No newline at end of file
library help_center;
import 'package:easy_refresh/easy_refresh.dart';
import 'package:flutter/material.dart';
import 'package:flutter_book/apis/index.dart';
import 'package:flutter_book/widgets/index.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:go_router/go_router.dart';
import '../../models/index.dart';
import '../../routes/index.dart';
import '../../utils/index.dart';
part 'view.dart';
part 'controller.dart';
part 'widgets/item.dart';
\ No newline at end of file
part of help_center;
class HelpCenterPage extends StatefulWidget {
const HelpCenterPage({Key? key}) : super(key: key);
@override
State<HelpCenterPage> createState() => _HelpCenterPageState();
}
class _HelpCenterPageState extends State<HelpCenterPage> {
@override
Widget build(BuildContext context) {
return GetBuilder<HelpCenterController>(
init: HelpCenterController(),
builder: (controller) => Scaffold(
appBar: AppBar(
centerTitle: true,
title: const Text('帮助中心'),
),
body: CustomPullScrollView(
controller: controller.refreshController,
onRefresh: controller.onRefresh,
onLoading: controller.onLoading,
child: SingleChildScrollView(
child: Container(
margin: EdgeInsets.all(10.w),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8.w),
color: Colors.white,
boxShadow: [
BoxShadow(
color: const Color(0xFFC7C7C7).withOpacity(0.5),
offset: Offset(3.w, 0),
blurRadius: 10.w,
spreadRadius: 0.w,
),
],
),
child: ClipRRect(
borderRadius: BorderRadius.circular(8.w),
child: ListView.builder(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemCount: controller.helpCenters.length,
itemBuilder: (BuildContext context, int index){
HelpCenterModel model = controller.helpCenters[index];
return GestureDetector(
child: BuildItem(model: model,),
onTap: (){
context.pushNamed(Routes.helpCenterContent,queryParameters: {'id': model.id.toString()});
},
);
}),
),
),
),
),
));
}
}
part of help_center;
class BuildItem extends StatelessWidget {
final HelpCenterModel model;
const BuildItem({Key? key, required this.model}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
color: Colors.white,
padding: EdgeInsets.only(top: 10.w, right: 15.w, left: 15.w),
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: <Widget>[
Text(
'${model!.id}.',
style: TextStyle(
fontSize: 14.w, height: 1.5.w, color: Colours.c3),
),
Padding(
padding: const EdgeInsets.only(left: 10), // 设置左部间隔
child: Text(
model.helpTitle ?? '',
style: TextStyle(
fontSize: 12.w, height: 1.5.w, color: Colours.c9),
),
),
],
),
Image.asset('assets/images/right_arrow.png')
],
),
Gaps.vGaps10,
Container(
height: 0.5.w,
color: Colours.cF0,
)
],
),
);
}
}
part of help_cneter_content;
class HelpCenterContentController extends GetxController {
final String id;
HelpCenterContentModel helpCenterContentModel = HelpCenterContentModel();
HelpCenterContentController(this.id);
@override
void onReady() {
_getHelpCenterContent(id);
super.onReady();
}
/// 获取帮助中心内容
void _getHelpCenterContent(String id) async {
helpCenterContentModel = await MineAPI.helpCenterContent(id);
update();
}
}
library help_cneter_content;
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get_state_manager/src/simple/get_controllers.dart';
import 'package:get/get_state_manager/src/simple/get_state.dart';
import '../../apis/index.dart';
import '../../models/index.dart';
import '../../utils/index.dart';
part 'view.dart';
part 'controller.dart';
\ No newline at end of file
part of help_cneter_content;
/// 帮助中心-常见问题-内容详情
class HelpCenterContentPage extends StatefulWidget {
final String id;
const HelpCenterContentPage({
Key? key,
required this.id,
}) : super(key: key);
@override
State<HelpCenterContentPage> createState() => _HelpCenterContentPageState();
}
class _HelpCenterContentPageState extends State<HelpCenterContentPage> {
@override
Widget build(BuildContext context) {
return GetBuilder<HelpCenterContentController>(
init: HelpCenterContentController(widget.id),
builder: (controller) => Scaffold(
appBar: AppBar(
centerTitle: true,
title: const Text('常见问题'),
),
body: Container(
width: double.infinity,
margin: EdgeInsets.only(
left: 15.w, top: 10.w, right: 15.w, bottom: 15.w),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start, // 下面的Text靠左
children: [
Align(
alignment: Alignment.topCenter,
child: Text(
controller.helpCenterContentModel.helpTitle ?? '',
style: TextStyle(
fontSize: 16.w, height: 1.5.w, color: Colours.c3),
),
),
SizedBox(height: 15.w), // 添加15dp的间隔,
Text(
controller.helpCenterContentModel.helpContent ?? '',
style: TextStyle(
fontSize: 14.w, height: 1.5.w, color: Colours.c3),
),
],
),
),
));
}
}
/*@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
centerTitle: true,
title: const Text('常见问题'),
),
body: Container(
margin: EdgeInsets.all(15.w),
child: Column(
children: [
Text(
model.helpTitle ?? '',
style: TextStyle(fontSize: 16.w, height: 1.5, color: Colours.c3),
),
Text(
model.helpContent ?? '',
style: TextStyle(fontSize: 14.w, height: 1.5, color: Colours.c3),
),
],
),
),
);
}*/
......@@ -131,6 +131,12 @@ class _MinePageState extends State<MinePage> {
}, child: _buildItem('意见反馈')
),
Container(color: Colours.cLine,margin: EdgeInsets.symmetric(horizontal: 15.w),height: 1.w,),
GestureDetector(
onTap: (){
context.pushNamed(Routes.helpCenter);
}, child: _buildItem('帮助中心',)
),
Container(color: Colours.cLine,margin: EdgeInsets.symmetric(horizontal: 15.w),height: 1.w,),
GestureDetector(
onTap: (){
context.pushNamed(Routes.about);
......
part of search;
class SearchController extends GetxController {
final EasyRefreshController refreshController = EasyRefreshController(
controlFinishLoad: true,
controlFinishRefresh: true,
);
late TextEditingController searchController = TextEditingController();
// 搜索记录数组
......@@ -9,6 +12,10 @@ class SearchController extends GetxController {
// 书籍数组
List<CourseModel> books = [];
final int _limit = 20;
int _page = 1;
bool _noMore = false;
@override
void onReady() {
_getSearchRecords();
......@@ -43,6 +50,52 @@ class SearchController extends GetxController {
}
/// 收藏 与 取消收藏
void love({
required String bookId,
required num isCollection
}) async {
if (isCollection == 0){
isCollection = 1;
}
else{
isCollection = 0;
}
bool result = await CommonAPI.love(bookId: bookId, love: isCollection.toString());
if (result) {
onRefresh();
}
}
/// 获取图书列表数据
Future<void> _getBooks([bool isRefresh = false]) async {
if (isRefresh) _page = 1;
// 网路请求
final result = await LibraryAPI.books(
page: _page,
limit: _limit, categoryId: ''
);
// 如果是刷新 清理数据
if (isRefresh) books.clear();
books.addAll(result);
_page ++;
_noMore = result.length < _limit;
update();
}
void onRefresh() async {
try {
await _getBooks(true);
refreshController.finishRefresh(IndicatorResult.success);
refreshController.resetFooter();
} catch (error) {
refreshController.finishRefresh(IndicatorResult.fail);
}
}
/// 本地搜索历史
/*
///获取搜索关键字数据
......
library search;
import 'package:easy_refresh/easy_refresh.dart';
import 'package:flutter/material.dart';
import 'package:flutter_book/widgets/index.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
......@@ -10,9 +11,11 @@ import 'package:go_router/go_router.dart';
import '../../apis/index.dart';
import '../../models/index.dart';
import '../../routes/index.dart';
import '../../services/index.dart';
import '../../theme.dart';
import '../../utils/index.dart';
import '../library/index.dart';
part 'view.dart';
part 'widgets/history.dart';
......
......@@ -8,43 +8,87 @@ class SearchPage extends StatefulWidget {
}
class _SearchPageState extends State<SearchPage> {
bool showHistory = true; // 根据条件设置为true或false
@override
Widget build(BuildContext context) {
return GetBuilder<SearchController>(
init: SearchController(),
builder:(controller)=> Scaffold(
builder: (controller) => Scaffold(
appBar: CustomAppBar(
automaticallyImplyLeading:false,
automaticallyImplyLeading: false,
titleSpacing: 0,
title: Padding(
padding: EdgeInsets.symmetric(horizontal: AppTheme.margin),
title: Padding(
padding: EdgeInsets.symmetric(horizontal: AppTheme.margin),
child: CustomInputSearch(
controller: controller.searchController,
readOnly:false,
readOnly: false,
hintText: '请输入书籍名称',
onTap: () {
// context.pushNamed(Routes.msgs);
},
onEditingComplete: (){
onEditingComplete: () {
showHistory = false;
controller.search();
// FocusScope.of(context).unfocus();
FocusNode blankNode = FocusNode();
FocusScope.of(context).requestFocus(blankNode); //指定为空白焦点
},
),
),
actions: [
GestureDetector(
onTap: (){
onTap: () {
context.pop();
},
child: Container(
padding: EdgeInsets.only(left: 10.w,top: 10.w,bottom: 10.w),
child: Text('取消',style: TextStyle(fontSize: 14.w,height: 1.5,color: Colours.c3),),
// color: Colors.red,
padding: EdgeInsets.only(left: 10.w, top: 10.w, bottom: 10.w),
child: Text(
'取消',
style:
TextStyle(fontSize: 14.w, height: 1.5, color: Colours.c3),
),
),
)
],
),
body: BuildHistory(controller: controller),
body: buildListView(controller),
),
);
}
Widget buildListView(SearchController controller) {
if (showHistory) {
// 如果条件为true,显示历史搜索记录
return BuildHistory(controller: controller);
} else {
// 如果条件为false,显示搜索到的书籍
return ListView.builder(
// shrinkWrap: true,
// physics: NeverScrollableScrollPhysics(),
scrollDirection: Axis.vertical,
itemCount: controller.books.length,
itemBuilder: (BuildContext context, int index) {
CourseModel model = controller.books[index];
return GestureDetector(
onTap: () {
context.pushNamed(Routes.bookDetail,
queryParameters: {'book_id': model.bookId.toString()});
},
child: LibraryCell(
model: model,
onTap: () {
controller.love(
bookId: model.bookId.toString(),
isCollection: model.isCollection!);
},
),
);
});
}
}
hideSoftKeyboard(BuildContext context) {
FocusNode blankNode = FocusNode(); //空白焦点,不赋值给任何输入框的focusNode
FocusScope.of(context).requestFocus(blankNode); //指定为空白焦点
}
}
part of user_feedback;
/// 提交意见反馈
class UserFeedbackController extends GetxController {
late TextEditingController searchController = TextEditingController();
/// 提交意见反馈
void upFeedback() async {
final result = await MineAPI.feedback(searchController.text);
if (result) {
Toast.show('提交成功');
update();
}
}
}
......@@ -3,7 +3,11 @@ library user_feedback;
import 'package:flutter/material.dart';
import 'package:flutter_book/utils/index.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get_state_manager/src/simple/get_controllers.dart';
import 'package:get/get_state_manager/src/simple/get_state.dart';
import '../../apis/index.dart';
import '../../widgets/index.dart';
part 'view.dart';
\ No newline at end of file
part 'view.dart';
part 'controller.dart';
\ No newline at end of file
......@@ -10,66 +10,65 @@ class UserFeedbackPage extends StatefulWidget {
class _UserFeedbackPageState extends State<UserFeedbackPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('意见反馈'),
centerTitle: true,
),
body: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8.w),
color: Colors.transparent,
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Container(
alignment: Alignment.centerLeft,
padding: EdgeInsets.only(left: 10.w, top: 16.5.w),
child: Text.rich(TextSpan(children: [
TextSpan(
text: "*",
style: TextStyle(fontSize: 14, color: Colours.cAB1941)),
TextSpan(
text: "问题描述或建议",
style: TextStyle(
fontSize: 14.w,
color: Colours.c3,
fontWeight: FontWeight.bold)),
])),
return GetBuilder<UserFeedbackController>(
init: UserFeedbackController(),
builder: (controller) => Scaffold(
appBar: AppBar(
title: const Text('意见反馈'),
centerTitle: true,
),
body: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8.w),
color: Colors.transparent,
),
Container(
padding: EdgeInsets.only(
left: 10.w, right: 10.w, top: 6.5.w, bottom: 10.w),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Container(
alignment: Alignment.centerLeft,
padding: EdgeInsets.only(left: 10.w, top: 16.5.w),
child: Text.rich(TextSpan(children: [
const TextSpan(
text: "*",
style:
TextStyle(fontSize: 14, color: Colours.cAB1941)),
TextSpan(
text: "问题描述或建议",
style: TextStyle(
fontSize: 14.w,
color: Colours.c3,
fontWeight: FontWeight.bold)),
])),
),
Container(
padding: EdgeInsets.only(
left: 10.w, right: 10.w, top: 6.5.w, bottom: 10.w),
child: CustomInput(
controller: controller.searchController,
maxLines: 5,
hintText: '请描述你的问题,我们会尽快处理并回复',
),
),
child: const CustomInput(
maxLines: 5,
hintText: '请描述你的问题,我们会尽快处理并回复',
),
// _buildTextField(context),
Container(
padding: EdgeInsets.only(
left: 10.w, right: 10.w, top: 35.w, bottom: 20.w),
width: double.infinity,
child: CustomGradientButton(
text: '提交反馈',
isEnabled: true,
onPressed: () {
controller.upFeedback();
FocusNode blankNode = FocusNode();
FocusScope.of(context).requestFocus(blankNode);
print('提交反馈');
// controller.onLogin(context);
},
)),
],
),
// _buildTextField(context),
Container(
padding: EdgeInsets.only(
left: 10.w, right: 10.w, top: 35.w, bottom: 20.w),
width: double.infinity,
child:
CustomGradientButton(
text: '提交反馈',
isEnabled: true,
onPressed: () {
print('提交反馈');
// controller.onLogin(context);
},
)
),
],
),
)
);
)));
}
}
......@@ -11,6 +11,8 @@ import 'package:flutter_book/pages/change_phone/index.dart';
import 'package:flutter_book/pages/change_pwd/index.dart';
import 'package:flutter_book/pages/credit_points/index.dart';
import 'package:flutter_book/pages/forget_pwd/index.dart';
import 'package:flutter_book/pages/help_center/index.dart';
import 'package:flutter_book/pages/help_cneter_content/index.dart';
import 'package:flutter_book/pages/login/index.dart';
import 'package:flutter_book/pages/main/index.dart';
import 'package:flutter_book/pages/reset_pwd/index.dart';
......
......@@ -95,6 +95,10 @@ abstract class Routes {
static const feedback = 'feedback';
// 订单评价
static const orderEvaluate= 'order_evaluate';
// 帮助中心
static const helpCenter= 'help_center';
// 帮助中心内容
static const helpCenterContent = 'help_center_content';
......@@ -464,6 +468,24 @@ abstract class Routes {
child: const OrderEvaluatePage()
)
),
GoRoute( // 帮助中心
path: '/$helpCenter',
name: helpCenter,
pageBuilder: (context, state) =>CupertinoPage(
name: state.uri.toString(),
key: state.pageKey,
child: const HelpCenterPage()
)
),
GoRoute( // 帮助中心内容
path: '/$helpCenterContent',
name: helpCenterContent,
pageBuilder: (context, state) =>CupertinoPage(
name: state.uri.toString(),
key: state.pageKey,
child: HelpCenterContentPage(id: state.uri.queryParameters['id'].toString())
)
),
]
);
......
差异被折叠。
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论