提交 73519107 authored 作者: yueweilu's avatar yueweilu

1、积分界面 接口调试以及数据绑定

1、紫荆币界面 接口调试以及数据绑定
上级 88b58c02
......@@ -50,6 +50,8 @@ abstract class MineAPI {
});
}
/// 3、错题
///
static Future <List<CourseModel>> wrong({
int page = 1,
int limit = 10,
......@@ -67,6 +69,41 @@ abstract class MineAPI {
});
}
/// 紫金币记录
static Future <List<RecordModel>> coin({
int page = 1,
int limit = 10,
}) async {
final result = await HttpService.to.post(
'/v1/members/Information/getBeanList',
params: {
'page': page,
'pageSize': limit,
},
);
if (result.data is! Map && result.data['list'] is! List) return [];
return List.generate(result.data['list'].length, (index){
return RecordModel.fromJson(result.data['list'][index]);
});
}
/// 积分记录
static Future <List<RecordModel>> point({
int page = 1,
int limit = 10,
}) async {
final result = await HttpService.to.post(
'/v1/members/Information/getIntegralList',
params: {
'page': page,
'pageSize': limit,
},
);
if (result.data is! Map && result.data['list'] is! List) return [];
return List.generate(result.data['list'].length, (index){
return RecordModel.fromJson(result.data['list'][index]);
});
}
}
\ No newline at end of file
......@@ -14,3 +14,54 @@ class ReadModel {
String? link;
String? icon;
}
/// 紫金币 积分 模型
class RecordModel {
RecordModel({
this.integralId,
this.options,
this.numbers,
this.result,
this.remarks,
this.createTime,});
RecordModel.fromJson(dynamic json) {
integralId = json['integral_id'];
options = json['options'];
numbers = json['numbers'];
result = json['result'];
remarks = json['remarks'];
createTime = json['create_time'];
}
num? integralId;
num? options;
num? numbers;
num? result;
String? remarks;
String? createTime;
RecordModel copyWith({ num? integralId,
num? options,
num? numbers,
num? result,
String? remarks,
String? createTime,
}) => RecordModel( integralId: integralId ?? this.integralId,
options: options ?? this.options,
numbers: numbers ?? this.numbers,
result: result ?? this.result,
remarks: remarks ?? this.remarks,
createTime: createTime ?? this.createTime,
);
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['integral_id'] = integralId;
map['options'] = options;
map['numbers'] = numbers;
map['result'] = result;
map['remarks'] = remarks;
map['create_time'] = createTime;
return map;
}
}
\ No newline at end of file
......@@ -49,7 +49,7 @@ class MineController extends GetxController {
];
accounts = [
ReadModel(name: '优惠券',value: userInfo['coupon_nums'].toString(),icon: 'assets/images/coupon.png'),
ReadModel(name: '积分',value: userInfo['integral_nums'].toString(),link: Routes.coin,icon: 'assets/images/point.png'),
ReadModel(name: '积分',value: userInfo['integral_nums'].toString(),link: Routes.point,icon: 'assets/images/point.png'),
ReadModel(name: '紫金币',value: userInfo['bean_nums'].toString(),link: Routes.coin,icon: 'assets/images/coin.png'),
ReadModel(name: '订单',value: userInfo['orders_nums'].toString(),icon: 'assets/images/order.png')
];
......
part of user_coin;
class UserCoinController extends GetxController {
final EasyRefreshController refreshController = EasyRefreshController(
controlFinishLoad: true,
controlFinishRefresh: true,
);
List<RecordModel> coins = [];
final int _limit = 10;
int _page = 1;
bool _noMore = false;
@override
void onClose() {
refreshController.dispose();
super.onClose();
}
/// 获取紫金币记录
Future<void> _getCoin([bool isRefresh = false]) async {
if (isRefresh) _page = 1;
// 网路请求
final result = await MineAPI.coin(
page: _page,
limit: _limit
);
// 如果是刷新 清理数据
if (isRefresh) coins.clear();
coins.addAll(result);
_page ++;
_noMore = result.length < _limit;
update();
}
void onRefresh() async {
try {
await _getCoin(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 _getCoin();
refreshController.finishLoad();
} catch (error) {
refreshController.finishLoad(IndicatorResult.fail);
}
}
}
\ No newline at end of file
library user_coin;
import 'package:easy_refresh/easy_refresh.dart';
import 'package:flutter/material.dart';
import 'package:flutter_book/theme.dart';
import 'package:flutter_book/utils/index.dart';
import 'package:flutter_book/widgets/index.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import '../../apis/index.dart';
import '../../models/index.dart';
part 'view.dart';
part 'widgets/cell.dart';
part 'controller.dart';
\ No newline at end of file
......@@ -10,7 +10,9 @@ class UserCoinPage extends StatefulWidget {
class _UserCoinPageState extends State<UserCoinPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
return GetBuilder<UserCoinController>(
init: UserCoinController(),
builder: (controller) => Scaffold(
appBar: CustomAppBar(
title: const Text('紫荆币'),
actions: [
......@@ -22,7 +24,7 @@ class _UserCoinPageState extends State<UserCoinPage> {
return Container(
height: 200,
color: Colors.white,
child: Center(
child: const Center(
child: Text(
'This is the bottom sheet content',
style: TextStyle(fontSize: 18),
......@@ -34,21 +36,35 @@ class _UserCoinPageState extends State<UserCoinPage> {
print('================================================================');
});
},
child: Text('充值',style: TextStyle(color: AppTheme.primary),)
child: const Text('充值',style: TextStyle(color: Colours.c3,fontSize: 14,height: 1.5,fontWeight: Fonts.medium),)
)
],
),
body: Container(
margin: EdgeInsets.symmetric(horizontal: AppTheme.margin,vertical: AppTheme.margin),
body: CustomPullScrollView(
controller: controller.refreshController,
onRefresh: controller.onRefresh,
onLoading: controller.onLoading,
child: Container(
margin: const EdgeInsets.all(10),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
color: Colors.white
color: Colors.white,
boxShadow: [
BoxShadow(
color: const Color(0xFFC7C7C7).withOpacity(0.5),
offset: const Offset(3, 0),
blurRadius: 10.w,
spreadRadius: 0.w,
),
],
),
child: ListView.builder(
itemBuilder: (BuildContext context, int index){
return const BuildCell();
return BuildCell(model: controller.coins[index],);
},
itemCount: 10,
itemCount: controller.coins.length,
),
),
),
),
);
......
part of user_coin;
class BuildCell extends StatelessWidget {
const BuildCell({Key? key}) : super(key: key);
final RecordModel model;
const BuildCell({
Key? key,
required this.model
}) : super(key: key);
@override
Widget build(BuildContext context) {
......@@ -10,7 +14,7 @@ class BuildCell extends StatelessWidget {
children: [
Container(
// color: Colors.green,
padding: EdgeInsets.symmetric(horizontal: 10),
padding: const EdgeInsets.symmetric(horizontal: 10),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
......@@ -30,15 +34,15 @@ class BuildCell extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Gaps.vGaps15,
Text('账户充值',style: TextStyle(color: Colours.c3,fontSize: 14,height: 1.6,fontWeight: Fonts.medium),),
Text('2023-12-12 18:00:00',style:TextStyle(color: Colours.c9,fontSize: 10,height: 1.6,)),
Text(model.remarks??'',style: const TextStyle(color: Colours.c3,fontSize: 14,height: 1.6,fontWeight: Fonts.medium),),
Text(model.createTime??'',style:const TextStyle(color: Colours.c9,fontSize: 10,height: 1.6,)),
Gaps.vGaps15,
],
)
],
),
),
Text('+188',style: TextStyle(fontSize: 17,fontWeight: Fonts.medium,color: AppTheme.primary),)
Text(model.options == 1?'+${model.numbers}':'-${model.numbers}',style: const TextStyle(fontSize: 17,fontWeight: Fonts.medium,color: AppTheme.primary),)
],
),
),
......
part of user_point;
class UserPointController extends GetxController {
final EasyRefreshController refreshController = EasyRefreshController(
controlFinishLoad: true,
controlFinishRefresh: true,
);
List<RecordModel> points = [];
final int _limit = 10;
int _page = 1;
bool _noMore = false;
@override
void onClose() {
refreshController.dispose();
super.onClose();
}
/// 获取课程内图书列表
Future<void> _getPoint([bool isRefresh = false]) async {
if (isRefresh) _page = 1;
// 网路请求
final result = await MineAPI.point(
page: _page,
limit: _limit
);
// 如果是刷新 清理数据
if (isRefresh) points.clear();
points.addAll(result);
_page ++;
_noMore = result.length < _limit;
update();
}
void onRefresh() async {
try {
await _getPoint(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 _getPoint();
refreshController.finishLoad();
} catch (error) {
refreshController.finishLoad(IndicatorResult.fail);
}
}
}
\ No newline at end of file
library user_point;
import 'package:easy_refresh/easy_refresh.dart';
import 'package:flutter/material.dart';
import 'package:flutter_book/theme.dart';
import 'package:flutter_book/utils/index.dart';
import 'package:flutter_book/widgets/index.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import '../../apis/index.dart';
import '../../models/index.dart';
part 'view.dart';
part 'widgets/cell.dart';
part 'controller.dart';
\ No newline at end of file
part of user_point;
class UserPointPage extends StatefulWidget {
const UserPointPage({Key? key}) : super(key: key);
@override
State<UserPointPage> createState() => _UserPointPageState();
}
class _UserPointPageState extends State<UserPointPage> {
@override
Widget build(BuildContext context) {
return GetBuilder<UserPointController>(
init: UserPointController(),
builder: (controller) => Scaffold(
appBar: AppBar(
title: const Text('积分'),
),
body: CustomPullScrollView(
controller: controller.refreshController,
onRefresh: controller.onRefresh,
onLoading: controller.onLoading,
child: Container(
margin: const EdgeInsets.all(10),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
color: Colors.white,
boxShadow: [
BoxShadow(
color: const Color(0xFFC7C7C7).withOpacity(0.5),
offset: const Offset(3, 0),
blurRadius: 10.w,
spreadRadius: 0.w,
),
],
),
child: ListView.builder(
itemBuilder: (BuildContext context, int index){
return BuildCell(model: controller.points[index],);
},
itemCount: controller.points.length,
),
),
),
),
);
}
}
part of user_point;
class BuildCell extends StatelessWidget {
final RecordModel model;
const BuildCell({
Key? key,
required this.model
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
// color: Colors.green,
padding: const EdgeInsets.symmetric(horizontal: 10),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Container(
child: Row(
children: [
Container(
width: 27,
height: 27,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(13.5),
color: Colors.cyan,
),
),
Gaps.hGaps10,
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Gaps.vGaps15,
Text(model.remarks??'',style: const TextStyle(color: Colours.c3,fontSize: 14,height: 1.6,fontWeight: Fonts.medium),),
Text(model.createTime??'',style:const TextStyle(color: Colours.c9,fontSize: 10,height: 1.6,)),
Gaps.vGaps15,
],
)
],
),
),
Text(model.options == 1?'+${model.numbers}':'-${model.numbers}',style: const TextStyle(fontSize: 17,fontWeight: Fonts.medium,color: AppTheme.primary),)
],
),
),
Container(color: Colours.cLine,margin: const EdgeInsets.symmetric(horizontal: 15),height: 1,),
],
);
}
}
......@@ -23,6 +23,7 @@ import 'package:flutter_book/pages/user_love/index.dart';
import 'package:flutter_book/pages/user_msg/index.dart';
import 'package:flutter_book/pages/user_nick/index.dart';
import 'package:flutter_book/pages/user_notes/index.dart';
import 'package:flutter_book/pages/user_point/index.dart';
import 'package:flutter_book/pages/user_wrong/index.dart';
import 'package:flutter_book/pages/web/index.dart';
import 'package:go_router/go_router.dart';
......
......@@ -60,8 +60,10 @@ abstract class Routes {
static const versionDes = 'version_des';
// 我的收藏
static const collect = 'collect';
// 紫金币
// 紫金币记录
static const coin = 'coin';
// 积分记录
static const point = 'point';
// 消息
static const msgs = 'msgs';
// 关于
......@@ -306,6 +308,15 @@ abstract class Routes {
child: const UserWrongPage()
)
),
GoRoute(
path: '/$point',
name: point,
pageBuilder: (context, state) =>CupertinoPage(
name: state.uri.toString(),
key: state.pageKey,
child: const UserPointPage()
)
),
]
);
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论