Commit 80a26f08 ilCode

初始化项目

0 个父辈
正在显示 154 个修改的文件 包含 3610 行增加0 行删除
# cp_offline_manage
线下彩票销售管理应用
# 项目优化的一些技巧
1. listView优化技巧,关闭addAutomaticKeepAlives 和addRepaintBoundaries
2. CustomScrollView 在低端机上可以对cacheExtent预渲染进行调整 默认是 上下250,调整为上下60左右
3.
文件属性发生变化
import 'package:flutter/material.dart';
class ColorConfig {
static const Color baseColor = Color(0xFFF42235);
static const Color baseColorDark = Color(0xFFF42235);
static const Color colorEF2329 = Color(0xFFEF2329);
static const Color colorFF4040 = Color(0xFFFF4040);
static const Color colorFF8488 = Color(0xFFFF8488);
static const Color colorFF761E = Color(0xFFFF761E);
static const Color colorFF6A4F= Color(0xFFFF6A4F);
static const Color colorFEC695= Color(0xFFFEC695);
static const Color colorFF4343= Color(0xFFFF4343);
static const Color colorD1 = Color(0xFFD1D1D1);
static const Color colorF3 = Color(0xFFF3F4F5);
static const Color colorFf6 = Color(0xFFFF6334);
static const Color colorFF8F24 = Color(0xFFFF8F24);
static const Color red = Color(0xFFFF0000);
static const Color color33 = Color(0xFF333333);
static const Color color99 = Color(0xFF999999);
static const Color color88 = Color(0xFF888888);
static const Color color66 = Color(0xFF666666);
static const Color color00 = Color(0xFF000000);
static const Color colorEf = Color(0xFFefefef);
static const Color colorE5 = Color(0xFFE5E5E5);
static const Color color8F = Color(0xFF8F8F8F);
static const Color white = Color(0xFFffffff);
static const Color colorF4f4f4 = Color(0xFFF4F4F4);
static const Color colorF9F9F9 = Color(0xFFF9F9F9);
static const Color colorF8F8F8 = Color(0xFFF8F8F8);
static const Color colorFFF2E9 = Color(0xFFFFF2E9);
static const Color colorCcc = Color(0xFFCCCCCC);
static const Color color_909090 = Color(0xFF909090);
static const Color color_999 = Color(0xFF999999);
static const Color color70 = Color(0xFF707070);
static const Color colorBFCBC9 = Color(0xFFBFCBC9); // 线的
static const Color colorBFBFBF = Color(0xFFBFBFBF); // 线的
static const Color color0BC5A5 = Color(0xFF0BC5A5); //
static const Color color8F9BA0 = Color(0xFF8F9BA0); //
static const Color color919DA2 = Color(0xFF919DA2); //
static const Color color31F9D7 = Color(0xFF31F9D7); //
static const Color colorEDEDED = Color(0xFFEDEDED); //
static const Color color181818 = Color(0xFF181818); //
static const Color colorFF4818 = Color(0xFFFF4818); //
static const Color colorF76B46 = Color(0xFFF76B46); //
static const Color colorFF8B18 = Color(0xFFFF8B18); //
static const Color colorF9FAFB = Color(0xFFF9FAFB); //
static const Color colorE8EDEC = Color(0xFFE8EDEC); //
static const Color color909CA1 = Color(0xFF909CA1); //
static const Color colorBCC3C6 = Color(0xFFBCC3C6); //
static const Color color0DAF93 = Color(0xFF0DAF93); //
static const Color colorBCE7E0= Color(0xFFBCE7E0); //
static const Color color3FEEBE= Color(0xFF3FEEBE); //
static const Color color06DEE0= Color(0xFF06DEE0); //
static const Color colorB4BEC2= Color(0xFFB4BEC2); //
static const Color colorF9FFFE= Color(0xFFF9FFFE); //
static const Color color30F3D1= Color(0xFF30F3D1); //
static const Color color05D2DB= Color(0xFF05D2DB); //
static const Color colorDCFFF9= Color(0xFFDCFFF9); //
static const Color colorE6F6F3= Color(0xFFE6F6F3); //
static const Color colorE3E3E3= Color(0xFFE3E3E3); //
static const Color colorD5DBE0= Color(0xFFD5DBE0); //
static const Color color4BFFE0= Color(0xFF4BFFE0); //
static const Color colorB9E4DD= Color(0xFFB9E4DD); //
static const Color colorF7F7F7= Color(0xFFF7F7F7); //
static const Color colorFFF4ED= Color(0xFFFFF4ED); //
static const Color colorFAFAFA= Color(0xFFFAFAFA); //
static const Color color1EA4FF= Color(0xFF1EA4FF); //
static const Color colorFF3D3D= Color(0xFFFF3D3D); //
static const Color colorFFF6F6= Color(0xFFFFF6F6); //
static const Color colorF2F2F2= Color(0xFFF2F2F2); //
static const Color colorC1C1C1= Color(0xFFC1C1C1); //
static const Color colorA06825= Color(0xFFA06825);
static const Color colorFDF7E8= Color(0xFFFDF7E8);//
static const Color colorFFF8EF= Color(0xFFFFF8EF);//
static const Color color548DEE= Color(0xFF548DEE);//
static const Color colorFFF2E0= Color(0xFFFFF2E0);//
static const Color themeColor= Color(0xFFD63840);//
static const Color color203152= Color(0xFF203152);//
static const Color colorCBCBCB= Color(0xFFCBCBCB);//
static const Color colorE4E8EF= Color(0xFFE4E8EF);//
static const Color colorFE3A3B= Color(0xFFFE3A3B);//
static const Color colorED1B35 = Color(0xFFED1B35); //
static const Color colorF5 = Color(0xFFF5F5F5); //
static const Color colorF6 = Color(0xFFF6F6F6); //
static const Color colorCF = Color(0xFFCFCFCF); //
static const Color colorEE1E3C = Color(0xFFEE1E3C);
static const Color colorFF6D63 = Color(0xFFFF6D63);
static const Color themeColor2 = Color(0xFFF53642);
static const Color colorFEC97B = Color(0xFFFEC97B);
static const Color colorFFE8E8 = Color(0xFFFFE8E8);
static const Color colorF0F0F0 = Color(0xFFF0F0F0);
}
\ No newline at end of file
文件属性发生变化
import 'package:cp_offline_manage/common/values/storage.dart';
import 'package:flutter/cupertino.dart';
import '../utils/share_preferences.dart';
///全局静态数据
class Global {
/// 是否第一次打开
static bool? isFirstOpen;
/// init
static Future init() async {
// 运行初始
WidgetsFlutterBinding.ensureInitialized();
// 工具初始
await SharePreferenceUtils().init();
// 读取设备第一次打开
isFirstOpen = SharePreferenceUtils().getBool(STORAGE_DEVICE_FIRST_OPEN_KEY);
isFirstOpen ??= true;
}
// 保存用户已打开APP
static saveAlreadyOpen() {
SharePreferenceUtils().setBool(STORAGE_DEVICE_FIRST_OPEN_KEY, false);
}
}
\ No newline at end of file
const Map<String, String> enUS = {
};
\ No newline at end of file
const Map<String, String> zhCN = {
};
\ No newline at end of file
import 'package:get/get_navigation/src/root/internacionalization.dart';
import '../l10n/en_us.dart';
import '../l10n/zh_cn.dart';
class Languages extends Translations {
@override
Map<String, Map<String, String>> get keys => {
'zh_CN': zhCN,
'en_US': enUS,
};
}
\ No newline at end of file
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:get/get.dart';
import '../../entity/user_info_entity.dart';
import '../../utils/share_preferences.dart';
import '../values/storage.dart';
// 全局响应数据
class GlobalConfigService extends GetxService {
/// 当前网络状态
var netState = "".obs;
///用户信息
UserInfoEntity userInfoEntity = UserInfoEntity();
///分类信息
final classityList = [];
final Map<String, dynamic> languageMap = {};
final List<ThemeData> themeList = <ThemeData>[];
get currentTheme => themeList[currentThemeIndex];
get language => languageMap[currentLanguage];
var currentLanguage = "zh_CN";
//当前主题 红色
var currentThemeIndex = 1;
///原生交互通道
MethodChannel eventChannel = const MethodChannel('com.q8Store.www');
Future<GlobalConfigService> init() async {
//主题设置
themeList.add(
ThemeData(
primaryColor: Colors.blue,
primarySwatch: Colors.blue,
)
);
themeList.add(
ThemeData(
primaryColor: Colors.red,
primarySwatch: Colors.red,
)
);
themeList.add(
ThemeData(
primaryColor: Colors.lightGreen,
primarySwatch: Colors.lightGreen,
)
);
languageMap["zh_CN"] = {
"name": "中文",
"locale": const Locale('zh', 'CN'),
"flag": "assets/images/national_flag/china_nflag.png"
};
languageMap["en_US"] = {
"name": "英语",
"locale": const Locale('en', 'US'),
"flag": "assets/images/national_flag/us_nflag.png"
};
languageMap["ar_EG"] = {
"name": "阿拉伯语",
"locale": const Locale('ar', 'EG'),
"flag": "assets/images/national_flag/alabo_nflag.png"
};
var tempIndex = SharePreferenceUtils().getInt(STORAGE_APP_THEME_KEY);
currentThemeIndex = tempIndex ?? 1;
initCurLan();
var userL = SharePreferenceUtils().getString(STORAGE_APP_LANGUAGE_KEY);
currentLanguage = userL.isEmpty ? "zh_CN" : userL;
///当前网络状态
return this;
}
void changeTheme(index) {
if(currentThemeIndex != index) {
currentThemeIndex = index;
Get.changeTheme(themeList[currentThemeIndex]);
SharePreferenceUtils().setInt(STORAGE_APP_THEME_KEY, currentThemeIndex);
}
}
void changeLanguages(value) {
var tempL = languageMap[value];
currentLanguage = value;
var tempLocale = tempL["locale"];
Get.updateLocale(tempLocale);
SharePreferenceUtils().setString(STORAGE_APP_LANGUAGE_KEY, currentLanguage);
}
void initCurLan() {
var firstOpen = SharePreferenceUtils().getBool(fistOpen);
// 第一次打开App。设置当前语言撒( )
if (firstOpen == null || firstOpen == false) {
SharePreferenceUtils().setBool(fistOpen, true);
// 当前语言,中文对应:zh_CN, 中文繁体:zh_TW。 英文:en_US, 阿拉伯语言: ar_EG(埃及),ar_KW(科威特)
debugPrint("-----${Get.deviceLocale}"); // 语言_国家
var curLang = Get.deviceLocale;
if (curLang != null) {
debugPrint("国家:-----${curLang.countryCode}");
debugPrint("语言:-----${curLang.languageCode}");
if (curLang.countryCode == 'CN' || curLang.languageCode == 'zh') {
SharePreferenceUtils().setString(STORAGE_APP_LANGUAGE_KEY, "zh_CN");
} else if (curLang.languageCode == 'en') {
SharePreferenceUtils().setString(STORAGE_APP_LANGUAGE_KEY, "en_US");
} else {
SharePreferenceUtils().setString(STORAGE_APP_LANGUAGE_KEY, "ar_EG");
}
}
}
}
}
\ No newline at end of file
文件属性发生变化
文件属性发生变化
文件属性发生变化
文件属性发生变化
/// 设备是否第一次打开
const String STORAGE_DEVICE_FIRST_OPEN_KEY = 'device_first_open';
///App - 国际化配置
const String STORAGE_APP_LANGUAGE_KEY = 'app_current_Language';
///App - 主题配置
const String STORAGE_APP_THEME_KEY = 'app_current_theme';
///请求UDID
const String STORAGE_APP_USER_UDID = 'app_user_udid';
/// 针对语言。
const fistOpen = 'first_open';
\ No newline at end of file
import 'package:flutter/cupertino.dart';
class KeepAliveWrapper extends StatefulWidget {
final Widget child;
const KeepAliveWrapper({Key? key, required this.child}) : super(key: key);
@override
_KeepAliveWrapperState createState() => _KeepAliveWrapperState();
}
class _KeepAliveWrapperState extends State<KeepAliveWrapper>
with AutomaticKeepAliveClientMixin {
@override
Widget build(BuildContext context) {
super.build(context);
return widget.child;
}
@override
bool get wantKeepAlive => true;
}
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../common/colors.dart';
import '../../utils/text_style_ms.dart';
class NormalDialog extends StatelessWidget {
final String title;
final String content;
final String cancelBtnText;
final String okBtnText;
final VoidCallback? okOnClick;
final VoidCallback? cancelOnClick;
final bool showCancelBtn;
final bool showOkBtn;
const NormalDialog({
Key? key,
this.title = 'hint',
this.content = '',
this.okOnClick,
this.cancelOnClick,
this.showCancelBtn = true,
this.showOkBtn = true,
this.cancelBtnText = 'cancel',
this.okBtnText = 'sure',
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Dialog(
insetPadding: EdgeInsets.zero,
backgroundColor: ColorConfig.red.withOpacity(0),
child: Container(
margin: const EdgeInsets.symmetric(horizontal: 34),
padding: const EdgeInsets.only(top: 30),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: ColorConfig.white,
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: Text(
title,
style: const TextStyle(
color: ColorConfig.color33,
fontSize: 18,
fontWeight: FontWeight.w500,
),
),
),
Container(
padding: const EdgeInsets.only(
top: 27, bottom: 44, left: 10, right: 10),
alignment: Alignment.center,
width: double.infinity,
child: Text(
content,
textAlign: TextAlign.center,
style: TextStyleMs.color33_14_400.copyWith(height: 2.0),
),
),
Container(
height: 52,
width: double.infinity,
margin: const EdgeInsets.symmetric(horizontal: 12),
decoration: const BoxDecoration(
border: Border(
top: BorderSide(color: ColorConfig.colorF7F7F7, width: 1),
),
),
child: Row(
children: [
showCancelBtn
? Expanded(
child: InkWell(
onTap: () {
Get.back(result: false);
if (cancelOnClick != null) {
cancelOnClick!();
}
},
child: Container(
child: Text(
cancelBtnText.tr,
style: TextStyleMs.color33_14_400,
),
alignment: Alignment.center,
margin: const EdgeInsets.symmetric(vertical: 6),
decoration: showOkBtn
? const BoxDecoration(
border: Border(
right: BorderSide(
color: ColorConfig.colorF7F7F7,
width: 1,
),
),
)
: const BoxDecoration(),
),
),
)
: Container(),
showOkBtn
? Expanded(
child: InkWell(
onTap: () {
Get.back(result: true);
if (okOnClick != null) {
okOnClick!();
}
},
child: Container(
alignment: Alignment.center,
child: Text(
okBtnText.tr,
style: TextStyleMs.colorFF761E_14_400,
),
),
),
)
: Container(),
],
),
),
],
),
),
);
}
}
/*
* Author: Jpeng
* Email: peng8350@gmail.com
* Time: 2019/5/5 下午2:37
*/
import 'dart:async';
import 'package:flutter/material.dart'
hide RefreshIndicatorState, RefreshIndicator;
import 'package:flutter/foundation.dart';
import 'package:get/get.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
import 'package:flutter/cupertino.dart';
/// QQ ios refresh header effect
class MyWaterDropHeader extends RefreshIndicator {
/// refreshing content
final Widget? refresh;
/// complete content
final Widget? complete;
/// failed content
final Widget? failed;
/// idle Icon center in waterCircle
final Widget idleIcon;
/// waterDrop color,default grey
final Color waterDropColor;
const MyWaterDropHeader({
Key? key,
this.refresh,
this.complete,
Duration completeDuration: const Duration(milliseconds: 600),
this.failed,
this.waterDropColor: Colors.grey,
this.idleIcon: const Icon(
Icons.autorenew,
size: 15,
color: Colors.white,
),
}) : super(
key: key,
height: 60.0,
completeDuration: completeDuration,
refreshStyle: RefreshStyle.UnFollow);
@override
State<StatefulWidget> createState() {
// TODO: implement createState
return _MyWaterDropHeaderState();
}
}
class _MyWaterDropHeaderState extends RefreshIndicatorState<MyWaterDropHeader>
with TickerProviderStateMixin {
AnimationController? _animationController;
late AnimationController _dismissCtl;
@override
void onOffsetChange(double offset) {
// TODO: implement onOffsetChange
final double realOffset =
offset - 44.0; //55.0 mean circleHeight(24) + originH (20) in Painter
// when readyTorefresh
if (!_animationController!.isAnimating)
_animationController!.value = realOffset;
}
@override
Future<void> readyToRefresh() {
// TODO: implement readyToRefresh
_dismissCtl.animateTo(0.0);
return _animationController!.animateTo(0.0);
}
@override
void initState() {
// TODO: implement initState
_dismissCtl = AnimationController(
vsync: this, duration: Duration(milliseconds: 400), value: 1.0);
_animationController = AnimationController(
vsync: this,
lowerBound: 0.0,
upperBound: 50.0,
duration: const Duration(milliseconds: 400));
super.initState();
}
@override
bool needReverseAll() {
// TODO: implement needReverseAll
return false;
}
@override
Widget buildContent(BuildContext context, RefreshStatus? mode) {
// TODO: implement buildContent
Widget? child;
if (mode == RefreshStatus.refreshing) {
child = widget.refresh ??
SizedBox(
width: 25.0,
height: 25.0,
child: defaultTargetPlatform == TargetPlatform.iOS
? const CupertinoActivityIndicator()
: const CircularProgressIndicator(strokeWidth: 2.0),
);
} else if (mode == RefreshStatus.completed) {
child = widget.complete ??
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Icon(
Icons.done,
color: Colors.grey,
),
Container(
width: 15.0,
),
Text(
'已刷新'.tr,
style: const TextStyle(color: Colors.grey),
)
],
);
} else if (mode == RefreshStatus.failed) {
child = widget.failed ??
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Icon(
Icons.close,
color: Colors.grey,
),
Container(
width: 15.0,
),
Text(
'加载失败'.tr,
style: const TextStyle(color: Colors.grey))
],
);
} else if (mode == RefreshStatus.idle || mode == RefreshStatus.canRefresh) {
return FadeTransition(
child: Container(
child: Stack(
children: <Widget>[
RotatedBox(
child: CustomPaint(
child: Container(
height: 60.0,
),
painter: _QqPainter(
color: widget.waterDropColor,
listener: _animationController,
),
),
quarterTurns:
Scrollable.of(context)!.axisDirection == AxisDirection.up
? 10
: 0,
),
Container(
alignment:
Scrollable.of(context)!.axisDirection == AxisDirection.up
? Alignment.bottomCenter
: Alignment.topCenter,
margin:
Scrollable.of(context)!.axisDirection == AxisDirection.up
? const EdgeInsets.only(bottom: 12.0)
: const EdgeInsets.only(top: 12.0),
child: widget.idleIcon,
)
],
),
height: 60.0,
),
opacity: _dismissCtl);
}
return Container(
height: 60.0,
child: Center(
child: child,
),
);
}
@override
void resetValue() {
// TODO: implement resetValue
_animationController!.reset();
_dismissCtl.value = 1.0;
}
@override
void dispose() {
// TODO: implement dispose
_dismissCtl.dispose();
_animationController!.dispose();
super.dispose();
}
}
class _QqPainter extends CustomPainter {
final Color? color;
final Animation<double>? listener;
double get value => listener!.value;
final Paint painter = Paint();
_QqPainter({this.color, this.listener}) : super(repaint: listener);
@override
void paint(Canvas canvas, Size size) {
final double originH = 20.0;
final double middleW = size.width / 2;
final double circleSize = 12.0;
final double scaleRatio = 0.1;
final double offset = value;
painter.color = color!;
canvas.drawCircle(Offset(middleW, originH), circleSize, painter);
Path path = Path();
path.moveTo(middleW - circleSize, originH);
//drawleft
path.cubicTo(
middleW - circleSize,
originH,
middleW - circleSize + value * scaleRatio,
originH + offset / 5,
middleW - circleSize + value * scaleRatio * 2,
originH + offset);
path.lineTo(
middleW + circleSize - value * scaleRatio * 2, originH + offset);
//draw right
path.cubicTo(
middleW + circleSize - value * scaleRatio * 2,
originH + offset,
middleW + circleSize - value * scaleRatio,
originH + offset / 5,
middleW + circleSize,
originH);
//draw upper circle
path.moveTo(middleW - circleSize, originH);
path.arcToPoint(Offset(middleW + circleSize, originH),
radius: Radius.circular(circleSize));
//draw lowwer circle
path.moveTo(
middleW + circleSize - value * scaleRatio * 2, originH + offset);
path.arcToPoint(
Offset(middleW - circleSize + value * scaleRatio * 2, originH + offset),
radius: Radius.circular(value * scaleRatio));
path.close();
canvas.drawPath(path, painter);
}
@override
bool shouldRepaint(CustomPainter oldDelegate) {
// TODO: implement shouldRepaint
return oldDelegate != this;
}
}
class Api {
static const String BASE_URL = 'http://47.110.144.21:8989';
static const bool PRODUCT = false;
}
\ No newline at end of file
import 'dart:convert';
import 'package:cp_offline_manage/generated/json/base/json_field.dart';
import 'package:cp_offline_manage/generated/json/user_info_entity.g.dart';
@JsonSerializable()
class UserInfoEntity {
int? id;
String? name;
UserInfoEntity();
factory UserInfoEntity.fromJson(Map<String, dynamic> json) => $UserInfoEntityFromJson(json);
Map<String, dynamic> toJson() => $UserInfoEntityToJson(this);
@override
String toString() {
return jsonEncode(this);
}
}
\ No newline at end of file
// ignore_for_file: non_constant_identifier_names
// ignore_for_file: camel_case_types
// ignore_for_file: prefer_single_quotes
// This file is automatically generated. DO NOT EDIT, all your changes would be lost.
import 'package:cp_offline_manage/entity/user_info_entity.dart';
import 'package:cp_offline_manage/generated/json/user_info_entity.g.dart';
JsonConvert jsonConvert = JsonConvert();
class JsonConvert {
T? convert<T>(dynamic value) {
if (value == null) {
return null;
}
return asT<T>(value);
}
List<T?>? convertList<T>(List? value) {
if (value == null) {
return null;
}
try {
return value.map((e) => asT<T>(e)).toList();
} catch (e, stackTrace) {
print('asT<$T> $e $stackTrace');
return [];
}
}
List<T>? convertListNotNull<T>(List? value) {
if (value == null) {
return null;
}
try {
return value.map((e) => asT<T>(e)!).toList();
} catch (e, stackTrace) {
print('asT<$T> $e $stackTrace');
return [];
}
}
T? asT<T extends Object?>(dynamic value) {
if (value is T) {
return value;
}
String type = T.toString();
try {
final String valueS = value.toString();
if (type == "String") {
return valueS as T;
} else if (type == "int") {
return int.parse(valueS) as T;
} else if (type == "double") {
return double.parse(valueS) as T;
} else if (type == "DateTime") {
return DateTime.parse(valueS) as T;
} else if (type == "bool") {
if (valueS == '0' || valueS == '1') {
return (valueS == '1') as T;
}
return (valueS == 'true') as T;
} else {
return JsonConvert.fromJsonAsT<T>(value);
}
} catch (e, stackTrace) {
print('asT<$T> $e $stackTrace');
return null;
}
}
//Go back to a single instance by type
static _fromJsonSingle<M>( json) {
String type = M.toString();
if(type == (UserInfoEntity).toString()){
return UserInfoEntity.fromJson(json);
}
return null;
}
//list is returned by type
static M _getListChildType<M>(List data) {
if(<UserInfoEntity>[] is M){
return data.map<UserInfoEntity>((e) => UserInfoEntity.fromJson(e)).toList() as M;
}
throw Exception("not found");
}
static M fromJsonAsT<M>(json) {
if (json is List) {
return _getListChildType<M>(json);
} else {
return _fromJsonSingle<M>(json) as M;
}
}
}
\ No newline at end of file
// ignore_for_file: non_constant_identifier_names
// ignore_for_file: camel_case_types
// ignore_for_file: prefer_single_quotes
// This file is automatically generated. DO NOT EDIT, all your changes would be lost.
class JsonSerializable{
const JsonSerializable();
}
class JSONField {
//Specify the parse field name
final String? name;
//Whether to participate in toJson
final bool? serialize;
//Whether to participate in fromMap
final bool? deserialize;
const JSONField({this.name, this.serialize, this.deserialize});
}
import 'package:cp_offline_manage/generated/json/base/json_convert_content.dart';
import 'package:cp_offline_manage/entity/user_info_entity.dart';
UserInfoEntity $UserInfoEntityFromJson(Map<String, dynamic> json) {
UserInfoEntity userInfoEntity = UserInfoEntity();
var id = jsonConvert.convert<int>(json['id']);
if (id != null) {
userInfoEntity.id = id;
}
var name = jsonConvert.convert<String>(json['name']);
if (name != null) {
userInfoEntity.name = name;
}
return userInfoEntity;
}
Map<String, dynamic> $UserInfoEntityToJson(UserInfoEntity entity) {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = entity.id;
data['name'] = entity.name;
return data;
}
\ No newline at end of file
import 'package:cp_offline_manage/common/langs/languages.dart';
import 'package:cp_offline_manage/router/route_config.dart';
import 'package:cp_offline_manage/utils/log.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:get/get.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
import 'package:syncfusion_localizations/syncfusion_localizations.dart';
import 'common/colors.dart';
import 'common/global.dart';
import 'common/services/global_config.dart';
import 'component/my_waterdrop_header.dart';
import 'package:syncfusion_flutter_datepicker/datepicker.dart';
Future<void> main() async {
await initServices();
runApp(const MyApp());
//
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.dark);
if (GetPlatform.isAndroid) {
// 设置android状态栏为透明的沉浸。
SystemChrome.setSystemUIOverlayStyle(
const SystemUiOverlayStyle(statusBarColor: Colors.transparent),
);
}
}
Future<void> initServices() async {
LogUtils.i('starting services ...');
await Global.init();
await Get.putAsync(() => GlobalConfigService().init());
LogUtils.i('All services started...');
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return RefreshConfiguration(
headerBuilder: () => const MyWaterDropHeader(
waterDropColor: ColorConfig.themeColor
),
footerBuilder: () => const ClassicFooter(
loadingText: '加载中',
idleText: '上拉加载',
noDataText: '没有更多数据了',
failedText: '加载失败',
),
headerTriggerDistance: 80.0,
springDescription: const SpringDescription(stiffness: 170, damping: 16, mass: 1.9),
maxOverScrollExtent :100, //头部最大可以拖动的范围,如果发生冲出视图范围区域,请设置这个属性
enableScrollWhenRefreshCompleted: true,
enableLoadingWhenFailed : true,
hideFooterWhenNotFull: true,
enableBallisticLoad: true,
child: GetMaterialApp(
title: '商城',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primaryColor: ColorConfig.themeColor,
primarySwatch: Colors.red
),
initialRoute: RouteConfig.splashPageKey,
getPages: RouteConfig.getPages,
defaultTransition: Transition.rightToLeft,
transitionDuration: const Duration(milliseconds: 250),
translations: Languages(),
localizationsDelegates: const [
RefreshLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
SfGlobalLocalizations.delegate
],
// 我的翻译
locale: Get.find<GlobalConfigService>().language["locale"],
supportedLocales: const [
Locale('zh'),
Locale('en'),
],
// 将会按照指定的语言翻译
fallbackLocale: const Locale('zh'),
// FlutterEasyLoading 初始化一个 loading。
builder: (context, child) => FlutterEasyLoading(
child: Scaffold(
body: GestureDetector(
onTap: () {
// 点击空白处,键盘消失。
FocusScopeNode currentFocus = FocusScope.of(context);
if (!currentFocus.hasPrimaryFocus &&
currentFocus.focusedChild != null) {
FocusManager.instance.primaryFocus?.unfocus();
}
},
child: child,
),
),
),
)
);
}
}
import 'package:get/get.dart';
import '../../router/route_config.dart';
import 'package:cp_offline_manage/utils/log.dart';
class Character_entryLogic extends GetxController {
var characterList = [
{"type": 1, "title": "总店主", "desc": "线下多家彩票店老板", "isSelected": false},
{"type": 2, "title": "打票员", "desc": "彩票店专业打票工作人员", "isSelected": false},
].obs;
// 下一步按钮是否可以点击标识
var isEnable = false.obs;
// 当前选中身份类型
var curSelectedType = 0;
void updateState(int index) {
characterList.asMap().forEach((idx, character) {
character["isSelected"] = index == idx;
});
isEnable.value = true;
curSelectedType = characterList[index]["type"] as int;
update();
}
void jumpToLoginPage() {
Get.toNamed(RouteConfig.loginKey, arguments: {'type' : curSelectedType});
}
}
import 'package:cp_offline_manage/common/colors.dart';
import 'package:cp_offline_manage/pages/login/login_logic.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'character_entry_logic.dart';
class Character_entryPage extends GetView<Character_entryLogic> {
const Character_entryPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: [
_buildHeader(),
GetBuilder<Character_entryLogic>(
builder: (logic) {
return _buildBody(context);
},
),
Obx(() {
return Container(
margin: EdgeInsets.only(bottom: 60),
height: 50,
width: double.infinity,
color:
controller.isEnable.value ? Color(0xFFFF562F) : Colors.grey,
child: TextButton(
onPressed: controller.isEnable.value
? () {
controller.jumpToLoginPage();
}
: null,
child: Text(
'下一步',
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
fontSize: 16),
),
),
);
})
],
),
);
}
// 头部
Widget _buildHeader() {
return Container(
height: 180,
color: ColorConfig.colorF0F0F0,
child: Column(
children: [
Container(
width: double.infinity, // 将 Container 的宽度设置为屏幕宽度
margin: EdgeInsets.only(top: 80, left: 20),
child: Text(
"请选择您的身份",
style: TextStyle(
color: Colors.black,
fontWeight: FontWeight.bold,
fontSize: 20),
textAlign: TextAlign.left,
),
),
Container(
width: double.infinity, // 将 Container 的宽度设置为屏幕宽度
margin: EdgeInsets.only(top: 15, left: 20),
child: Text(
"我们会对每种身份设定合理的权限",
style: TextStyle(color: Colors.black, fontSize: 16),
textAlign: TextAlign.left,
),
),
],
),
);
}
// body
Widget _buildBody(BuildContext context) {
return Expanded(
child: Container(
alignment: Alignment.topLeft,
margin: EdgeInsets.only(top: 20),
child: Column(
children: List.generate(controller.characterList.length, (index) {
var item = controller.characterList[index];
return _bodyItem(index, controller);
}),
),
));
}
Widget _bodyItem(int index, Character_entryLogic logic) {
var item = logic.characterList[index];
return Container(
color: ColorConfig.colorF0F0F0,
alignment: Alignment.centerLeft,
margin: EdgeInsets.symmetric(horizontal: 15),
child: Column(
children: [
Container(
child: Row(
children: [
Expanded(
child: Column(
children: [
InkWell(
child: Container(
height: 80,
alignment: Alignment.centerLeft,
padding: EdgeInsets.only(
left: 20,
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
item["title"].toString(),
style: TextStyle(
color: Colors.black,
fontWeight: FontWeight.bold,
fontSize: 20),
textAlign: TextAlign.left,
),
SizedBox(
height: 6,
),
Text(
item["desc"].toString(),
style: TextStyle(
color: Colors.black, fontSize: 15),
textAlign: TextAlign.left,
),
],
),
),
onTap: () {
controller.updateState(index);
},
),
],
)),
Container(
width: 40,
alignment: Alignment.center,
child: Image(
image: AssetImage("assets/images/home_icon/" +
(item["isSelected"] as bool
? "icon_selected.png"
: "icon_unselected.png")),
width: 24,
height: 24,
)),
],
),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(5),
border: Border.all(
width: 1,
color: item["isSelected"] as bool
? Color(0xFFFF562F)
: Colors.transparent,
),
),
),
Container(
color: Color(0xFFFAFAFA),
alignment: Alignment.centerLeft,
height: 20,
)
],
));
}
}
import 'package:cp_offline_manage/router/route_config.dart';
import 'package:get/get.dart';
class Finance_mainLogic extends GetxController {
var list = [
{
"type": 1,
"name": '竞彩足球'
},
{
"type": 2,
"name": '竞彩足球'
},
{
"type": 3,
"name": '竞彩足球'
},
{
"type": 1,
"name": '大乐透'
},
];
@override
void onReady() {
// TODO: implement onReady
super.onReady();
}
///跳转到打票方案页面
void jumpToScheme() {
Get.toNamed(RouteConfig.finance_scheme_key);
}
}
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../../common/colors.dart';
import 'finance_main_logic.dart';
class Finance_mainPage extends GetView<Finance_mainLogic> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('票务'),
centerTitle: true,
backgroundColor: ColorConfig.themeColor,
),
body: Container(
alignment: Alignment.topLeft,
child: ListView.builder(
itemBuilder: (item, index) {
var item2 = controller.list[index];
return Container(
padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 12),
decoration: const BoxDecoration(
color: ColorConfig.white,
border: Border(bottom: BorderSide(color: ColorConfig.colorF2F2F2, width: 5, style: BorderStyle.solid))
),
child: InkWell(
child: Row(
children: [
Expanded(
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
RichText(
text: TextSpan(
text: item2['name'] as String,
style: TextStyle(color: ColorConfig.color33, fontWeight: FontWeight.bold, fontSize: 15),
children: [
const WidgetSpan(child: SizedBox(width: 5,)),
item2['type'] == 1 ? WidgetSpan(
child: Container(
width: 18,
height: 18,
alignment: Alignment.center,
decoration: BoxDecoration(
color: ColorConfig.red,
borderRadius: BorderRadius.all(Radius.circular(9))
),
child: Text('急', style: TextStyle(color: ColorConfig.white, fontSize: 8),),
),
alignment: PlaceholderAlignment.middle
) : const WidgetSpan(child: SizedBox())
]
)
),
_buildType(item2['type'])
],
),
const SizedBox(height: 5,),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("5串1 20倍 3000.00元", style: TextStyle(color: ColorConfig.themeColor),),
Text("体育西路店")
],
)
],
)
),
const Icon(Icons.keyboard_arrow_right, size: 30, color: ColorConfig.color99,)
],
),
onTap: () {
controller.jumpToScheme();
},
),
);
},
itemCount: controller.list.length,
),
)
);
}
Text _buildType(type) {
var txt;
if(type == 1) {
txt = '等待出票';
} else if(type == 2) {
txt = '等待兑奖';
} else if(type == 3) {
txt = '等待开奖';
} else {
txt = '其他状态';
}
return Text(
txt,
style: TextStyle(color: ColorConfig.color548DEE, fontSize: 15),
);
}
}
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../../common/colors.dart';
import 'scheme_logic.dart';
class SchemePage extends GetView<SchemeLogic> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('方案详情'),
centerTitle: true,
backgroundColor: ColorConfig.themeColor,
actions: [
Container(
alignment: Alignment.center,
margin: EdgeInsets.only(right: 15),
child: InkWell(
child: Text('操作记录', style: TextStyle(fontSize: 15),),
),
)
],
),
body: Column(
children: [
Container(
alignment: Alignment.centerLeft,
color: ColorConfig.white,
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 12),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("等待出票"),
Icon(Icons.keyboard_arrow_right, size: 24, color: ColorConfig.color99,)
],
),
),
const Divider(color: ColorConfig.colorCBCBCB, height: 0.5,),
Container(
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 12),
color: ColorConfig.white,
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("体育西路店", style: TextStyle(color: ColorConfig.color548DEE, fontSize: 15),),
Icon(Icons.keyboard_arrow_right, size: 24, color: ColorConfig.color548DEE,)
],
),
const SizedBox(height: 15,),
const Divider(color: ColorConfig.colorCBCBCB, height: 0.5,),
const SizedBox(height: 15,),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("金额: 20元 5倍", style: TextStyle(color: ColorConfig.color99),),
SizedBox(),
],
),
const SizedBox(height: 10,),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("竞彩足球混合过关", style: TextStyle(color: ColorConfig.color99),),
Text("5场 5串1", style: TextStyle(color: ColorConfig.color99),),
],
),
],
),
),
const Divider(color: ColorConfig.colorCBCBCB, height: 0.5,),
Container(
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 12),
margin: const EdgeInsets.only(top: 8),
color: ColorConfig.white,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("选号内容", style: TextStyle(color: ColorConfig.color33, fontSize: 16, fontWeight: FontWeight.bold),),
InkWell(
child: RichText(
text: TextSpan(
text: "1票",
style: TextStyle(color: ColorConfig.color99, fontSize: 14),
children: [
WidgetSpan(child: SizedBox(width: 10,)),
TextSpan(
text: "未出票, 点击查看内容",
style: TextStyle(color: ColorConfig.color548DEE, fontSize: 14),
),
WidgetSpan(
alignment: PlaceholderAlignment.middle,
child: Icon(Icons.keyboard_arrow_right, size: 18, color: ColorConfig.color99,)
),
]
)
),
onTap: () {
controller.openBetInfo();
},
)
],
),
),
const Divider(color: ColorConfig.colorCBCBCB, height: 0.5,),
Container(
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 12),
margin: const EdgeInsets.only(top: 8),
color: ColorConfig.white,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
RichText(
text: TextSpan(
text: "票照片",
style: TextStyle(color: ColorConfig.color33, fontSize: 16, fontWeight: FontWeight.bold),
children: [
const WidgetSpan(child: SizedBox(width: 8,)),
WidgetSpan(
alignment: PlaceholderAlignment.middle,
child: Container(
padding: EdgeInsets.symmetric(horizontal: 8),
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(3)),
border: Border.all(color: ColorConfig.colorFF3D3D, width: 1, style: BorderStyle.solid)
),
child: Text('已传照片', style: TextStyle(fontSize: 12, color: ColorConfig.colorFF3D3D),),
)
),
]
)
),
RichText(
text: TextSpan(
text: "查看/重传",
style: TextStyle(color: ColorConfig.color548DEE, fontSize: 14),
children: [
WidgetSpan(
child: Icon(Icons.keyboard_arrow_right, size: 18, color: ColorConfig.color99,),
alignment: PlaceholderAlignment.middle
),
]
)
)
],
),
)
],
),
);
}
}
import 'package:get/get.dart';
import 'package:flutter/cupertino.dart';
import '../../../router/route_config.dart';
class Account_totalLogic extends GetxController {
var selectIndex = 0;
TextEditingController textController = TextEditingController();
FocusNode focusNode = FocusNode();
var options = ["月销量", "年销量", "月兑奖", "年兑奖"];
///改变栏目
void changeSelect(index) {
if(index != selectIndex) {
selectIndex = index;
update();
}
}
///搜索
void searchAction({bool isLoading = false}) async {
}
///根据输入框文字判断是否显示工具栏
void changeToolForWords(String s) {
}
///跳转到店面账户详情详情页
void jumpToDetail() {
Get.toNamed(RouteConfig.account_total_detail_key);
}
}
import 'package:get/get.dart';
class Account_total_detailLogic extends GetxController {
}
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'account_total_detail_logic.dart';
import '../../../../common/colors.dart';
class Account_total_detailPage extends GetView<Account_total_detailLogic> {
const Account_total_detailPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
final logic = Get.put(Account_total_detailLogic());
return Scaffold(
appBar: AppBar(
title: const Text('体育路1门店'),
centerTitle: true,
backgroundColor: ColorConfig.themeColor,
),
body: Container(
child: Text("店面账户总账详情"),
)
);
}
}
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:syncfusion_flutter_datepicker/datepicker.dart';
import '../../../../common/colors.dart';
import '../../../../utils/log.dart';
class CommissionLogic extends GetxController {
@override
void onReady() {
// TODO: implement onReady
super.onReady();
}
///选择日期
void selectDate() {
Get.bottomSheet(
Container(
height: 350,
color: Colors.white,
child: Column(
children: [
Container(
height: 40,
alignment: Alignment.centerLeft,
padding: const EdgeInsets.symmetric(horizontal: 12),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Text('选择日期', style: TextStyle(fontSize: 18, color: ColorConfig.color33, fontWeight: FontWeight.bold),),
InkWell(
child: Container(
width: 60,
height: 26,
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(4)),
color: ColorConfig.themeColor
),
child: Text('确定', style: TextStyle(color: ColorConfig.white, fontSize: 15),),
),
onTap: () { Get.back(); },
)
],
),
),
SfDateRangePicker(
onSelectionChanged: _onSelectionChanged,
selectionMode: DateRangePickerSelectionMode.range,
initialSelectedRange: PickerDateRange(
DateTime.now().subtract(const Duration(days: 7)),
DateTime.now().subtract(const Duration(days: 1))),
)
],
),
)
);
}
void _onSelectionChanged(DateRangePickerSelectionChangedArgs args) {
var aaa;
if (args.value is PickerDateRange) {
aaa = '${args.value.startDate} -'
' ${args.value.endDate ?? args.value.startDate}';
} else if (args.value is DateTime) {
aaa = args.value.toString();
} else if (args.value is List<DateTime>) {
aaa = args.value.length.toString();
} else {
aaa = args.value.length.toString();
}
LogUtils.e('--------${aaa}');
}
}
import 'package:cp_offline_manage/utils/text_style_ms.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../../../common/colors.dart';
import 'commission_logic.dart';
class CommissionPage extends GetView<CommissionLogic> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('提成管理'),
centerTitle: true,
backgroundColor: ColorConfig.themeColor,
actions: [
Container(
alignment: Alignment.center,
margin: const EdgeInsets.only(right: 20),
child: InkWell(
child: const Text('选择日期'),
onTap: () { controller.selectDate(); },
),
)
]
),
body: GetBuilder<CommissionLogic>(builder: (logic) {
return ListView.builder(
itemBuilder:(ctx, index) {
return Container(
alignment: Alignment.centerLeft,
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 10),
color: index %2 == 0 ? Colors.white : ColorConfig.colorF2F2F2,
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('销售员${index+1}', style: TextStyleMs.color33_16_400,),
Text('销售额: 20000', style: TextStyleMs.color99_14_500,),
],
),
const SizedBox(height: 12,),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('总提成:6000'),
],
),
],
),
);
},
itemCount: 12,
);
},)
);
}
}
import 'package:cp_offline_manage/router/route_config.dart';
import 'package:cp_offline_manage/utils/log.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
class Croak_happyLogic extends GetxController {
var touchedIndex = -1;
var data_list = [
{
'title': '人员管理',
'key': RouteConfig.croak_happy_personnel_key
},
{
'title': '拿票登记',
'key': RouteConfig.croak_happy_get_ticket_key
},
{
'title': '回收登记',
'key': RouteConfig.croak_happy_in_ticket_key
},
{
'title': '销售查询',
'key': RouteConfig.croak_happy_sale_key
},
{
'title': '提成统计',
'key': RouteConfig.croak_happy_commission_key
}
];
@override
void onReady() {
// TODO: implement onReady
super.onReady();
}
void updateIndex(index) {
touchedIndex = index;
update();
}
void jumpPage(url) {
Get.toNamed(url);
}
}
import 'package:cp_offline_manage/common/colors.dart';
import 'package:fl_chart/fl_chart.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'croak_happy_logic.dart';
class Croak_happyPage extends GetView<Croak_happyLogic> {
const Croak_happyPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('刮刮乐'),
centerTitle: true,
backgroundColor: ColorConfig.themeColor,
),
body: GetBuilder<Croak_happyLogic>(builder: (logic) {
return GridView.builder(
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
mainAxisSpacing: 10,
crossAxisSpacing: 10,
childAspectRatio: 1,
),
itemBuilder: (context, index) {
var data = controller.data_list[index];
return InkWell(
child: Container(
alignment: Alignment.center,
color: ColorConfig.white,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Icon(Icons.add_box),
const SizedBox(height: 5,),
Text(data['title']!)
],
),
),
onTap: () { controller.jumpPage(data['key']); },
);
},
itemCount: controller.data_list.length,
);
},)
);
}
Widget _buildPie() {
return AspectRatio(
aspectRatio: 1.3,
child: Row(
children: <Widget>[
const SizedBox(
height: 18,
),
Expanded(
child: AspectRatio(
aspectRatio: 1,
child: PieChart(
PieChartData(
pieTouchData: PieTouchData(
touchCallback: (FlTouchEvent event, pieTouchResponse) {
if (!event.isInterestedForInteractions ||
pieTouchResponse == null ||
pieTouchResponse.touchedSection == null) {
controller.updateIndex(-1);
return;
}
controller.updateIndex(pieTouchResponse
.touchedSection!.touchedSectionIndex);
},
),
borderData: FlBorderData(
show: false,
),
sectionsSpace: 0,
centerSpaceRadius: 40,
sections: showingSections(),
),
),
),
),
Column(
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.start,
children: const [
Text('First'),
SizedBox(
height: 4,
),
Text('Second'),
SizedBox(
height: 4,
),
Text('Third'),
SizedBox(
height: 4,
),
Text('Fourth'),
SizedBox(
height: 18,
),
],
),
const SizedBox(
width: 28,
),
],
),
);
}
List<PieChartSectionData> showingSections() {
return List.generate(4, (i) {
final isTouched = i == controller.touchedIndex;
final fontSize = isTouched ? 25.0 : 16.0;
final radius = isTouched ? 60.0 : 50.0;
const shadows = [Shadow(color: Colors.black, blurRadius: 2)];
switch (i) {
case 0:
return PieChartSectionData(
color: Colors.blue,
value: 40,
title: '40%',
radius: radius,
titleStyle: TextStyle(
fontSize: fontSize,
fontWeight: FontWeight.bold,
color: ColorConfig.themeColor,
shadows: shadows,
),
);
case 1:
return PieChartSectionData(
color: Colors.yellow,
value: 30,
title: '30%',
radius: radius,
titleStyle: TextStyle(
fontSize: fontSize,
fontWeight: FontWeight.bold,
color: ColorConfig.themeColor,
shadows: shadows,
),
);
case 2:
return PieChartSectionData(
color: Colors.purple,
value: 15,
title: '15%',
radius: radius,
titleStyle: TextStyle(
fontSize: fontSize,
fontWeight: FontWeight.bold,
color: ColorConfig.themeColor,
shadows: shadows,
),
);
case 3:
return PieChartSectionData(
color: Colors.green,
value: 15,
title: '15%',
radius: radius,
titleStyle: TextStyle(
fontSize: fontSize,
fontWeight: FontWeight.bold,
color: ColorConfig.themeColor,
shadows: shadows,
),
);
default:
throw Error();
}
});
}
}
import 'package:get/get.dart';
import '../../../../component/dialog/normal_dialog.dart';
import '../../../../utils/toast_utils.dart';
class Get_ticketLogic extends GetxController {
@override
void onReady() {
// TODO: implement onReady
super.onReady();
}
///确认拿票
void config() async {
var flag = await Get.dialog(const NormalDialog(
title: '提示',
content: '拿票人: 张三 | 金额: 2100元 | 日期: 2023-04-45',
okBtnText: '确认',
cancelBtnText: '取消',
));
if(flag) {
ToastUtils.show("已添加记录!");
Get.back();
}
}
}
import 'package:cp_offline_manage/utils/text_style_ms.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../../../common/colors.dart';
import 'get_ticket_logic.dart';
class Get_ticketPage extends GetView<Get_ticketLogic> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('拿票登记'),
centerTitle: true,
backgroundColor: ColorConfig.themeColor,
),
body: Padding(
padding: EdgeInsets.symmetric(horizontal: 12, vertical: 12),
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('拿票日期:', style: TextStyle(color: ColorConfig.color33, fontSize: 16),),
Text('20223-04-25', style: TextStyle(color: ColorConfig.themeColor, fontSize: 16),),
],
),
const SizedBox(height: 20,),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('拿票人:', style: TextStyle(color: ColorConfig.color33, fontSize: 16),),
Text('选择拿票人>>', style: TextStyle(color: ColorConfig.color548DEE, fontSize: 16),),
],
),
const SizedBox(height: 20,),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('刮刮乐1(5元面值)', style: TextStyle(color: ColorConfig.color33, fontSize: 16),),
Text('40张 200元', style: TextStyle(color: ColorConfig.color33, fontSize: 16),),
Text('修改>>', style: TextStyle(color: ColorConfig.color548DEE, fontSize: 16),),
],
),
const SizedBox(height: 20,),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('刮刮乐2(10元面值)', style: TextStyle(color: ColorConfig.color33, fontSize: 16),),
Text('90张 900元', style: TextStyle(color: ColorConfig.color33, fontSize: 16),),
Text('修改>>', style: TextStyle(color: ColorConfig.color548DEE, fontSize: 16),),
],
),
const SizedBox(height: 20,),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('刮刮乐3(20元面值)', style: TextStyle(color: ColorConfig.color33, fontSize: 16),),
Text('50张 1000元', style: TextStyle(color: ColorConfig.color33, fontSize: 16),),
Text('修改>>', style: TextStyle(color: ColorConfig.color548DEE, fontSize: 16),),
],
),
const SizedBox(height: 20,),
Container(
alignment: Alignment.center,
width: 120,
margin: EdgeInsets.symmetric(horizontal: 20, vertical: 10),
padding: EdgeInsets.symmetric(vertical: 5),
decoration: BoxDecoration(
color: ColorConfig.themeColor,
borderRadius: BorderRadius.all(Radius.circular(4))
),
child: Text('继续添加', style: TextStyle(color: ColorConfig.white, fontSize: 16),),
),
const SizedBox(height: 20,),
Container(
alignment: Alignment.centerLeft,
child: Text('总金额: 2100元', style: TextStyle(color: ColorConfig.themeColor, fontSize: 16),),
),
const SizedBox(height: 20,),
InkWell(
child: Container(
alignment: Alignment.center,
margin: EdgeInsets.symmetric(horizontal: 20, vertical: 10),
padding: EdgeInsets.symmetric(vertical: 5),
decoration: BoxDecoration(
color: ColorConfig.themeColor,
borderRadius: BorderRadius.all(Radius.circular(4))
),
child: Text('确认拿票', style: TextStyle(color: ColorConfig.white, fontSize: 16),),
),
onTap: () { controller.config(); },
),
],
),
)
);
}
}
import 'package:cp_offline_manage/common/colors.dart';
import 'package:cp_offline_manage/utils/text_style_ms.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../../../component/dialog/normal_dialog.dart';
import '../../../../utils/toast_utils.dart';
class Personnel_manageLogic extends GetxController {
var data_list = [1,2,3,4,5,6,7,8,9,10,11,12];
@override
void onReady() {
// TODO: implement onReady
super.onReady();
}
///删除用户
void deletePerson(index) async {
var flag = await Get.dialog(const NormalDialog(
title: '提示',
content: '是否删除该人员?',
okBtnText: '删除',
cancelBtnText: '取消',
));
if(flag) {
data_list.removeAt(index);
update();
ToastUtils.show("该人员已删除!");
}
}
void addPerson() {
Get.bottomSheet(
Container(
color: Colors.white,
padding: const EdgeInsets.symmetric(horizontal: 12),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const SizedBox(height: 10,),
Container(
alignment: Alignment.center,
child: Text('添加人员', style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18, color: ColorConfig.color33),),
),
const SizedBox(height: 20,),
const Text('电话号码: 18900010001' , style: TextStyle(fontSize: 16, color: ColorConfig.color33)),
const SizedBox(height: 10,),
const Text('性别: 男' , style: TextStyle(fontSize: 16, color: ColorConfig.color33)),
const SizedBox(height: 10,),
const Text('地址: xxxxxxxxxxxx' , style: TextStyle(fontSize: 16, color: ColorConfig.color33)),
const SizedBox(height: 10,),
const Text('提成: 3.5%' , style: TextStyle(fontSize: 16, color: ColorConfig.themeColor)),
const SizedBox(height: 30,),
InkWell(
child: Container(
alignment: Alignment.center,
padding: const EdgeInsets.symmetric(vertical: 6),
decoration: const BoxDecoration(
color: ColorConfig.themeColor,
borderRadius: BorderRadius.all(Radius.circular(4))
),
child: Text('添加', style: TextStyle(fontWeight: FontWeight.bold, fontSize: 15, color: ColorConfig.white),),
),
onTap: () {
data_list.add(5);
ToastUtils.show("已添加!");
update();
Get.back();
},
),
],
),
)
);
}
void editPerson(index) {
Get.bottomSheet(
Container(
color: Colors.white,
padding: const EdgeInsets.symmetric(horizontal: 12),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const SizedBox(height: 10,),
Container(
alignment: Alignment.center,
child: Text('编辑人员', style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18, color: ColorConfig.color33),),
),
const SizedBox(height: 20,),
const Text('电话号码: 18900010001' , style: TextStyle(fontSize: 16, color: ColorConfig.color33)),
const SizedBox(height: 10,),
const Text('性别: 男' , style: TextStyle(fontSize: 16, color: ColorConfig.color33)),
const SizedBox(height: 10,),
const Text('地址: xxxxxxxxxxxx' , style: TextStyle(fontSize: 16, color: ColorConfig.color33)),
const SizedBox(height: 30,),
InkWell(
child: Container(
alignment: Alignment.center,
padding: const EdgeInsets.symmetric(vertical: 6),
decoration: const BoxDecoration(
color: ColorConfig.themeColor,
borderRadius: BorderRadius.all(Radius.circular(4))
),
child: Text('修改', style: TextStyle(fontWeight: FontWeight.bold, fontSize: 15, color: ColorConfig.white),),
),
onTap: () {
ToastUtils.show("已修改!");
update();
Get.back();
},
),
],
),
)
);
}
}
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../../../common/colors.dart';
import 'personnel_manage_logic.dart';
class Personnel_managePage extends GetView<Personnel_manageLogic> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('人员管理'),
centerTitle: true,
backgroundColor: ColorConfig.themeColor,
),
body: GetBuilder<Personnel_manageLogic>(builder: (logic){
return Column(
children: [
InkWell(
child: Container(
alignment: Alignment.center,
margin: EdgeInsets.symmetric(vertical: 12, horizontal: 20),
padding: EdgeInsets.symmetric(vertical: 6),
decoration: BoxDecoration(
color: ColorConfig.themeColor,
borderRadius: BorderRadius.all(Radius.circular(5))
),
child: Text('添加人员', style: TextStyle(color: ColorConfig.white, fontSize: 15),),
),
onTap: () { controller.addPerson(); },
),
Expanded(
child: ListView.builder(
itemBuilder: (context, index) {
return Container(
alignment: Alignment.centerLeft,
color: index %2 == 0 ? ColorConfig.white : ColorConfig.colorF2F2F2,
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 8),
child: Row(
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('人员${index+1} | 女', style: TextStyle(fontSize: 15, fontWeight: FontWeight.bold),),
Text('身份证: 123456789',),
Text('电话: 123456789',),
Text('家庭住址: xxxxxxx',),
],
)
),
InkWell(
child: Container(
width: 54,
height: 30,
color: ColorConfig.themeColor,
alignment: Alignment.center,
child: Text('编辑', style: TextStyle(color: ColorConfig.white),),
),
onTap: () { controller.editPerson(index); },
),
const SizedBox(width: 10,),
InkWell(
child: Container(
width: 54,
height: 30,
color: ColorConfig.color548DEE,
alignment: Alignment.center,
child: Text('删除', style: TextStyle(color: ColorConfig.white),),
),
onTap: () {
controller.deletePerson(index);
},
),
],
),
);
},
itemCount: controller.data_list.length,
)
)
],
);
},)
);
}
}
import 'package:get/get.dart';
import '../../../../component/dialog/normal_dialog.dart';
import '../../../../utils/toast_utils.dart';
class Recovery_ticketLogic extends GetxController {
@override
void onReady() {
// TODO: implement onReady
super.onReady();
}
///确认拿票
void config() async {
var flag = await Get.dialog(const NormalDialog(
title: '提示',
content: '回票人: 张三 | 金额: 1000元 | 日期: 2023-04-45 | 中奖金额 1200元',
okBtnText: '确认',
cancelBtnText: '取消',
));
if(flag) {
ToastUtils.show("已添加回票记录!");
Get.back();
}
}
}
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../../../common/colors.dart';
import 'recovery_ticket_logic.dart';
class Recovery_ticketPage extends GetView<Recovery_ticketLogic> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('回票登记'),
centerTitle: true,
backgroundColor: ColorConfig.themeColor,
),
body: Padding(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 12),
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('回收日期:', style: TextStyle(color: ColorConfig.color33, fontSize: 16),),
Text('20223-04-25', style: TextStyle(color: ColorConfig.themeColor, fontSize: 16),),
],
),
const SizedBox(height: 20,),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('回票人:', style: TextStyle(color: ColorConfig.color33, fontSize: 16),),
Text('选择回票人>>', style: TextStyle(color: ColorConfig.color548DEE, fontSize: 16),),
],
),
const SizedBox(height: 20,),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('刮刮乐1(5元面值)', style: TextStyle(color: ColorConfig.color33, fontSize: 16),),
Text('5张 25元', style: TextStyle(color: ColorConfig.color33, fontSize: 16),),
Text('修改>>', style: TextStyle(color: ColorConfig.color548DEE, fontSize: 16),),
],
),
const SizedBox(height: 20,),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('刮刮乐2(10元面值)', style: TextStyle(color: ColorConfig.color33, fontSize: 16),),
Text('10张 200元', style: TextStyle(color: ColorConfig.color33, fontSize: 16),),
Text('修改>>', style: TextStyle(color: ColorConfig.color548DEE, fontSize: 16),),
],
),
const SizedBox(height: 20,),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('刮刮乐3(20元面值)', style: TextStyle(color: ColorConfig.color33, fontSize: 16),),
Text('20张 400元', style: TextStyle(color: ColorConfig.color33, fontSize: 16),),
Text('修改>>', style: TextStyle(color: ColorConfig.color548DEE, fontSize: 16),),
],
),
const SizedBox(height: 20,),
Container(
alignment: Alignment.center,
width: 120,
margin: EdgeInsets.symmetric(horizontal: 20, vertical: 10),
padding: EdgeInsets.symmetric(vertical: 5),
decoration: BoxDecoration(
color: ColorConfig.themeColor,
borderRadius: BorderRadius.all(Radius.circular(4))
),
child: Text('继续添加', style: TextStyle(color: ColorConfig.white, fontSize: 16),),
),
const SizedBox(height: 20,),
Container(
alignment: Alignment.centerLeft,
child: Text('总金额: 2100元', style: TextStyle(color: ColorConfig.themeColor, fontSize: 16),),
),
const SizedBox(height: 20,),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('中奖票数', style: TextStyle(color: ColorConfig.color33, fontSize: 16),),
Text('20张 总共 1200元', style: TextStyle(color: ColorConfig.color33, fontSize: 16),),
Text('修改>>', style: TextStyle(color: ColorConfig.color548DEE, fontSize: 16),),
],
),
const SizedBox(height: 20,),
InkWell(
child: Container(
alignment: Alignment.center,
margin: EdgeInsets.symmetric(horizontal: 20, vertical: 10),
padding: EdgeInsets.symmetric(vertical: 5),
decoration: BoxDecoration(
color: ColorConfig.themeColor,
borderRadius: BorderRadius.all(Radius.circular(4))
),
child: Text('确认回票', style: TextStyle(color: ColorConfig.white, fontSize: 16),),
),
onTap: () { controller.config(); },
),
],
),
)
);
}
}
import 'package:get/get.dart';
class Sale_manageLogic extends GetxController {
@override
void onReady() {
// TODO: implement onReady
super.onReady();
}
}
import 'package:fl_chart/fl_chart.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../../../common/colors.dart';
import 'sale_manage_logic.dart';
class Sale_managePage extends GetView<Sale_manageLogic> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('销售查询'),
centerTitle: true,
backgroundColor: ColorConfig.themeColor,
),
body: SingleChildScrollView(
child: Column(
children: [
Container(
alignment: Alignment.center,
height: 40,
child: const Text('当月总销量', style: TextStyle(fontSize: 18, color: ColorConfig.color33, fontWeight: FontWeight.bold),),
),
const SizedBox(height: 20,),
Container(
alignment: Alignment.centerLeft,
height: 300,
padding: const EdgeInsets.symmetric(horizontal: 8),
child: LineChart(
sampleData1,
swapAnimationDuration: const Duration(milliseconds: 250),
),
),
Container(
alignment: Alignment.center,
height: 40,
child: const Text('销售员排名', style: TextStyle(fontSize: 18, color: ColorConfig.color33, fontWeight: FontWeight.bold),),
),
const SizedBox(height: 20,),
const Divider(height: 1, color: ColorConfig.colorCBCBCB,),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('第一名', style: TextStyle(color: ColorConfig.themeColor, fontSize: 16),),
Text('张三(2000张/12000元)', style: TextStyle(color: ColorConfig.color33, fontSize: 16),),
],
),
),
const Divider(height: 1, color: ColorConfig.colorCBCBCB,),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('第二名', style: TextStyle(color: ColorConfig.themeColor, fontSize: 16),),
Text('李四(1800张/11000元)', style: TextStyle(color: ColorConfig.color33, fontSize: 16),),
],
),
),
const Divider(height: 1, color: ColorConfig.colorCBCBCB,),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('第三名', style: TextStyle(color: ColorConfig.themeColor, fontSize: 16),),
Text('王五(1600张/9000元)', style: TextStyle(color: ColorConfig.color33, fontSize: 16),),
],
),
),
const Divider(height: 1, color: ColorConfig.colorCBCBCB,),
const SizedBox(height: 20,),
Container(
alignment: Alignment.center,
height: 40,
child: const Text('畅销排行', style: TextStyle(fontSize: 18, color: ColorConfig.color33, fontWeight: FontWeight.bold),),
),
const SizedBox(height: 20,),
const Divider(height: 1, color: ColorConfig.colorCBCBCB,),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('第一名', style: TextStyle(color: ColorConfig.themeColor, fontSize: 16),),
Text('10元面值刮刮乐(3000张)', style: TextStyle(color: ColorConfig.color33, fontSize: 16),),
],
),
),
const Divider(height: 1, color: ColorConfig.colorCBCBCB,),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('第二名', style: TextStyle(color: ColorConfig.themeColor, fontSize: 16),),
Text('20元面值刮刮乐(1200张)', style: TextStyle(color: ColorConfig.color33, fontSize: 16),),
],
),
),
const Divider(height: 1, color: ColorConfig.colorCBCBCB,),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('第三名', style: TextStyle(color: ColorConfig.themeColor, fontSize: 16),),
Text('5元面值刮刮乐(500张)', style: TextStyle(color: ColorConfig.color33, fontSize: 16),),
],
),
),
const Divider(height: 1, color: ColorConfig.colorCBCBCB,),
const SizedBox(height: 200,),
],
),
)
);
}
LineChartData get sampleData1 => LineChartData(
lineTouchData: lineTouchData1,
gridData: gridData,
titlesData: titlesData1,
borderData: borderData,
lineBarsData: lineBarsData1,
minX: 0,
maxX: 30,
maxY: 10,
minY: 0,
);
LineTouchData get lineTouchData1 => LineTouchData(
handleBuiltInTouches: true,
touchTooltipData: LineTouchTooltipData(
tooltipBgColor: Colors.red.withOpacity(0.8),
),
);
FlTitlesData get titlesData1 => FlTitlesData(
bottomTitles: AxisTitles(
sideTitles: bottomTitles,
),
rightTitles: AxisTitles(
sideTitles: SideTitles(showTitles: false),
),
topTitles: AxisTitles(
sideTitles: SideTitles(showTitles: false),
),
leftTitles: AxisTitles(
sideTitles: leftTitles(),
),
);
List<LineChartBarData> get lineBarsData1 => [
lineChartBarData1_1
];
Widget leftTitleWidgets(double value, TitleMeta meta) {
const style = TextStyle( fontSize: 14,);
String text;
switch (value.toInt()) {
case 1:
text = '5K';
break;
case 2:
text = '10K';
break;
case 3:
text = '15K';
break;
case 4:
text = '20K';
break;
case 5:
text = '25K';
break;
case 6:
text = '30K';
break;
case 7:
text = '35K';
break;
case 8:
text = '40K';
break;
case 9:
text = '45K';
break;
case 10:
text = '50K';
break;
default:
return Container();
}
return Text(text, style: style, textAlign: TextAlign.center);
}
SideTitles leftTitles() => SideTitles(
getTitlesWidget: leftTitleWidgets,
showTitles: true,
interval: 1,
reservedSize: 40,
);
Widget bottomTitleWidgets(double value, TitleMeta meta) {
const style = TextStyle( fontSize: 16,);
Widget text;
switch (value.toInt()) {
case 2:
text = const Text('5号', style: style);
break;
case 7:
text = const Text('10号', style: style);
break;
case 12:
text = const Text('15号', style: style);
break;
case 17:
text = const Text('20号', style: style);
break;
case 23:
text = const Text('25号', style: style);
break;
case 30:
text = const Text('30号', style: style);
break;
default:
text = const Text('');
break;
}
return SideTitleWidget(
axisSide: meta.axisSide,
space: 5,
child: text,
);
}
SideTitles get bottomTitles => SideTitles(
showTitles: true,
reservedSize: 35,
interval: 1,
getTitlesWidget: bottomTitleWidgets,
);
FlGridData get gridData => FlGridData(show: true, verticalInterval: 1, horizontalInterval: 1);
FlBorderData get borderData => FlBorderData(
show: true,
border: const Border(
bottom: BorderSide(color: Colors.black, width: 1),
left: BorderSide(color: Colors.black, width: 1),
right: BorderSide(color: Colors.transparent),
top: BorderSide(color: Colors.transparent),
),
);
LineChartBarData get lineChartBarData1_1 => LineChartBarData(
isCurved: true,
color: Colors.green,
barWidth: 1,
isStrokeCapRound: true,
dotData: FlDotData(show: false),
belowBarData: BarAreaData(show: false),
spots: const [
FlSpot(1, 0),
FlSpot(3, 0.4),
FlSpot(5, 0.8),
FlSpot(7, 1.2),
FlSpot(10, 1.6),
FlSpot(12, 2.1),
FlSpot(13, 2.5),
FlSpot(16, 2.9),
FlSpot(18, 3.5),
FlSpot(20, 4.2),
FlSpot(22, 5.8),
FlSpot(26, 7.1),
FlSpot(30, 8.2),
],
);
}
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../../../common/colors.dart';
import '../../../../utils/toast_utils.dart';
class Game_basketballLogic extends GetxController {
var data_list = [
{
'id': 123,
'number': '001',
'host_name': '利物浦',
'guest_name': '巴萨',
'sp': {
'7201': [1.98, 2.22, 1,42],
'7202': [1.98, 2.22, 1,42]
},
'let_score': -1,
'end_time': '21:30止',
'game_name': '欧冠',
'dg': '7201',
},
{
'id': 124,
'number': '002',
'host_name': '利物浦',
'guest_name': '巴萨',
'sp': {
'7201': [1.98, 2.22, 1,42],
'7202': [1.98, 2.22, 1,42]
},
'let_score': -1,
'end_time': '21:30止',
'game_name': '欧冠',
'dg': '',
},
];
@override
void onReady() {
// TODO: implement onReady
super.onReady();
}
///提交订单
void commit() {
Get.bottomSheet(
Container(
height: 240,
color: Colors.white,
alignment: Alignment.center,
padding: const EdgeInsets.symmetric(vertical: 15,),
child: Column(
children: [
Text("订单确认", style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold, color: ColorConfig.color33),),
Container(
padding: EdgeInsets.symmetric(horizontal: 12),
alignment: Alignment.centerLeft,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const SizedBox(height: 15,),
const Text(' 001 巴萨 VS 皇马 让胜(-2) 002 切尔西 VS 利物浦 胜'),
const SizedBox(height: 5,),
const Text('2串1 20000倍 共40000元'),
const SizedBox(height: 5,),
const Text('联合出票: 体育路1门店 500票; 体育路2门店 500票; 体育路3门店 1000票; 总计 2000票'),
],
),
),
const SizedBox(height: 30,),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
InkWell(
child: Container(
width: 120,
height: 32,
alignment: Alignment.center,
decoration: BoxDecoration(
color: ColorConfig.colorBCC3C6,
borderRadius: BorderRadius.all(Radius.circular(5))
),
child: Text('取消', style: TextStyle(color: ColorConfig.color99),),
),
onTap: () { Get.back(); },
),
const SizedBox(width: 50,),
InkWell(
child: Container(
width: 120,
height: 32,
alignment: Alignment.center,
decoration: BoxDecoration(
color: ColorConfig.themeColor,
borderRadius: BorderRadius.all(Radius.circular(5))
),
child: Text('提交', style: TextStyle(color: ColorConfig.white),),
),
onTap: () {
ToastUtils.show('订单已提交到指定门店!');
Get.back();
},
)
],
)
],
),
)
);
}
///选择门店
void select_shop() {
Get.bottomSheet(
Container(
height: 500,
color: Colors.white,
alignment: Alignment.center,
padding: const EdgeInsets.symmetric(vertical: 15,),
child: Column(
children: [
Text("请选择出票门店", style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold, color: ColorConfig.color33),),
const SizedBox(height: 20,),
Expanded(
child: ListView.builder(
itemBuilder: (item, index) {
return Container(
height: 40,
alignment: Alignment.centerLeft,
color: index %2 == 0 ? ColorConfig.colorF2F2F2 : ColorConfig.white,
padding: const EdgeInsets.symmetric(horizontal: 12),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('体育路${index + 1}门店'),
Text(index %2 == 0 ? '待出票(100)' : '空闲', style: TextStyle(color:index %2 == 0 ?ColorConfig.themeColor : ColorConfig.color548DEE),),
Text('出50票10000元', style: TextStyle(color: ColorConfig.themeColor),),
Text('选择', style: TextStyle(color: ColorConfig.themeColor),),
],
),
);
},
itemCount: 20,
)
)
],
),
)
);
}
}
import 'package:get/get.dart';
class Game_dltLogic extends GetxController {
}
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../../../common/colors.dart';
import 'game_dlt_logic.dart';
class Game_dltPage extends GetView<Game_dltLogic> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('大乐透'),
centerTitle: true,
backgroundColor: ColorConfig.themeColor,
),
body: Container(
child: Text("报表"),
)
);
}
}
import 'package:cp_offline_manage/common/colors.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../../../utils/toast_utils.dart';
class Game_footballLogic extends GetxController {
var data_list = [
{
'id': 123,
'number': '001',
'host_name': '利物浦',
'guest_name': '巴萨',
'sp': {
'7201': [1.98, 2.22, 1,42],
'7202': [1.98, 2.22, 1,42]
},
'let_score': -1,
'end_time': '21:30止',
'game_name': '欧冠',
'dg': '7201',
},
{
'id': 124,
'number': '002',
'host_name': '利物浦',
'guest_name': '巴萨',
'sp': {
'7201': [1.98, 2.22, 1,42],
'7202': [1.98, 2.22, 1,42]
},
'let_score': -1,
'end_time': '21:30止',
'game_name': '欧冠',
'dg': '',
},
];
@override
void onReady() {
// TODO: implement onReady
super.onReady();
}
///提交订单
void commit() {
Get.bottomSheet(
Container(
height: 240,
color: Colors.white,
alignment: Alignment.center,
padding: const EdgeInsets.symmetric(vertical: 15,),
child: Column(
children: [
Text("订单确认", style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold, color: ColorConfig.color33),),
Container(
padding: EdgeInsets.symmetric(horizontal: 12),
alignment: Alignment.centerLeft,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const SizedBox(height: 15,),
const Text(' 001 巴萨 VS 皇马 让胜(-2) 002 切尔西 VS 利物浦 胜'),
const SizedBox(height: 5,),
const Text('2串1 20000倍 共40000元'),
const SizedBox(height: 5,),
const Text('联合出票: 体育路1门店 500票; 体育路2门店 500票; 体育路3门店 1000票; 总计 2000票'),
],
),
),
const SizedBox(height: 30,),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
InkWell(
child: Container(
width: 120,
height: 32,
alignment: Alignment.center,
decoration: BoxDecoration(
color: ColorConfig.colorBCC3C6,
borderRadius: BorderRadius.all(Radius.circular(5))
),
child: Text('取消', style: TextStyle(color: ColorConfig.color99),),
),
onTap: () { Get.back(); },
),
const SizedBox(width: 50,),
InkWell(
child: Container(
width: 120,
height: 32,
alignment: Alignment.center,
decoration: BoxDecoration(
color: ColorConfig.themeColor,
borderRadius: BorderRadius.all(Radius.circular(5))
),
child: Text('提交', style: TextStyle(color: ColorConfig.white),),
),
onTap: () {
ToastUtils.show('订单已提交到指定门店!');
Get.back();
},
)
],
)
],
),
)
);
}
///选择门店
void select_shop() {
Get.bottomSheet(
Container(
height: 500,
color: Colors.white,
alignment: Alignment.center,
padding: const EdgeInsets.symmetric(vertical: 15,),
child: Column(
children: [
Text("请选择出票门店", style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold, color: ColorConfig.color33),),
const SizedBox(height: 20,),
Expanded(
child: ListView.builder(
itemBuilder: (item, index) {
return Container(
height: 40,
alignment: Alignment.centerLeft,
color: index %2 == 0 ? ColorConfig.colorF2F2F2 : ColorConfig.white,
padding: const EdgeInsets.symmetric(horizontal: 12),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('体育路${index + 1}门店'),
Text(index %2 == 0 ? '待出票(100)' : '空闲', style: TextStyle(color:index %2 == 0 ?ColorConfig.themeColor : ColorConfig.color548DEE),),
Text('出50票10000元', style: TextStyle(color: ColorConfig.themeColor),),
Text('选择', style: TextStyle(color: ColorConfig.themeColor),),
],
),
);
},
itemCount: 20,
)
)
],
),
)
);
}
}
import 'package:cp_offline_manage/router/route_config.dart';
import 'package:get/get.dart';
class Game_orderLogic extends GetxController {
@override
void onReady() {
// TODO: implement onReady
super.onReady();
}
//跳转赛事下单页面
void jump_to_game(int lottery_id) {
if(lottery_id == 1) {
Get.toNamed(RouteConfig.game_football_key);
} else if(lottery_id == 2) {
Get.toNamed(RouteConfig.game_basketball_key);
} else if(lottery_id == 3) {
Get.toNamed(RouteConfig.game_dlt_key);
} else {
Get.toNamed(RouteConfig.game_pl3_key);
}
}
}
import 'package:cp_offline_manage/common/colors.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'game_order_logic.dart';
class Game_orderPage extends GetView<Game_orderLogic> {
const Game_orderPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('赛事下单'),
centerTitle: true,
backgroundColor: ColorConfig.themeColor,
),
body: Column(
children: [
InkWell(
child: Container(
height: 64,
padding: EdgeInsets.symmetric(horizontal: 12),
margin: EdgeInsets.only(top: 8),
color: ColorConfig.white,
alignment: Alignment.centerLeft,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("竞彩足球", style: TextStyle(fontSize: 17, color: ColorConfig.color33),),
Icon(Icons.chevron_right, size: 24, color: ColorConfig.color33,)
],
),
),
onTap: () {controller.jump_to_game(1); },
),
InkWell(
child: Container(
height: 64,
padding: EdgeInsets.symmetric(horizontal: 12),
margin: EdgeInsets.only(top: 8),
color: ColorConfig.white,
alignment: Alignment.centerLeft,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("竞彩篮球", style: TextStyle(fontSize: 17, color: ColorConfig.color33),),
Icon(Icons.chevron_right, size: 24, color: ColorConfig.color33,)
],
),
),
onTap: () {controller.jump_to_game(2); },
),
InkWell(
child: Container(
height: 64,
padding: EdgeInsets.symmetric(horizontal: 12),
margin: EdgeInsets.only(top: 8),
color: ColorConfig.white,
alignment: Alignment.centerLeft,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("大乐透", style: TextStyle(fontSize: 17, color: ColorConfig.color33),),
Icon(Icons.chevron_right, size: 24, color: ColorConfig.color33,)
],
),
),
onTap: () {controller.jump_to_game(3); },
),
InkWell(
child: Container(
height: 64,
padding: EdgeInsets.symmetric(horizontal: 12),
margin: EdgeInsets.only(top: 8),
color: ColorConfig.white,
alignment: Alignment.centerLeft,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("排列3", style: TextStyle(fontSize: 17, color: ColorConfig.color33),),
Icon(Icons.chevron_right, size: 24, color: ColorConfig.color33,)
],
),
),
onTap: () {controller.jump_to_game(4); },
)
],
)
);
}
}
import 'package:get/get.dart';
class Game_pl3Logic extends GetxController {
}
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../../../common/colors.dart';
import 'game_pl3_logic.dart';
class Game_pl3Page extends GetView<Game_pl3Logic> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('竞彩足球'),
centerTitle: true,
backgroundColor: ColorConfig.themeColor,
),
body: Container(
child: Text("报表"),
)
);
}
}
import 'package:get/get.dart';
import 'package:cp_offline_manage/router/route_config.dart';
class Home_mainLogic extends GetxController {
final items = [
{"type": 1, "name": '出票', "icon": 'icon_chu_piao.png'},
{"type": 2, "name": '兑奖', "icon": 'icon_dui_jiang.png'},
{"type": 3, "name": '账户总览', "icon": 'icon_account_overview.png'},
{"type": 4, "name": '赛事下单', "icon": 'icon_competition.png'},
{"type": 5, "name": '门店账本', "icon": 'icon_store_account.png'},
{"type": 6, "name": '刮刮乐', "icon": 'icon_croak.png'},
{"type": 7, "name": '交接班', "icon": 'icon_shift_change.png'},
];
void jump(int index) {
var item = items[index];
switch (item["type"]) {
case 1:
Get.toNamed(RouteConfig.out_ticket_key);
return;
case 2:
Get.toNamed(RouteConfig.redeem_query_key);
return;
case 3:
Get.toNamed(RouteConfig.account_total_key);
return;
case 4:
Get.toNamed(RouteConfig.game_order_key);
return;
case 5:
Get.toNamed(RouteConfig.store_account_key);
return;
case 6:
Get.toNamed(RouteConfig.croak_happy_key);
return;
case 7:
Get.toNamed(RouteConfig.stores_shift_records_key);
return;
}
}
}
import 'package:cp_offline_manage/utils/log.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../../common/colors.dart';
import 'home_main_logic.dart';
class Home_mainPage extends GetView<Home_mainLogic> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('首页'),
centerTitle: true,
backgroundColor: ColorConfig.themeColor,
),
body: GridView.builder(
itemCount: controller.items.length,
padding: EdgeInsets.all(20),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
mainAxisSpacing: 20,
crossAxisSpacing: 20,
childAspectRatio: 1,
),
itemBuilder: (context, index) {
var item = controller.items[index];
var icon = 'assets/images/home_icon/' + item["icon"].toString();
return GestureDetector(
onTap: () {
controller.jump(index);
},
child: Container(
height: 50,
child: Column(
children: [
Expanded(
flex: 1,
child: Container(),
),
Image(image: AssetImage(icon), width: 40, height: 40),
Expanded(
flex: 1,
child: Container(),
),
Text(
item["name"] as String,
style:
TextStyle(color: ColorConfig.color00, fontSize: 16),
),
Expanded(
flex: 1,
child: Container(),
),
],
),
),
);
},
));
}
}
import 'package:get/get.dart';
import 'package:cp_offline_manage/router/route_config.dart';
class Home_ticketer_mainLogic extends GetxController {
final items = [
{"type": 2, "name": '兑奖', "icon": 'icon_dui_jiang.png'},
{"type": 5, "name": '门店账本', "icon": 'icon_store_account.png'},
{"type": 7, "name": '交接班', "icon": 'icon_shift_change.png'},
];
void jumpModule(int index) {
var item = items[index];
switch (item["type"]) {
case 2: //打票员兑奖页面
Get.toNamed(RouteConfig.ticketer_redeem_key);
return;
case 5: //门店账本页面
Get.toNamed(RouteConfig.store_account_key);
return;
case 7: //打票员交接班页面
Get.toNamed(RouteConfig.ticketer_shift_key);
return;
}
}
}
import 'package:cp_offline_manage/common/colors.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'home_ticketer_main_logic.dart';
class Home_ticketer_mainPage extends GetView<Home_ticketer_mainLogic> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('首页'),
centerTitle: true,
backgroundColor: ColorConfig.themeColor,
),
body: GridView.builder(
itemCount: controller.items.length,
padding: EdgeInsets.all(20),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
mainAxisSpacing: 20,
crossAxisSpacing: 20,
childAspectRatio: 1,
),
itemBuilder: (context, index) {
var item = controller.items[index];
var icon = 'assets/images/home_icon/' + item["icon"].toString();
return GestureDetector(
onTap: () {
controller.jumpModule(index);
},
child: Container(
height: 50,
child: Column(
children: [
Expanded(
flex: 1,
child: Container(),
),
Image(image: AssetImage(icon), width: 40, height: 40),
Expanded(
flex: 1,
child: Container(),
),
Text(
item["name"] as String,
style:
TextStyle(color: ColorConfig.color00, fontSize: 16),
),
Expanded(
flex: 1,
child: Container(),
),
],
),
),
);
},
));
}
}
import 'package:cp_offline_manage/common/colors.dart';
import 'package:cp_offline_manage/router/route_config.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:syncfusion_flutter_datepicker/datepicker.dart';
import '../../../../utils/log.dart';
class History_ticketLogic extends GetxController {
@override
void onReady() {
// TODO: implement onReady
super.onReady();
}
///选择日期
void selectDate() {
Get.bottomSheet(
Container(
height: 350,
color: Colors.white,
child: Column(
children: [
Container(
height: 40,
alignment: Alignment.centerLeft,
padding: const EdgeInsets.symmetric(horizontal: 12),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Text('选择日期', style: TextStyle(fontSize: 18, color: ColorConfig.color33, fontWeight: FontWeight.bold),),
InkWell(
child: Container(
width: 60,
height: 26,
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(4)),
color: ColorConfig.themeColor
),
child: Text('确定', style: TextStyle(color: ColorConfig.white, fontSize: 15),),
),
onTap: () { Get.back(); },
)
],
),
),
SfDateRangePicker(
onSelectionChanged: _onSelectionChanged,
selectionMode: DateRangePickerSelectionMode.range,
initialSelectedRange: PickerDateRange(
DateTime.now().subtract(const Duration(days: 7)),
DateTime.now().subtract(const Duration(days: 1))),
)
],
),
)
);
}
void _onSelectionChanged(DateRangePickerSelectionChangedArgs args) {
var aaa;
if (args.value is PickerDateRange) {
aaa = '${args.value.startDate} -'
' ${args.value.endDate ?? args.value.startDate}';
} else if (args.value is DateTime) {
aaa = args.value.toString();
} else if (args.value is List<DateTime>) {
aaa = args.value.length.toString();
} else {
aaa = args.value.length.toString();
}
LogUtils.e('--------${aaa}');
}
void jump_shop_detail() {
Get.toNamed(RouteConfig.ticket_detail_key);
}
}
import 'package:cp_offline_manage/utils/log.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:syncfusion_flutter_datepicker/datepicker.dart';
import '../../../../common/colors.dart';
import 'history_ticket_logic.dart';
class History_ticketPage extends GetView<History_ticketLogic> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('历史票务'),
centerTitle: true,
backgroundColor: ColorConfig.themeColor,
actions: [
Container(
alignment: Alignment.center,
margin: const EdgeInsets.only(right: 20),
child: InkWell(
child: const Text('选择日期'),
onTap: () { controller.selectDate(); },
),
)
],
),
body: Column(
children: [
Container(
alignment: Alignment.center,
margin: const EdgeInsets.only(top: 15),
child: const Text('4月19-26日票务总览', style: TextStyle(fontSize: 20, color: ColorConfig.color33, fontWeight: FontWeight.bold),),
),
const SizedBox(height: 8,),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: const [
Text('派票: 200票'),
SizedBox(width: 100,),
Text('已出票: 186票'),
],
),
const SizedBox(height: 8,),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: const [
Text('未出票: 0票'),
SizedBox(width: 100,),
Text('今日错票: 5票'),
],
),
Container(
alignment: Alignment.centerLeft,
margin: const EdgeInsets.only(left: 12, top: 15),
child: const Text('各店情况', style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18),),
),
const SizedBox(height: 12,),
const Divider(height: 1, color: ColorConfig.colorCBCBCB,),
Expanded(
child: ListView.builder(
itemBuilder: (item, index) {
return InkWell(
onTap: controller.jump_shop_detail,
child: Container(
alignment: Alignment.centerLeft,
padding: EdgeInsets.symmetric(horizontal: 12),
height: 64,
color: index %2 == 0 ? ColorConfig.colorF2F2F2 : ColorConfig.white,
child: Row(
children: [
Expanded(
child: Row(
children: [
Text('体育路${index+1}门店'),
const SizedBox(width: 10,),
Text('总共(18票)', style: TextStyle(color: ColorConfig.themeColor),),
const SizedBox(width: 10,),
Text('已出(18票)', style: TextStyle(color: ColorConfig.color_999)),
const SizedBox(width: 10,),
Text('错票(0票)', style: TextStyle(color: ColorConfig.color548DEE)),
],
)
),
Icon(Icons.chevron_right, size: 24, color: ColorConfig.color99,)
],
),
),
);
},
itemCount: 20,
)
)
],
)
);
}
}
import 'package:cp_offline_manage/router/route_config.dart';
import 'package:get/get.dart';
class Out_ticketLogic extends GetxController {
@override
void onReady() {
// TODO: implement onReady
super.onReady();
}
///跳转到门店出票详情
void jump_shop_detail() {
Get.toNamed(RouteConfig.shop_ticket_detail_key);
}
///跳转到历史记录
void jump_history() {
Get.toNamed(RouteConfig.history_ticket_key);
}
}
import 'package:cp_offline_manage/common/colors.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'out_ticket_logic.dart';
class Out_ticketPage extends GetView<Out_ticketLogic> {
const Out_ticketPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('票务管理'),
centerTitle: true,
backgroundColor: ColorConfig.themeColor,
actions: [
Container(
alignment: Alignment.center,
margin: EdgeInsets.only(right: 20),
child: InkWell(child: Text('历史记录'), onTap: () { controller.jump_history(); },),
)
],
),
body: Column(
children: [
Container(
alignment: Alignment.center,
margin: const EdgeInsets.only(top: 15),
child: const Text('今日票务总览', style: TextStyle(fontSize: 20, color: ColorConfig.color33, fontWeight: FontWeight.bold),),
),
const SizedBox(height: 8,),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: const [
Text('今日派票: 200票'),
SizedBox(width: 100,),
Text('今日已出票: 186票'),
],
),
const SizedBox(height: 8,),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: const [
Text('今日未出票: 14票'),
SizedBox(width: 100,),
Text('今日错票: 5票'),
],
),
Container(
alignment: Alignment.centerLeft,
margin: const EdgeInsets.only(left: 12, top: 15),
child: const Text('各店情况', style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18),),
),
const SizedBox(height: 12,),
const Divider(height: 1, color: ColorConfig.colorCBCBCB,),
Expanded(
child: ListView.builder(
itemBuilder: (item, index) {
return InkWell(
onTap: controller.jump_shop_detail,
child: Container(
alignment: Alignment.centerLeft,
padding: EdgeInsets.symmetric(horizontal: 12),
height: 64,
color: index %2 == 0 ? ColorConfig.colorF2F2F2 : ColorConfig.white,
child: Row(
children: [
Expanded(
child: Row(
children: [
Text('体育路${index+1}门店'),
const SizedBox(width: 10,),
Text('总共(18票)', style: TextStyle(color: ColorConfig.themeColor),),
const SizedBox(width: 10,),
Text('已出(18票)', style: TextStyle(color: ColorConfig.color_999)),
const SizedBox(width: 10,),
Text('错票(0票)', style: TextStyle(color: ColorConfig.color548DEE)),
],
)
),
Icon(Icons.chevron_right, size: 24, color: ColorConfig.color99,)
],
),
),
);
},
itemCount: 20,
)
)
],
)
);
}
}
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!