提交 914a3418 authored 作者: yueweilu's avatar yueweilu

我的优惠券界面 以及 选择优惠券

上级 50b33b6f
...@@ -126,5 +126,25 @@ abstract class MineAPI { ...@@ -126,5 +126,25 @@ abstract class MineAPI {
}); });
} }
/// 8、优惠券列表
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
},
);
if (result.data is! Map && result.data['list'] is! List) return [];
return List.generate(result.data['list'].length, (index){
return CouponModel.fromJson(result.data['list'][index]);
});
}
} }
\ No newline at end of file
...@@ -17,6 +17,7 @@ class ReadModel { ...@@ -17,6 +17,7 @@ class ReadModel {
/// 紫金币 积分 模型 /// 紫金币 积分 模型
///
class RecordModel { class RecordModel {
RecordModel({ RecordModel({
this.integralId, this.integralId,
...@@ -65,3 +66,60 @@ class RecordModel { ...@@ -65,3 +66,60 @@ class RecordModel {
} }
} }
/// 优惠券模型
///
class CouponModel {
CouponModel({
this.couponRecId,
this.endTime,
this.couponId,
this.useStatus,
this.couponName,
this.normPrice,
this.reducedPrice,});
CouponModel.fromJson(dynamic json) {
couponRecId = json['coupon_rec_id'];
endTime = json['end_time'];
couponId = json['coupon_id'];
useStatus = json['use_status'];
couponName = json['coupon_name'];
normPrice = json['norm_price'];
reducedPrice = json['reduced_price'];
}
num? couponRecId;
String? endTime;
num? couponId;
num? useStatus;
String? couponName;
num? normPrice;
String? reducedPrice;
CouponModel copyWith({ num? couponRecId,
String? endTime,
num? couponId,
num? useStatus,
String? couponName,
num? normPrice,
String? reducedPrice,
}) => CouponModel( couponRecId: couponRecId ?? this.couponRecId,
endTime: endTime ?? this.endTime,
couponId: couponId ?? this.couponId,
useStatus: useStatus ?? this.useStatus,
couponName: couponName ?? this.couponName,
normPrice: normPrice ?? this.normPrice,
reducedPrice: reducedPrice ?? this.reducedPrice,
);
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['coupon_rec_id'] = couponRecId;
map['end_time'] = endTime;
map['coupon_id'] = couponId;
map['use_status'] = useStatus;
map['coupon_name'] = couponName;
map['norm_price'] = normPrice;
map['reduced_price'] = reducedPrice;
return map;
}
}
\ No newline at end of file
...@@ -48,7 +48,7 @@ class MineController extends GetxController { ...@@ -48,7 +48,7 @@ class MineController extends GetxController {
ReadModel(name: '收藏',value: userInfo['collect_nums'].toString(),link: Routes.love) ReadModel(name: '收藏',value: userInfo['collect_nums'].toString(),link: Routes.love)
]; ];
accounts = [ accounts = [
ReadModel(name: '优惠券',value: userInfo['coupon_nums'].toString(),icon: 'assets/images/coupon.png'), ReadModel(name: '优惠券',value: userInfo['coupon_nums'].toString(),link: Routes.coupon,icon: 'assets/images/coupon.png'),
ReadModel(name: '积分',value: userInfo['integral_nums'].toString(),link: Routes.point,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['bean_nums'].toString(),link: Routes.coin,icon: 'assets/images/coin.png'),
ReadModel(name: '订单',value: userInfo['orders_nums'].toString(),icon: 'assets/images/order.png') ReadModel(name: '订单',value: userInfo['orders_nums'].toString(),icon: 'assets/images/order.png')
......
part of pay_coupon;
class PayCouponController extends GetxController {
late TabController tabController;
List <Widget>tabs = [
const Tab(text: '可用',),
const Tab(text: '不可用',),
];
}
\ No newline at end of file
library pay_coupon;
import 'package:flutter/material.dart';
import 'package:flutter_book/pages/user_coupon/index.dart';
import 'package:get/get.dart';
import '../../theme.dart';
import '../../utils/index.dart';
part 'view.dart';
part 'controller.dart';
\ No newline at end of file
part of pay_coupon;
class PayCouponPage extends StatefulWidget {
const PayCouponPage({Key? key}) : super(key: key);
@override
State<PayCouponPage> createState() => _PayCouponPageState();
}
class _PayCouponPageState extends State<PayCouponPage> {
@override
Widget build(BuildContext context) {
return GetBuilder<PayCouponController>(
init: PayCouponController(),
builder: (controller) =>Scaffold(
appBar: AppBar(
centerTitle: true,
title: const Text('选择优惠券'),
),
body: Column(
children: [
TabBar(
labelColor: AppTheme.primary,
// isScrollable: true,
labelStyle: const TextStyle(fontSize: 15,height: 1.4,fontWeight: Fonts.medium),
unselectedLabelColor: Colours.c9,
unselectedLabelStyle: const TextStyle(fontSize: 15,height: 1.4),
indicatorSize: TabBarIndicatorSize.label,
indicatorColor: AppTheme.primary,
tabs:controller.tabs,
physics: const NeverScrollableScrollPhysics(),
controller: controller.tabController,
),
Expanded(
child: TabBarView(
controller: controller.tabController,
children: [
],
),
),
],
),
),
);
}
}
class CouponPage extends StatefulWidget {
const CouponPage({Key? key}) : super(key: key);
@override
State<CouponPage> createState() => _CouponPageState();
}
class _CouponPageState extends State<CouponPage> {
@override
Widget build(BuildContext context) {
return ListView.builder(
itemBuilder: (BuildContext context, int index){
// return BuildItem(model: ,);
},
itemCount: 2,
);
}
}
part of user_coupon;
class UserCouponController extends GetxController {
final EasyRefreshController refreshController = EasyRefreshController(
controlFinishLoad: true,
controlFinishRefresh: true,
);
// 优惠券
List <CouponModel> coupons = [];
late int type = 1;
final int _limit = 10;
int _page = 1;
bool _noMore = false;
@override
void onClose() {
refreshController.dispose();
super.onClose();
}
void getOverCoupons() {
_noMore = true;
_page = 1;
type = 2;
_getCoupon();
}
/// 获取课程内图书列表
Future<void> _getCoupon([bool isRefresh = false]) async {
if (isRefresh) _page = 1;
// 网路请求
final result = await MineAPI.coupon(
page: _page,
limit: _limit,
type: type,
);
// 如果是刷新 清理数据
if (isRefresh) coupons.clear();
coupons.addAll(result);
_page ++;
_noMore = result.length < _limit;
update();
}
void onRefresh() async {
try {
await _getCoupon(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 _getCoupon();
refreshController.finishLoad();
} catch (error) {
refreshController.finishLoad(IndicatorResult.fail);
}
}
}
\ No newline at end of file
library user_coupon;
import 'package:easy_refresh/easy_refresh.dart';
import 'package:flutter/material.dart';
import 'package:flutter_book/apis/index.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 '../../models/index.dart';
part 'view.dart';
part 'controller.dart';
part 'widgets/item.dart';
\ No newline at end of file
part of user_coupon;
class UserCouponPage extends StatefulWidget {
const UserCouponPage({Key? key}) : super(key: key);
@override
State<UserCouponPage> createState() => _UserCouponPageState();
}
class _UserCouponPageState extends State<UserCouponPage> {
@override
Widget build(BuildContext context) {
return GetBuilder<UserCouponController>(
init: UserCouponController(),
builder:(controller) => Scaffold(
appBar: AppBar(
centerTitle: true,
title: const Text('优惠券'),
),
body: CustomPullScrollView(
controller: controller.refreshController,
onRefresh: controller.onRefresh,
onLoading: controller.onLoading,
child: ListView.builder(
itemBuilder: (BuildContext context, int index){
if (index == controller.coupons.length){
return GestureDetector(
onTap: (){
controller.getOverCoupons();
},
child: Container(
height: 40,
color: Colors.cyan,
child: Text('过期优惠券'),
),
);
}
else {
return BuildItem(model: controller.coupons[index],);
}
},
itemCount: controller.coupons.length +1,
),
),
),
);
}
}
part of user_coupon;
class BuildItem extends StatelessWidget {
final CouponModel model;
const BuildItem({
Key? key,
required this.model
}) : super(key: key);
@override
Widget build(BuildContext context) {
return ColorFiltered(
colorFilter: ColorFilter.mode(Colors.transparent, BlendMode.saturation),
child: Container(
margin: EdgeInsets.only(left: 10,top: 10,right: 5),
child: Stack(
children: [
Container(
child:Image.asset('assets/images/coupon_bg.png') ,
),
Container(
height: 105,
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
width:120 ,
height: 100,
child: Column(
children: [
RichText(
text: TextSpan(
children: <TextSpan>[
TextSpan(
text: '¥',
style: TextStyle(fontSize: 15,fontWeight: Fonts.boldSemi,height: 1.5,color: Colors.white)
),
TextSpan(
text: '5',
style: TextStyle(fontSize: 40,fontWeight: Fonts.boldSemi,height: 1.5,color: Colors.white)
),
]
),
),
Text('满${model.normPrice}可用',style: TextStyle(fontSize: 11,height: 1.5,color: Colors.white),)
],
),
// color: Colors.cyan,
),
Expanded(
child: Container(
margin: EdgeInsets.only(left:15,right: 15 ),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(model.couponName??'',style: TextStyle(fontSize: 16,fontWeight: Fonts.medium,height: 1.5,color: Colours.c3),),
Gaps.vGaps5,
Text('满${model.normPrice}${model.reducedPrice}元',style: TextStyle(fontSize: 12,height: 1.5,color: Colours.c9),),
Gaps.vGaps5,
Text(model.endTime??'',style: TextStyle(fontSize: 12,height: 1.5,color: Colours.c9),),
],
),
Container(
width: 65,
height: 24,
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(15),
color: Colors.white,
border: Border.all(width: 1,color: AppTheme.primary)
),
child: const Text('立即使用',style: TextStyle(fontSize: 12,fontWeight: Fonts.medium,color: AppTheme.primary),),
)
],
),
),
)
],
),
)
],
),
),
);
}
}
...@@ -18,6 +18,7 @@ import 'package:flutter_book/pages/splash/index.dart'; ...@@ -18,6 +18,7 @@ import 'package:flutter_book/pages/splash/index.dart';
import 'package:flutter_book/pages/study_history/index.dart'; import 'package:flutter_book/pages/study_history/index.dart';
import 'package:flutter_book/pages/study_report/index.dart'; import 'package:flutter_book/pages/study_report/index.dart';
import 'package:flutter_book/pages/user_coin/index.dart'; import 'package:flutter_book/pages/user_coin/index.dart';
import 'package:flutter_book/pages/user_coupon/index.dart';
import 'package:flutter_book/pages/user_discuss/index.dart'; import 'package:flutter_book/pages/user_discuss/index.dart';
import 'package:flutter_book/pages/user_info/index.dart'; import 'package:flutter_book/pages/user_info/index.dart';
import 'package:flutter_book/pages/user_love/index.dart'; import 'package:flutter_book/pages/user_love/index.dart';
......
...@@ -78,6 +78,8 @@ abstract class Routes { ...@@ -78,6 +78,8 @@ abstract class Routes {
static const wrong = 'wrong'; static const wrong = 'wrong';
// 讨论 // 讨论
static const discuss = 'discuss'; static const discuss = 'discuss';
// 优惠券
static const coupon = 'coupon';
static final GoRouter config = GoRouter( static final GoRouter config = GoRouter(
...@@ -328,6 +330,15 @@ abstract class Routes { ...@@ -328,6 +330,15 @@ abstract class Routes {
child: const UserDiscussPage() child: const UserDiscussPage()
) )
), ),
GoRoute(
path: '/$coupon',
name: coupon,
pageBuilder: (context, state) =>CupertinoPage(
name: state.uri.toString(),
key: state.pageKey,
child: const UserCouponPage()
)
),
] ]
); );
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论