提交 15eff61b authored 作者: maodou's avatar maodou

1:搜索页面搜索结果显示

2:我的-帮助中心功能及帮助中心内容显示
上级 e87a8a03
part of apis;
abstract class MineAPI {
/// 1、个人信息以及8个数据
///
static Future <UserInfoModel> userInfo() async {
static Future<UserInfoModel> userInfo() async {
final result = await HttpService.to.post(
'/v1/members/Information/getMyStatistics',
params: {},
);
if (result.data is! Map ) return UserInfoModel();
if (result.data is! Map) return UserInfoModel();
return UserInfoModel.fromJson(result.data);
}
/// 2、我的收藏
static Future <List<CourseModel>> love({
static Future<List<CourseModel>> love({
int page = 1,
int limit = 10,
}) async {
......@@ -26,14 +25,14 @@ abstract class MineAPI {
},
);
if (result.data is! Map && result.data['list'] is! List) return [];
return List.generate(result.data['list'].length, (index){
return List.generate(result.data['list'].length, (index) {
return CourseModel.fromJson(result.data['list'][index]);
});
}
/// 3、笔记
///
static Future <List<CourseModel>> note({
static Future<List<CourseModel>> note({
int page = 1,
int limit = 10,
}) async {
......@@ -45,14 +44,14 @@ abstract class MineAPI {
},
);
if (result.data is! Map && result.data['list'] is! List) return [];
return List.generate(result.data['list'].length, (index){
return List.generate(result.data['list'].length, (index) {
return CourseModel.fromJson(result.data['list'][index]);
});
}
/// 4、错题
///
static Future <List<CourseModel>> wrong({
static Future<List<CourseModel>> wrong({
int page = 1,
int limit = 10,
}) async {
......@@ -64,14 +63,14 @@ abstract class MineAPI {
},
);
if (result.data is! Map && result.data['list'] is! List) return [];
return List.generate(result.data['list'].length, (index){
return List.generate(result.data['list'].length, (index) {
return CourseModel.fromJson(result.data['list'][index]);
});
}
/// 5、紫金币记录
///
static Future <List<RecordModel>> coin({
static Future<List<RecordModel>> coin({
int page = 1,
int limit = 10,
}) async {
......@@ -83,14 +82,14 @@ abstract class MineAPI {
},
);
if (result.data is! Map && result.data['list'] is! List) return [];
return List.generate(result.data['list'].length, (index){
return List.generate(result.data['list'].length, (index) {
return RecordModel.fromJson(result.data['list'][index]);
});
}
/// 6、积分记录
///
static Future <List<RecordModel>> point({
static Future<List<RecordModel>> point({
int page = 1,
int limit = 10,
}) async {
......@@ -102,14 +101,14 @@ abstract class MineAPI {
},
);
if (result.data is! Map && result.data['list'] is! List) return [];
return List.generate(result.data['list'].length, (index){
return List.generate(result.data['list'].length, (index) {
return RecordModel.fromJson(result.data['list'][index]);
});
}
/// 7、讨论
///
static Future <List<CourseModel>> discuss({
static Future<List<CourseModel>> discuss({
int page = 1,
int limit = 10,
}) async {
......@@ -121,36 +120,31 @@ abstract class MineAPI {
},
);
if (result.data is! Map && result.data['list'] is! List) return [];
return List.generate(result.data['list'].length, (index){
return List.generate(result.data['list'].length, (index) {
return CourseModel.fromJson(result.data['list'][index]);
});
}
/// 8、优惠券列表
///
static Future <List<CouponModel>> coupon({
static Future<List<CouponModel>> coupon({
int page = 1,
int limit = 10,
required int type,
}) async {
final result = await HttpService.to.post(
'/v1/coupon/Coupon/getCouponRecordListSAll',
params: {
'page': page,
'page_size': limit,
'type': type
},
params: {'page': page, 'page_size': limit, 'type': type},
);
if (result.data is! Map && result.data['list'] is! List) return [];
return List.generate(result.data['list'].length, (index){
return List.generate(result.data['list'].length, (index) {
return CouponModel.fromJson(result.data['list'][index]);
});
}
/// 9、获取最新版本
///
static Future <UModel> update() async {
static Future<UModel> update() async {
final result = await HttpService.to.post(
'/v1/members/Information/getVersion',
params: {},
......@@ -160,7 +154,7 @@ abstract class MineAPI {
}
/// 10、版本介绍
static Future <List<VersionModel>> versions({
static Future<List<VersionModel>> versions({
int page = 1,
int limit = 10,
}) async {
......@@ -172,33 +166,28 @@ abstract class MineAPI {
},
);
if (result.data is! Map && result.data['list'] is! List) return [];
return List.generate(result.data['list'].length, (index){
return List.generate(result.data['list'].length, (index) {
return VersionModel.fromJson(result.data['list'][index]);
});
}
/// 11、修改用户信息
///
static Future <bool> changeInfo({
String? name,
num? sex,
String? headImg
}) async {
Map<String,dynamic> params = {};
if (name != null){
static Future<bool> changeInfo(
{String? name, num? sex, String? headImg}) async {
Map<String, dynamic> params = {};
if (name != null) {
params['name'] = name;
}
if (sex != null){
if (sex != null) {
params['sex'] = sex;
}
if (headImg != null){
if (headImg != null) {
params['head_img'] = headImg;
}
final result = await HttpService.to.post(
'/v1/members/Information/editInformation',
params: params
);
if (result.data is Map && result.data['is_success'] == 1){
final result = await HttpService.to
.post('/v1/members/Information/editInformation', params: params);
if (result.data is Map && result.data['is_success'] == 1) {
return true;
}
return false;
......@@ -206,87 +195,102 @@ abstract class MineAPI {
/// 12、笔记详情列表
///
static Future <List<NoteModel>> noteList({
int page = 1,
static Future<List<NoteModel>> noteList(
{int page = 1,
int limit = 10,
required String bookId,
required String types
}) async {
required String types}) async {
final result = await HttpService.to.post(
'/v1/members/Information/myBookNotes',
params: {
'page': page,
'page_size': limit,
'book_id':bookId,
'book_id': bookId,
'types': types
},
);
if (result.data is! Map && result.data['list'] is! List) return [];
return List.generate(result.data['list'].length, (index){
return List.generate(result.data['list'].length, (index) {
return NoteModel.fromJson(result.data['list'][index]);
});
}
/// 13、笔记详情列表
///
static Future <List<DiscussModel>> discussList({
int page = 1,
static Future<List<DiscussModel>> discussList(
{int page = 1,
int limit = 10,
required String bookId,
required String types
}) async {
required String types}) async {
final result = await HttpService.to.post(
'/v1/members/Information/myBookComment',
params: {
'page': page,
'page_size': limit,
'book_id':bookId,
'book_id': bookId,
'types': types
},
);
if (result.data is! Map && result.data['list'] is! List) return [];
return List.generate(result.data['list'].length, (index){
return List.generate(result.data['list'].length, (index) {
return DiscussModel.fromJson(result.data['list'][index]);
});
}
/// 14、修改密码
///
static Future <bool> changePwd({
required String password,
required String rePassword
}) async {
static Future<bool> changePwd(
{required String password, required String rePassword}) async {
final result = await HttpService.to.post(
'/v1/members/Information/changePasswd',
params: {
'password':password,
'repassword':rePassword
},
params: {'password': password, 'repassword': rePassword},
);
if (result.data is Map && result.data['is_success'] == 1){
if (result.data is Map && result.data['is_success'] == 1) {
return true;
}
return false;
}
/// 15、修改手机号
static Future <bool> changePhone({
required String phone,
required String code
}) async {
static Future<bool> changePhone(
{required String phone, required String code}) async {
final result = await HttpService.to.post(
'/v1/members/Information/editPhone',
params: {
'phone':phone,
'code':code
},
params: {'phone': phone, 'code': code},
);
if (result.data is Map && result.data['is_success'] == 1){
if (result.data is Map && result.data['is_success'] == 1) {
return true;
}
return false;
}
/// 16、帮助中心
static Future<List<HelpCenterModel>> helpCenters({
int page = 1,
int limit = 10,
}) async {
final result = await HttpService.to.post(
'/v1/common/Help/getList',
params: {
'page': page,
'page_size': limit,
},
);
if (result.data is! Map && result.data['list'] is! List) return [];
return List.generate(result.data['list'].length, (index) {
return HelpCenterModel.fromJson(result.data['list'][index]);
});
}
/// 17、帮助中心内容
static Future<HelpCenterContentModel> helpCenterContent(String id) async {
final result = await HttpService.to.post(
'/v1/common/Help/getInfoById',
params: {
'id': id,
},
);
if (result.data is! Map) return HelpCenterContentModel();
return HelpCenterContentModel.fromJson(result.data);
}
}
差异被折叠。
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),
),
],
),
),
);
}*/
......@@ -125,6 +125,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
);
// 如果是刷新 清理数据
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),
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); //指定为空白焦点
}
}
......@@ -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';
......
......@@ -94,6 +94,10 @@ abstract class Routes {
static const feedback = 'feedback';
// 订单评价
static const orderEvaluate= 'order_evaluate';
// 帮助中心
static const helpCenter= 'help_center';
// 帮助中心内容
static const helpCenterContent = 'help_center_content';
......@@ -454,6 +458,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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论