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

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

......@@ -311,7 +311,7 @@ abstract class MineAPI {
}
/// 19、订单列表
/// 20、订单列表
static Future<List<OrderListModel>> orderList({
int page = 1,
int limit = 10,
......@@ -353,4 +353,18 @@ abstract class MineAPI {
return CoinModel.fromJson(result.data['list'][index]);
});
}
/// 21、订单取消支付
static Future<bool> cancelPay(
{required String ordersnum}) async {
final result = await HttpService.to.post(
'/v1/orders/Orders/cancelPay',
params: {'ordersnum': ordersnum, },
);
if (result.data is Map && result.data['is_success'] == 1) {
return true;
}
return false;
}
}
......@@ -251,3 +251,193 @@ class CartListModel {
return map;
}
}
/// id : 740
/// ordersnum : "VN240126111215511309"
/// total_price : "45.00"
/// final_total_price : "45.00"
/// nums : 1
/// status : 3
/// create_time : "2024-01-26 11:12:15"
/// coupon_price : "0.00"
/// integral_price : "0.00"
/// pay_type : 3
/// pay_time : "2024-01-26 11:12:15"
/// types : 1
/// bean : 0
/// book_list : [{"book_id":110,"name":"ASASDASD","img":"img","introduction":"introduction","price":"45.00","rating":0,"comments":0,"create_time":0}]
class OrderInfoModel {
OrderInfoModel({
this.id,
this.ordersnum,
this.totalPrice,
this.finalTotalPrice,
this.nums,
this.status,
this.createTime,
this.couponPrice,
this.integralPrice,
this.payType,
this.payTime,
this.types,
this.bean,
this.bookList,});
OrderInfoModel.fromJson(dynamic json) {
id = json['id'];
ordersnum = json['ordersnum'];
totalPrice = json['total_price'];
finalTotalPrice = json['final_total_price'];
nums = json['num'];
status = json['status'];
createTime = json['create_time'];
couponPrice = json['coupon_price'];
integralPrice = json['integral_price'];
payType = json['pay_type'];
payTime = json['pay_time'];
types = json['types'];
bean = json['bean'];
if (json['list'] != null) {
bookList = [];
json['list'].forEach((v) {
bookList?.add(BookListModel.fromJson(v));
});
}
}
num? id;
String? ordersnum;
String? totalPrice;
String? finalTotalPrice;
num? nums;
num? status;
String? createTime;
String? couponPrice;
String? integralPrice;
num? payType;
String? payTime;
num? types;
num? bean;
List<BookListModel>? bookList;
OrderInfoModel copyWith({ num? id,
String? ordersnum,
String? totalPrice,
String? finalTotalPrice,
num? nums,
num? status,
String? createTime,
String? couponPrice,
String? integralPrice,
num? payType,
String? payTime,
num? types,
num? bean,
List<BookListModel>? bookList,
}) => OrderInfoModel( id: id ?? this.id,
ordersnum: ordersnum ?? this.ordersnum,
totalPrice: totalPrice ?? this.totalPrice,
finalTotalPrice: finalTotalPrice ?? this.finalTotalPrice,
nums: nums ?? this.nums,
status: status ?? this.status,
createTime: createTime ?? this.createTime,
couponPrice: couponPrice ?? this.couponPrice,
integralPrice: integralPrice ?? this.integralPrice,
payType: payType ?? this.payType,
payTime: payTime ?? this.payTime,
types: types ?? this.types,
bean: bean ?? this.bean,
bookList: bookList ?? this.bookList,
);
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['id'] = id;
map['ordersnum'] = ordersnum;
map['total_price'] = totalPrice;
map['final_total_price'] = finalTotalPrice;
map['num'] = nums;
map['status'] = status;
map['create_time'] = createTime;
map['coupon_price'] = couponPrice;
map['integral_price'] = integralPrice;
map['pay_type'] = payType;
map['pay_time'] = payTime;
map['types'] = types;
map['bean'] = bean;
if (bookList != null) {
map['list'] = bookList?.map((v) => v.toJson()).toList();
}
return map;
}
}
/// book_id : 110
/// name : "ASASDASD"
/// img : "img"
/// introduction : "introduction"
/// price : "45.00"
/// rating : 0
/// comments : 0
/// create_time : 0
class BookListModel {
BookListModel({
this.bookId,
this.name,
this.img,
this.introduction,
this.price,
this.rating,
this.comments,
this.createTime,});
BookListModel.fromJson(dynamic json) {
bookId = json['book_id'];
name = json['name'];
img = json['img'];
introduction = json['introduction'];
price = json['price'];
rating = json['rating'];
comments = json['comments'];
createTime = json['create_time'];
}
num? bookId;
String? name;
String? img;
String? introduction;
String? price;
num? rating;
num? comments;
num? createTime;
BookListModel copyWith({ num? bookId,
String? name,
String? img,
String? introduction,
String? price,
num? rating,
num? comments,
num? createTime,
}) => BookListModel( bookId: bookId ?? this.bookId,
name: name ?? this.name,
img: img ?? this.img,
introduction: introduction ?? this.introduction,
price: price ?? this.price,
rating: rating ?? this.rating,
comments: comments ?? this.comments,
createTime: createTime ?? this.createTime,
);
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['book_id'] = bookId;
map['name'] = name;
map['img'] = img;
map['introduction'] = introduction;
map['price'] = price;
map['rating'] = rating;
map['comments'] = comments;
map['create_time'] = createTime;
return map;
}
}
......@@ -70,7 +70,8 @@ class MineController extends GetxController {
ReadModel(
name: '订单',
value: userInfo.ordersNums.toString(),
link: Routes.order,
// link: Routes.order,
link: Routes.orderRefunded,
icon: 'assets/images/order.png')
];
update();
......
......@@ -4,7 +4,6 @@ part of user_order;
class UserOrderController extends GetxController
with GetTickerProviderStateMixin {
int tag;
late TabController _tabController;
// final List<OrderListModel> models;
UserOrderController(this.tag);/*{
onRefresh();
......@@ -34,7 +33,6 @@ class UserOrderController extends GetxController
@override
void onInit() {
_tabController = TabController(length: tabs.length, vsync: this);
super.onInit();
}
......@@ -48,7 +46,6 @@ class UserOrderController extends GetxController
void onClose() {
searchController.dispose();
refreshController.dispose();
_tabController.dispose();
super.onClose();
}
......@@ -58,7 +55,7 @@ class UserOrderController extends GetxController
if (isRefresh) _page = 1;
// 网路请求
final result = await MineAPI.orderList(
page: _page, limit: _limit, status: _tabController.index, keys: keys);
page: _page, limit: _limit, status: tag, keys: keys);
// 如果是刷新 清理数据
if (isRefresh) orderList.clear();
orderList.addAll(result);
......
......@@ -8,21 +8,30 @@ class UserOrderPage extends StatefulWidget {
@override
State<UserOrderPage> createState() => _UserOrderState();
}
List<Tab> tabs = [
const Tab(text: '全部',),
const Tab(text: '待付款',),
const Tab(text: '已取消',),
const Tab(text: '已完成',),
const Tab(text: '已退款',),
];
int tab = 0;
class _UserOrderState extends State<UserOrderPage> {
/* late num? selectedGender ; // 选中的性别
class _UserOrderState extends State<UserOrderPage> with SingleTickerProviderStateMixin{
late TabController _tabController; // 选中的性别
late TextEditingController searchController = TextEditingController();
@override
void initState() {
_tabController = TabController(length: 5, vsync: this);
super.initState();
selectedGender = widget.userInfo.sex;
// 在这里可以使用 localVariable 进行操作
}*/
}
@override
Widget build(BuildContext context) {
return GetBuilder<UserOrderController>(
return /*GetBuilder<UserOrderController>(
init: UserOrderController(tab),
builder: (controller) => Scaffold(
appBar: CustomAppBar(
......@@ -31,7 +40,7 @@ class _UserOrderState extends State<UserOrderPage> {
title: Padding(
padding: EdgeInsets.symmetric(horizontal: AppTheme.margin),
child: CustomInputSearch(
controller: controller.searchController,
controller: searchController,
readOnly: false,
hintText: '搜索我的订单',
onTap: () {
......@@ -40,8 +49,8 @@ class _UserOrderState extends State<UserOrderPage> {
onEditingComplete: () {
controller._getOrders(
isRefresh: true,
keys: controller.searchController.text,
tabIndex: controller._tabController.index);
keys: searchController.text,
tabIndex: _tabController.index);
// FocusScope.of(context).unfocus();
FocusNode blankNode = FocusNode();
FocusScope.of(context).requestFocus(blankNode); //指定为空白焦点
......@@ -66,12 +75,53 @@ class _UserOrderState extends State<UserOrderPage> {
),
body: _buildBody(controller),
),
);
);*/
Scaffold(
appBar: CustomAppBar(
automaticallyImplyLeading: false,
titleSpacing: 0,
title: Padding(
padding: EdgeInsets.symmetric(horizontal: AppTheme.margin),
child: CustomInputSearch(
controller: searchController,
readOnly: false,
hintText: '搜索我的订单',
onTap: () {
// context.pushNamed(Routes.msgs);
},
onEditingComplete: () {
// _getOrders(
// isRefresh: true,
// keys: searchController.text,
// tabIndex: _tabController.index);
FocusNode blankNode = FocusNode();
FocusScope.of(context).requestFocus(blankNode); //指定为空白焦点
},
),
),
actions: [
GestureDetector(
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),
),
),
)
],
),
body: _buildBody(),
);
}
Widget _buildBody(UserOrderController controller) {
Widget _buildBody( ) {
return DefaultTabController(
length: controller.tabs.length,
length: tabs.length,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
......@@ -103,18 +153,18 @@ class _UserOrderState extends State<UserOrderPage> {
unselectedLabelStyle: TextStyle(
color: Colours.c9, fontSize: 15.w, height: 1.5),
isScrollable: true,
controller: controller._tabController,
tabs: controller.tabs),
controller: _tabController,
tabs: tabs),
),
),
Expanded(
child: TabBarView(
controller: controller._tabController,
children: List.generate(controller.tabs.length, (index) {
controller: _tabController,
children: List.generate(tabs.length, (index) {
tab = index;
return BuildListPage(
tag:
tab, models:controller.orderList,controller: controller,/*,context: context,*/
tab,/* models:controller.orderList,*//*controller: controller,*//*,context: context,*/
);
})),
)
......
......@@ -2,15 +2,15 @@ part of user_order;
class BuildListPage extends StatefulWidget {
final int tag;
final List<OrderListModel> models;
final UserOrderController controller;
// final List<OrderListModel> models;
// final UserOrderController controller;
// final BuildContext context;
const BuildListPage({
Key? key,
required this.tag,
required this.models,
required this.controller,
// required this.models,
// required this.controller,
// required this.context,
}) : super(key: key);
......@@ -22,7 +22,7 @@ class _BuildListPageState extends State<BuildListPage>
with AutomaticKeepAliveClientMixin {
@override
Widget build(BuildContext context) {
/* return GetBuilder<UserOrderController>(
return GetBuilder<UserOrderController>(
tag: widget.tag.toString(),
init: UserOrderController(widget.tag),
builder: (controller) => CustomPullScrollView(
......@@ -51,9 +51,9 @@ class _BuildListPageState extends State<BuildListPage>
// itemCount: widget.models.length,
),
),
);*/
);
return CustomPullScrollView(
/*return CustomPullScrollView(
controller: widget.controller.refreshController,
onRefresh: widget.controller.onRefresh,
onLoading: widget.controller.onLoading,
......@@ -78,7 +78,7 @@ class _BuildListPageState extends State<BuildListPage>
itemCount: widget.controller.orderList.length,
// itemCount: widget.models.length,
),
);
);*/
}
@override
......
......@@ -8,7 +8,9 @@ class BuiltRefunded extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
return GestureDetector(
onTap: () { context.pushNamed(Routes.orderRefunded);},
child:Container(
margin: EdgeInsets.only(left: 10.w, right: 10.w, top: 10.w),
padding: EdgeInsets.only(left: 11.5.w, bottom: 12.w),
decoration: BoxDecoration(
......@@ -24,7 +26,7 @@ class BuiltRefunded extends StatelessWidget {
],
),
child: _buildCom(context),
);
),);
}
Widget _buildCom(BuildContext context) {
......
......@@ -4,6 +4,7 @@ part of user_order_awaiting;
class UserOrderAwaitingController extends GetxController {
// 已完成订单
OrderCompletedInfoModel orderCompletedInfo = OrderCompletedInfoModel();
OrderListModel orderListModel = OrderListModel();
// 应付款、订单编号等
List<OrderCompletedModel> orderAwaitings = [];
......@@ -14,7 +15,14 @@ class UserOrderAwaitingController extends GetxController {
super.onReady();
}
/// 修改用用户信息
void cancelPay() async {
final result = await MineAPI.cancelPay(ordersnum: orderListModel.ordersnum??'');
if (result) {
Toast.show('取消成功');
update();
}
}
......
......@@ -10,6 +10,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get_state_manager/src/simple/get_state.dart';
import 'package:go_router/go_router.dart';
import '../../apis/index.dart';
import '../../models/index.dart';
import '../../routes/index.dart';
......
......@@ -188,8 +188,18 @@ class _UserOrderAwaitingState extends State<UserOrderAwaitingPage> {
),
GestureDetector(
onTap: () {
print('取消订单');
CustomDialog.show(context: context, builder:Text('sdfsf') as WidgetBuilder);
CustomDialog.show(context: context, builder:(context) =>
Text('确定取消订单吗',style: TextStyle(fontSize: 15.w,fontWeight: Fonts.medium,color: Colours.c3),),
cancel: Text('取消',style: TextStyle(fontSize: 12.w,fontWeight: Fonts.medium,color: Colours.c6),),
confirm: Text('确定',style: TextStyle(fontSize: 12.w,fontWeight: Fonts.medium,color: Colours.cFF),),
onCancel: () {
Navigator.of(context).pop();
},
onConfirm: () {
controller.cancelPay();
Navigator.of(context).pop();
Navigator.pop(context);
},);
// Navigator.pop(context);
},
child: Text(
......
part of user_order_refunded;
/// 已完成订单
class UserOrderCRefundedController extends GetxController {
// 已完成订单
OrderCompletedInfoModel orderCompletedInfo = OrderCompletedInfoModel();
// 应付款、订单编号等
List<OrderCompletedModel> orderCompleteds = [];
@override
void onReady() {
getOrderInfo();
super.onReady();
}
/// 获取订单信息
void getOrderInfo() async {
// orderCompletedInfo = await MineAPI.userInfo();
orderCompletedInfo = OrderCompletedInfoModel(id:1,price:'88',totalPay: '58.00',favorable: '5.00',orderId: 'ZJ2023122163728437',payWay: '微信支付',payTime: '2023-12-21 01:25:24',orderTime: '2023-12-21 01:25:15');
orderCompleteds = [
OrderCompletedModel(name: '应付款',value: orderCompletedInfo.totalPay.toString()/*,link: Routes.note*/,other: orderCompletedInfo.favorable.toString()),
OrderCompletedModel(name: '订单编号',value: orderCompletedInfo.orderId.toString()),
OrderCompletedModel(name: '支付方式',value: orderCompletedInfo.payWay.toString()),
OrderCompletedModel(name: '支付时间',value: orderCompletedInfo.payTime.toString()),
OrderCompletedModel(name: '下单时间',value: orderCompletedInfo.orderTime.toString()),
OrderCompletedModel(name: '退款时间',value: orderCompletedInfo.orderTime.toString()),
];
update();
}
}
library user_order_refunded;
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:get/get_state_manager/src/simple/get_controllers.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get_state_manager/src/simple/get_state.dart';
import 'package:go_router/go_router.dart';
import '../../models/index.dart';
import '../../routes/index.dart';
part 'view.dart';
part 'controller.dart';
\ No newline at end of file
part of user_order_refunded;
/// 订单已退款界面
class UserOrderRefundedPage extends StatefulWidget {
const UserOrderRefundedPage({Key? key /*, required this.userInfo*/
})
: super(key: key);
@override
State<UserOrderRefundedPage> createState() => _UserOrderRefundedState();
}
class _UserOrderRefundedState extends State<UserOrderRefundedPage> {
/* late num? selectedGender ; // 选中的性别
@override
void initState() {
super.initState();
selectedGender = widget.userInfo.sex;
// 在这里可以使用 localVariable 进行操作
}*/
@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: () async {
context.pop(true);
return false;
},
child: GetBuilder<UserOrderCRefundedController>(
init: UserOrderCRefundedController(),
builder: (controller) => Scaffold(
appBar: CustomAppBar(
title: const Text('已退款'),
actions: [],
),
body:Column(children: [
Container(
width: double.infinity,
margin: EdgeInsets.symmetric(
horizontal: AppTheme.margin, vertical: AppTheme.margin),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8.w),
color: Colors.white,
boxShadow: [
BoxShadow(
color: Colours.cC7.withOpacity(0.5),
offset: Offset(3.w, 0),
blurRadius: 10.w,
spreadRadius: 0.w,
),
],
),
child: ClipRRect(
borderRadius: BorderRadius.circular(8.w),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Padding(
padding: EdgeInsets.only(
left: 12.0.w, top: 12.0.w, bottom: 12.0.w),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Image.network(
'http://zxts-user-file.oss-cn-beijing.aliyuncs.com/2024-01/20/eb167c2f59f7e34c0ef94a9f1ce736ee64d76a11.jpg',
// 用实际图片链接替换
fit: BoxFit.cover, // 设置适应方式为充满
width: 72.0.w,
height: 86.0.w,
),
Expanded(
child: Padding(
padding: EdgeInsets.only(
left: 12.0.w, top: 5.5.w, right: 23.5.w),
child: Column(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
crossAxisAlignment:
CrossAxisAlignment.start, // 下面的Text靠左
children: [
Container(
height: 62.5.w,
child: Text(
"一想到还有95%的问题留给人类,我就放一想到还有95%的问题留给问题留给",
style: TextStyle(
color: Colours.c3,
fontWeight: Fonts.bold,
fontSize: 13.w,
),
maxLines: 2,
overflow:
TextOverflow.ellipsis, // 超过部分显示省略号
),
),
Container(
alignment: Alignment.topRight,
child: Text(
${controller.orderCompletedInfo.price}",
style: TextStyle(
color: Colours.cAB1941,
fontWeight: Fonts.medium,
fontSize: 14.w,
),
),
)
],
),
),
),
],
),
),
Container(
color: Colours.cLine,
margin: EdgeInsets.only(
left: 10.w, right: 10.w, bottom: 12.w),
height: 1.w,
),
Container(
padding: EdgeInsets.only(
left: 11.5.w, bottom: 8.w, right: 10.w),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: controller.orderCompleteds.map((model) {
return Padding(
padding: EdgeInsets.only(top: 12.w),
child: Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Text(
model.name,
style: TextStyle(
fontSize: 13.w,
height: 1.6.w,
color: Colours.c9),
),
controller.orderCompleteds.indexOf(model) == 0 ?
GestureDetector(
onTap: () {
print('点击了应付款后面');
},
child: Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Text(
'共减 ¥ ${model.other.toString()}',
style: TextStyle(
fontSize: 13.w,
height: 1.6,
color: AppTheme.primary,
),
),
SizedBox(
width: 8.w,
),
Text(
'合计${model.value.toString()}',
style: TextStyle(
fontSize: 13.w,
height: 1.6,
color: Colours.c9,
),
),
Gaps.hGaps8,
Padding(
padding:
EdgeInsets.only(top: 4.w),
child: Image.asset(
'assets/images/right_arrow.png',
),
),
],
))
: Padding(
padding:
EdgeInsets.only(right: 12.5.w),
child: Text(
model.value.toString(),
style: TextStyle(
fontSize: 13.w,
height: 1.6.w,
color: Colours.c9),
),
),
],
),
);
}).toList(),
),
),
SizedBox(
height: 14.5.w,
),
],
),
),
),
SizedBox(height: 4.w,),
Container(
width: double.infinity,
margin: EdgeInsets.symmetric(
horizontal: AppTheme.margin),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8.w),
color: Colors.white,
boxShadow: [
BoxShadow(
color: Colours.cC7.withOpacity(0.5),
offset: Offset(3.w, 0),
blurRadius: 10.w,
spreadRadius: 0.w,
),
],
),
child: ClipRRect(
borderRadius: BorderRadius.circular(8.w),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Text('已退款'),
SizedBox(
height: 14.5.w,
),
Text('已退款'),
SizedBox(
height: 14.5.w,
),
],
),
),
)
],),
)),
);
}
}
......@@ -34,6 +34,7 @@ import 'package:flutter_book/pages/user_notes/index.dart';
import 'package:flutter_book/pages/user_notes_des/index.dart';
import 'package:flutter_book/pages/user_order_awaiting/index.dart';
import 'package:flutter_book/pages/user_order_completed/index.dart';
import 'package:flutter_book/pages/user_order_refunded/index.dart';
import 'package:flutter_book/pages/user_point/index.dart';
import 'package:flutter_book/pages/user_security/index.dart';
import 'package:flutter_book/pages/user_set/index.dart';
......
......@@ -105,6 +105,8 @@ abstract class Routes {
static const orderCompleted= 'order_completed';
// 待付款订单
static const orderAwaiting= 'order_awaiting';
// 已退款订单
static const orderRefunded= 'order_refunded';
......@@ -523,6 +525,15 @@ abstract class Routes {
child: const UserOrderAwaitingPage()
)
),
GoRoute( // 已退款订单
path: '/$orderRefunded',
name: orderRefunded,
pageBuilder: (context, state) =>CupertinoPage(
name: state.uri.toString(),
key: state.pageKey,
child: const UserOrderRefundedPage()
)
),
]
);
......
......@@ -29,7 +29,7 @@ class CustomDialog extends StatelessWidget {
}) {
return showDialog<T>(
context: context,
barrierColor: const Color(0xFF09101D).withOpacity(0.7),
barrierColor: const Color(0xFF09101D).withOpacity(0.6),
builder: (context) => CustomDialog(
title: title,
confirm: confirm,
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论