Commit 79bc250a by York

增加广告位,修改 bug

parent 05716b0f
File added
......@@ -7,13 +7,14 @@ import 'package:special_equipment_flutter/ui/examine/exam/exam_result_page.dart'
import 'package:special_equipment_flutter/ui/examine/test/test_page.dart';
import 'package:special_equipment_flutter/ui/examine/test/test_result_page.dart';
import 'package:special_equipment_flutter/ui/examine/test/test_setting_page.dart';
import 'package:special_equipment_flutter/ui/file/file_list_page.dart';
import 'package:special_equipment_flutter/ui/login/login_page.dart';
import 'package:special_equipment_flutter/ui/main/tab_home_page.dart';
import 'package:special_equipment_flutter/ui/main/unit/equipment_personnel_page.dart';
import 'package:special_equipment_flutter/ui/overseer/equipment_list_page.dart';
import 'package:special_equipment_flutter/ui/overseer/equipment_list_page1.dart';
import 'package:special_equipment_flutter/ui/overseer/overseer_history_details_page.dart';
import 'package:special_equipment_flutter/ui/overseer/overseer_history_list_page.dart';
import 'package:special_equipment_flutter/ui/overseer/overseer_settings_page.dart';
import 'package:special_equipment_flutter/ui/overseer/overseer_settings_pages.dart';
import 'package:special_equipment_flutter/ui/overseer/unit_list_page.dart';
import 'package:special_equipment_flutter/ui/register/address_page.dart';
import 'package:special_equipment_flutter/ui/register/register_page1.dart';
......@@ -142,6 +143,9 @@ class RouteString {
static const String OVERSEER_HISTROY_DETAILS_PAGE =
"/OverseerHistroyDetailsPage";
///文件预览
static const String FILE_LIST_PAGE = "/FileListPage";
static final routes = [
///登录
GetPage(name: LOGIN, page: () => const LoginPage()),
......@@ -222,7 +226,7 @@ class RouteString {
GetPage(name: EXAM_RESULT_PAGE, page: () => ExamResultPage()),
///监察人设置考核
GetPage(name: OVERSEER_SETTINGS_PAGE, page: () => OverseerSettingsPage()),
GetPage(name: OVERSEER_SETTINGS_PAGE, page: () => OverseerSettingsPages()),
///监察人选择单位
GetPage(name: UNIT_LIST_PAGE, page: () => UnitListPage()),
......@@ -246,6 +250,9 @@ class RouteString {
name: OVERSEER_HISTROY_DETAILS_PAGE,
page: () => OverseerHistroyDetailsPage()),
///文件预览
GetPage(name: FILE_LIST_PAGE, page: () => FileListPage()),
// GetPage(
// name: "/shop",
// page: () => const ShopPage(),
......
......@@ -3,15 +3,15 @@
class Api {
static var IS_DEBUG = true;
static String URL =
IS_DEBUG ? "https://special.sxyztech.cn/" : "http://192.168.19.165:2212/";
// static String URL =
// IS_DEBUG ? "https://special.sxyztech.cn/" : "http://192.168.19.165:2222/";
///演示 ip
// static String URL = "http://47.92.138.92:8009/";
// static String URL = "http://192.168.19.164:8087/";
// static String URL = "http://192.168.19.165:2212/";
static String URL = "http://192.168.19.215:8181/";
static String START_URL = "special/a/",
END_URL = "__ajax=true&mobileLogin=true";
......@@ -239,6 +239,9 @@ class Api {
/// 监察记录 删除
static String EXAM_SETUP_DELETE = "${URL + START_URL}exam/examSetup/delete";
/// 首页广告 banner
static String BANNER = "${URL + START_URL}advertis/advertis/appAdvertisList";
/// 获取考核信息
// static String EXAMINE_PERSON = "${URL + START_URL}/exam/examPerson/checkHaveExam";
}
......@@ -8,6 +8,7 @@ import 'package:get/route_manager.dart';
import 'package:special_equipment_flutter/dio/dio/do_utils.dart';
import 'package:special_equipment_flutter/model/app_is_open.dart';
import 'package:special_equipment_flutter/model/app_roles.dart';
import 'package:special_equipment_flutter/model/banner_list_bo.dart';
import 'package:special_equipment_flutter/model/base/base_model.dart';
import 'package:special_equipment_flutter/model/base/result_obj_bo.dart';
import 'package:special_equipment_flutter/model/city_address_bo.dart';
......@@ -1705,6 +1706,30 @@ class HttpUtils {
}
}
///首页广告 banner
static Future getBannerList(BuildContext context) async {
Map<String, dynamic> params = {};
var response = await NetUtils.get(
context,
'${Api.BANNER};JSESSIONID=${StorageUtil.getInstance().getJsessionId()}',
false,
params);
try {
BaseModel entity = BaseModel.fromJson(response);
Map<String, dynamic> resultData = entity.body;
BannerListBo mBannerListBo = BannerListBo.fromJson(resultData);
if (entity.errorCode == "-1") {
return mBannerListBo;
} else {
ToastUtils.showCenter(entity.msg!);
return;
}
} catch (e) {
log(e.toString());
return {"message": e.toString()};
}
}
// HttpUtils.getList(context, _page, 20).then((value) {
// ListBo listBo = value;
// print(listBo);
......
class BannerListBo {
BannerListBo({
this.data,
});
BannerListBo.fromJson(dynamic json) {
if (json['data'] != null) {
data = [];
json['data'].forEach((v) {
data?.add(Data.fromJson(v));
});
}
}
List<Data>? data;
BannerListBo copyWith({
List<Data>? data,
}) =>
BannerListBo(
data: data ?? this.data,
);
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
if (data != null) {
map['data'] = data?.map((v) => v.toJson()).toList();
}
return map;
}
}
class Data {
Data({
this.id,
this.remarks,
this.createBy,
this.createDate,
this.updateBy,
this.updateDate,
this.businessName,
this.advertisUrl,
this.advertisPosition,
this.linkUrl,
this.isShow,
});
Data.fromJson(dynamic json) {
id = json['id'];
remarks = json['remarks'];
createBy =
json['createBy'] != null ? CreateBy.fromJson(json['createBy']) : null;
createDate = json['createDate'];
updateBy =
json['updateBy'] != null ? UpdateBy.fromJson(json['updateBy']) : null;
updateDate = json['updateDate'];
businessName = json['businessName'];
advertisUrl = json['advertisUrl'];
advertisPosition = json['advertisPosition'];
linkUrl = json['linkUrl'];
isShow = json['isShow'];
}
String? id;
String? remarks;
CreateBy? createBy;
String? createDate;
UpdateBy? updateBy;
String? updateDate;
String? businessName;
String? advertisUrl;
String? advertisPosition;
String? linkUrl;
String? isShow;
Data copyWith({
String? id,
String? remarks,
CreateBy? createBy,
String? createDate,
UpdateBy? updateBy,
String? updateDate,
String? businessName,
String? advertisUrl,
String? advertisPosition,
String? linkUrl,
String? isShow,
}) =>
Data(
id: id ?? this.id,
remarks: remarks ?? this.remarks,
createBy: createBy ?? this.createBy,
createDate: createDate ?? this.createDate,
updateBy: updateBy ?? this.updateBy,
updateDate: updateDate ?? this.updateDate,
businessName: businessName ?? this.businessName,
advertisUrl: advertisUrl ?? this.advertisUrl,
advertisPosition: advertisPosition ?? this.advertisPosition,
linkUrl: linkUrl ?? this.linkUrl,
isShow: isShow ?? this.isShow,
);
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['id'] = id;
map['remarks'] = remarks;
if (createBy != null) {
map['createBy'] = createBy?.toJson();
}
map['createDate'] = createDate;
if (updateBy != null) {
map['updateBy'] = updateBy?.toJson();
}
map['updateDate'] = updateDate;
map['businessName'] = businessName;
map['advertisUrl'] = advertisUrl;
map['advertisPosition'] = advertisPosition;
map['linkUrl'] = linkUrl;
map['isShow'] = isShow;
return map;
}
}
class UpdateBy {
UpdateBy({
this.id,
this.loginFlag,
this.roleNames,
this.admin,
});
UpdateBy.fromJson(dynamic json) {
id = json['id'];
loginFlag = json['loginFlag'];
roleNames = json['roleNames'];
admin = json['admin'];
}
String? id;
String? loginFlag;
String? roleNames;
bool? admin;
UpdateBy copyWith({
String? id,
String? loginFlag,
String? roleNames,
bool? admin,
}) =>
UpdateBy(
id: id ?? this.id,
loginFlag: loginFlag ?? this.loginFlag,
roleNames: roleNames ?? this.roleNames,
admin: admin ?? this.admin,
);
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['id'] = id;
map['loginFlag'] = loginFlag;
map['roleNames'] = roleNames;
map['admin'] = admin;
return map;
}
}
class CreateBy {
CreateBy({
this.id,
this.loginFlag,
this.roleNames,
this.admin,
});
CreateBy.fromJson(dynamic json) {
id = json['id'];
loginFlag = json['loginFlag'];
roleNames = json['roleNames'];
admin = json['admin'];
}
String? id;
String? loginFlag;
String? roleNames;
bool? admin;
CreateBy copyWith({
String? id,
String? loginFlag,
String? roleNames,
bool? admin,
}) =>
CreateBy(
id: id ?? this.id,
loginFlag: loginFlag ?? this.loginFlag,
roleNames: roleNames ?? this.roleNames,
admin: admin ?? this.admin,
);
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['id'] = id;
map['loginFlag'] = loginFlag;
map['roleNames'] = roleNames;
map['admin'] = admin;
return map;
}
}
......@@ -43,6 +43,7 @@ class EquiList {
String? id;
String? name;
bool isChecked = false;
EquiList copyWith({
String? id,
......
class UserBo {
String? account;
String? password;
UserBo(this.account, this.password);
Map<String, dynamic> toJson() {
return {
'account': account,
'password': password,
};
}
}
import 'package:flutter/material.dart';
class FileListPage extends StatefulWidget {
const FileListPage({Key? key}) : super(key: key);
@override
State<FileListPage> createState() => _FileListPageState();
}
class _FileListPageState extends State<FileListPage> {
final String filePath = 'assets/name.pdf';
final sampleUrl = 'http://www.pdf995.com/samples/pdf.pdf';
// final pdfController = PdfController(
// document: PdfDocument.openAsset('assets/name.pdf'),
// );
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Builder(builder: (context) {
return Scaffold(
backgroundColor: Colors.black,
appBar: AppBar(
title: Text('Plugin example app'),
),
body: Container(),
);
}),
);
}
// dynamic buildPdfView() {
// return PdfView(
// controller: pdfController,
// );
// }
}
......@@ -42,6 +42,25 @@ class EquipmentPersonnelTable extends StatelessWidget {
child: Column(
children: [
buildTitle(Icons.compare, '设备人员对比'),
Container(
alignment: Alignment.centerLeft,
margin: const EdgeInsets.only(left: 5, right: 5, top: 5),
padding: const EdgeInsets.only(
left: 5, right: 5, top: 3, bottom: 3),
decoration: BoxDecoration(
color: Colors.orange[50],
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(5),
topRight: Radius.circular(5),
bottomLeft: Radius.circular(5),
bottomRight: Radius.circular(5)),
),
child: const Text(
softWrap: true,
'设备人员对比表格,是对比每个设备是否配备了相关负责人员,请在【用户设置】内配置相关负责人员.',
style: TextStyle(color: Colors.orange, fontSize: 13),
),
),
const SizedBox(height: 10),
Table(
border: TableBorder.all(color: ColorConst.blueColor),
......
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:special_equipment_flutter/dio/http_utils.dart';
import 'package:special_equipment_flutter/model/exam/equipment_list_bo.dart';
import 'package:special_equipment_flutter/model/exam/exam_unit_list.dart';
import 'package:special_equipment_flutter/utils/storage_util.dart';
import 'package:special_equipment_flutter/widgets/app_bar/custom_app_bar.dart';
///设备选择
class EquipmentListPage extends StatefulWidget {
var arguments = Get.arguments;
EquipmentListPage({super.key});
@override
State<EquipmentListPage> createState() => _EquipmentListPageState();
}
class _EquipmentListPageState extends State<EquipmentListPage> {
List<EquiList>? officeLists = [];
List<EquiList>? filterOfficeLists = [];
var officeId = '';
@override
void initState() {
super.initState();
officeId = widget.arguments['officeId'];
getEquipmentList();
}
///获取设备类型
void getEquipmentList() {
HttpUtils.getEquipmentList(context, officeId).then((value) {
EquipmentListBo listBo = value;
if (mounted) {
setState(() {
officeLists = listBo.list;
filterOfficeLists = officeLists;
});
}
});
}
void _filterData(String query) {
setState(() {
filterOfficeLists = officeLists!.where((EquiList item) {
return item.name!.toLowerCase().contains(query.toLowerCase());
}).toList();
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBarCustom(text: '选择设备', height: 50),
body: Column(
children: [
const SizedBox(height: 10),
Container(
margin: const EdgeInsets.only(left: 10, right: 10),
decoration: BoxDecoration(
color: Colors.grey[200],
borderRadius: BorderRadius.circular(10),
),
child: Row(
children: [
IconButton(
icon: const Icon(Icons.search),
onPressed: () {
// 处理搜索逻辑
},
),
Expanded(
child: TextField(
onChanged: (value) {
_filterData(value);
},
decoration: const InputDecoration(
hintText: '请输入搜索关键字',
border: InputBorder.none,
),
),
),
],
),
),
const SizedBox(height: 10),
Flexible(
child: ListView.builder(
shrinkWrap: true,
padding:
const EdgeInsets.only(top: 0, left: 0, bottom: 0, right: 0),
itemCount: filterOfficeLists!.length,
// 列表项数量
itemBuilder: (context, index) {
return GestureDetector(
onTap: () {
setState(() {
Get.back(result: filterOfficeLists![index]);
});
},
child: Container(
padding: const EdgeInsets.only(
left: 30, right: 15, top: 10, bottom: 10),
child: Text(
filterOfficeLists![index].name!,
style: const TextStyle(fontSize: 18),
),
),
);
},
),
),
],
),
);
}
}
......@@ -171,7 +171,7 @@ class _RegisterPage2State extends State<RegisterPage2> {
),
child: const Text(
softWrap: true,
'密码至少包含以下 3 种类别:大写字母、小写字母、数字、特殊符号( @#*. )、8-20位',
'密码至少包含以下 5 种类别:大写字母、小写字母、数字、特殊符号( @#*. )、8-20位',
style: TextStyle(color: Colors.orange, fontSize: 12),
),
),
......
......@@ -142,6 +142,31 @@ class _InspectListSyPageState extends State<InspectListSyPage>
backgroundColor: Colors.grey[100],
body: Column(
children: [
Container(
alignment: Alignment.centerLeft,
margin: const EdgeInsets.only(left: 10, right: 10, top: 10),
padding:
const EdgeInsets.only(left: 5, right: 5, top: 3, bottom: 3),
decoration: BoxDecoration(
color: Colors.orange[50],
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(5),
topRight: Radius.circular(5),
bottomLeft: Radius.circular(5),
bottomRight: Radius.circular(5)),
),
child: Text(
softWrap: true,
type == '1'
? '小提示:当天新建的设备和用户,会在第二天生成【日管控】任务.'
: type == '2'
? '小提示:【周排查】可在 每周四-周日 完成任务.'
: type == '3'
? '小提示:【月调度】可在 每月25日-月底 完成任务.'
: '',
style: const TextStyle(color: Colors.orange, fontSize: 14),
),
),
Expanded(
flex: 1,
child: EasyRefresh(
......@@ -282,7 +307,7 @@ class _InspectListSyPageState extends State<InspectListSyPage>
Card buildWeekCard(BuildContext context, int index) {
return Card(
margin: const EdgeInsets.only(left: 0, right: 0, top: 15, bottom: 0),
margin: const EdgeInsets.only(left: 0, right: 0, top: 10, bottom: 0),
elevation: listWeek[index].allow == '0' ? 3 : 0,
color: listWeek[index].allow == '0' ? Colors.white : Colors.grey[300],
shape: const RoundedRectangleBorder(
......@@ -310,7 +335,7 @@ class _InspectListSyPageState extends State<InspectListSyPage>
Card buildMonthsCard(BuildContext context, int index) {
return Card(
margin: const EdgeInsets.only(left: 0, right: 0, top: 15, bottom: 0),
margin: const EdgeInsets.only(left: 0, right: 0, top: 10, bottom: 0),
elevation: listMonth[index].allow == '0' ? 3 : 0,
color: listMonth[index].allow == '0' ? Colors.white : Colors.grey[300],
shape: const RoundedRectangleBorder(
......@@ -340,7 +365,7 @@ class _InspectListSyPageState extends State<InspectListSyPage>
Card buildDaysCard(BuildContext context, int index) {
return Card(
elevation: 3,
margin: const EdgeInsets.only(left: 0, right: 0, top: 15, bottom: 0),
margin: const EdgeInsets.only(left: 0, right: 0, top: 10, bottom: 0),
color: Colors.white,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(5)),
......
......@@ -104,8 +104,8 @@ class _EquipmentSettingsPageState extends State<EquipmentSettingsPage> {
children: [
Image.asset('assets/home/rigister_bg.png'),
Container(
margin:
const EdgeInsets.only(left: 15, top: 130, right: 15, bottom: 0),
margin: EdgeInsets.only(
left: 15, top: type == '1' ? 150 : 130, right: 15, bottom: 0),
decoration: const BoxDecoration(
color: ColorConst.whiteColor,
borderRadius: BorderRadius.all(Radius.circular(10)),
......@@ -196,6 +196,25 @@ class _EquipmentSettingsPageState extends State<EquipmentSettingsPage> {
hintText: type == '3' ? '' : '请填写设备名称',
controller: nameText,
focusNode: nameFocusNode),
Container(
alignment: Alignment.centerLeft,
margin: const EdgeInsets.only(left: 5, right: 5, top: 5),
padding: const EdgeInsets.only(
left: 5, right: 5, top: 3, bottom: 3),
decoration: BoxDecoration(
color: Colors.orange[50],
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(5),
topRight: Radius.circular(5),
bottomLeft: Radius.circular(5),
bottomRight: Radius.circular(5)),
),
child: const Text(
softWrap: true,
'设备名称可识别对应设备即可,没有特殊要求;\n例如:曳引驱动乘客电梯-1;曳引驱动乘客电梯-2',
style: TextStyle(color: Colors.orange, fontSize: 12),
),
),
const SizedBox(height: 10),
Row(children: [
Icon(
......@@ -216,6 +235,25 @@ class _EquipmentSettingsPageState extends State<EquipmentSettingsPage> {
controller: codeText,
focusNode: codeFocusNode,
isNoChinese: true),
Container(
alignment: Alignment.centerLeft,
margin: const EdgeInsets.only(left: 5, right: 5, top: 5),
padding: const EdgeInsets.only(
left: 5, right: 5, top: 3, bottom: 3),
decoration: BoxDecoration(
color: Colors.orange[50],
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(5),
topRight: Radius.circular(5),
bottomLeft: Radius.circular(5),
bottomRight: Radius.circular(5)),
),
child: const Text(
softWrap: true,
'内部编码可识别对应设备即可,没有特殊要求;\n例如:DT-1;DT-2',
style: TextStyle(color: Colors.orange, fontSize: 12),
),
),
const SizedBox(height: 8),
Row(children: [
Icon(type == '3' ? Icons.assignment_ind : Icons.touch_app,
......@@ -253,6 +291,25 @@ class _EquipmentSettingsPageState extends State<EquipmentSettingsPage> {
hintText: type == '3' ? '' : '请填写设备地址详细地址',
controller: addressText,
focusNode: addressFocusNode),
Container(
alignment: Alignment.centerLeft,
margin: const EdgeInsets.only(left: 5, right: 5, top: 5),
padding: const EdgeInsets.only(
left: 5, right: 5, top: 3, bottom: 3),
decoration: BoxDecoration(
color: Colors.orange[50],
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(5),
topRight: Radius.circular(5),
bottomLeft: Radius.circular(5),
bottomRight: Radius.circular(5)),
),
child: const Text(
softWrap: true,
'当前设备的具体位置;例如:1号楼1单元左侧电梯',
style: TextStyle(color: Colors.orange, fontSize: 12),
),
),
],
)
],
......@@ -344,7 +401,7 @@ class _EquipmentSettingsPageState extends State<EquipmentSettingsPage> {
Container buildTopTitle(BuildContext context) {
return Container(
margin: const EdgeInsets.only(top: 50),
margin: const EdgeInsets.only(top: 50, right: 30),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
......@@ -356,33 +413,35 @@ class _EquipmentSettingsPageState extends State<EquipmentSettingsPage> {
icon: const Icon(Icons.arrow_back, color: Colors.white),
iconSize: 30,
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Container(
margin: const EdgeInsets.only(top: 5),
child: Text(
titleText()!,
style: const TextStyle(
fontSize: 23,
color: Colors.white,
fontWeight: FontWeight.bold),
)),
Container(
height: 3,
width: 50,
alignment: Alignment.topLeft,
margin: const EdgeInsets.only(top: 3, bottom: 3),
decoration: const BoxDecoration(
color: Colors.white54,
borderRadius: BorderRadius.all(Radius.circular(5)),
)),
Text(
subTitleText()!,
style: const TextStyle(fontSize: 12, color: Colors.white),
),
],
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Container(
margin: const EdgeInsets.only(top: 5),
child: Text(
titleText()!,
style: const TextStyle(
fontSize: 23,
color: Colors.white,
fontWeight: FontWeight.bold),
)),
Container(
height: 3,
width: 50,
alignment: Alignment.topLeft,
margin: const EdgeInsets.only(top: 3, bottom: 3),
decoration: const BoxDecoration(
color: Colors.white54,
borderRadius: BorderRadius.all(Radius.circular(5)),
)),
Text(
subTitleText()!,
style: const TextStyle(fontSize: 12, color: Colors.white),
),
],
),
),
],
),
......@@ -401,7 +460,7 @@ class _EquipmentSettingsPageState extends State<EquipmentSettingsPage> {
String? subTitleText() {
if (type == '1') {
return '我们将根据您填写的内容来为您【新建设备】';
return '我们将根据您填写的内容来为您【新建设备】\n注意:使用单位需【新建设备】,否则不会生成【日管控】【周排查】【月调度】任务';
} else if (type == '2') {
return '我们将根据您填写的内容来为您【修改设备】';
} else {
......
......@@ -53,29 +53,55 @@ class _EquipmentListSCPageState extends State<EquipmentListSCPage> {
@override
Widget build(BuildContext context) {
return EasyRefresh(
firstRefresh: true,
enableControlFinishRefresh: true,
// enableControlFinishLoad: true,
firstRefreshWidget: const FirstRefreshWidget(),
return Stack(
children: [
Container(
margin: EdgeInsets.only(top: 20),
child: EasyRefresh(
firstRefresh: true,
enableControlFinishRefresh: true,
// enableControlFinishLoad: true,
firstRefreshWidget: const FirstRefreshWidget(),
emptyWidget: list.isEmpty
? EmptyImgWidget(
title: '暂无数据,点击刷新',
onTap: () {
getData();
})
: null,
controller: _controller,
onRefresh: () async {
// page = 1;
getData();
},
emptyWidget: list.isEmpty
? EmptyImgWidget(
title: '暂无数据,点击刷新',
onTap: () {
getData();
})
: null,
controller: _controller,
onRefresh: () async {
// page = 1;
getData();
},
// onLoad: () async {
// page++;
// getList();
// },
child: buildBody(),
child: buildBody(),
),
),
Container(
alignment: Alignment.centerLeft,
height: 25,
margin: const EdgeInsets.only(left: 10, right: 10, top: 5),
padding: const EdgeInsets.only(left: 5, right: 5, top: 3, bottom: 3),
decoration: BoxDecoration(
color: Colors.orange[50],
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(5),
topRight: Radius.circular(5),
bottomLeft: Radius.circular(5),
bottomRight: Radius.circular(5)),
),
child: const Text(
softWrap: true,
'小提示:生产单位无需【新建设备】.',
style: TextStyle(color: Colors.orange, fontSize: 12),
),
),
],
);
}
......
......@@ -50,28 +50,31 @@ class _EquipmentListSYPageState extends State<EquipmentListSYPage> {
Widget build(BuildContext context) {
return Stack(
children: [
EasyRefresh(
firstRefresh: true,
enableControlFinishRefresh: true,
// enableControlFinishLoad: true,
firstRefreshWidget: const FirstRefreshWidget(),
emptyWidget: list.isEmpty
? EmptyImgWidget(
title: '暂无数据,点击刷新',
onTap: () {
getData();
})
: null,
controller: _controller,
onRefresh: () async {
// page = 1;
getData();
},
Container(
margin: const EdgeInsets.only(top: 20),
child: EasyRefresh(
firstRefresh: true,
enableControlFinishRefresh: true,
// enableControlFinishLoad: true,
firstRefreshWidget: const FirstRefreshWidget(),
emptyWidget: list.isEmpty
? EmptyImgWidget(
title: '暂无数据,点击刷新',
onTap: () {
getData();
})
: null,
controller: _controller,
onRefresh: () async {
// page = 1;
getData();
},
// onLoad: () async {
// page++;
// getList();
// },
child: buildBody(),
child: buildBody(),
),
),
if (isUnitRoles(StorageUtil.getInstance().getRoleNames())!) ...[
Positioned(
......@@ -92,17 +95,40 @@ class _EquipmentListSYPageState extends State<EquipmentListSYPage> {
}
});
},
width: 60,
height: 60,
width: 70,
height: 70,
borderRadius: const BorderRadius.all(Radius.circular(360)),
disable: false,
colors: const [ColorConst.blueColor, ColorConst.blue1Color],
colors: const [
ColorConst.orangeColor,
ColorConst.orange2Color
],
child: const Text(
"新建\n设备",
style:
TextStyle(fontSize: 14, color: ColorConst.whiteColor),
TextStyle(fontSize: 16, color: ColorConst.whiteColor),
))),
),
Container(
alignment: Alignment.centerLeft,
height: 25,
margin: const EdgeInsets.only(left: 10, right: 10, top: 5),
padding:
const EdgeInsets.only(left: 5, right: 5, top: 3, bottom: 3),
decoration: BoxDecoration(
color: Colors.orange[50],
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(5),
topRight: Radius.circular(5),
bottomLeft: Radius.circular(5),
bottomRight: Radius.circular(5)),
),
child: const Text(
softWrap: true,
'小提示:使用单位需要【新建设备】.',
style: TextStyle(color: Colors.orange, fontSize: 14),
),
),
]
],
);
......
......@@ -95,19 +95,19 @@ class _UserListPageState extends State<UserListPage> {
}
});
},
width: 60,
height: 60,
width: 70,
height: 70,
borderRadius:
const BorderRadius.all(Radius.circular(360)),
disable: false,
colors: const [
ColorConst.blueColor,
ColorConst.blue1Color
ColorConst.orangeColor,
ColorConst.orange2Color
],
child: const Text(
"新建\n用户",
style: TextStyle(
fontSize: 14, color: ColorConst.whiteColor),
fontSize: 16, color: ColorConst.whiteColor),
))),
),
]
......@@ -140,9 +140,9 @@ class _UserListPageState extends State<UserListPage> {
// Get.toNamed(RouteString.USER_SETTINGS, arguments: '3');
},
child: Card(
elevation: 2,
elevation: 5,
margin: const EdgeInsets.only(left: 0, right: 0, top: 15, bottom: 0),
color: Colors.white,
color: isItemRoleNames(roleNames(index))?ColorConst.orange1Color :Colors.white ,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(10)),
),
......@@ -211,8 +211,9 @@ class _UserListPageState extends State<UserListPage> {
TextSpan(
text: roleNames(index),
style: const TextStyle(
fontSize: 13,
color: Colors.black54)),
fontWeight: FontWeight.bold,
fontSize: 14,
color: Colors.black87)),
])),
),
],
......
import 'package:shared_preferences/shared_preferences.dart';
import 'package:special_equipment_flutter/model/user_bo.dart';
///数据库相关的工具
class SPAccountUtil {
static const String ACCOUNT_NUMBER = "account_number";
static const String USERNAME = "username";
static const String PASSWORD = "password";
///删掉单个账号
static void delUser(UserBo user, index) async {
SharedPreferences sp = await SharedPreferences.getInstance();
List<UserBo> list = await getUsers();
// list.remove(user);
list.removeAt(index);
saveUsers(list, sp);
}
///保存账号,如果重复,就将最近登录账号放在第一个
static void saveUser(UserBo user) async {
SharedPreferences sp = await SharedPreferences.getInstance();
List<UserBo> list = await getUsers();
addNoRepeat(list, user);
saveUsers(list, sp);
}
///去重并维持次序
static void addNoRepeat(List<UserBo> users, UserBo user) {
for (int i = 0; i < users.length; i++) {
if (users[i].account == user.account) {
users.removeAt(i);
}
}
users.insert(0, user);
}
///获取已经登录的账号列表
static Future<List<UserBo>> getUsers() async {
List<UserBo> list = [];
SharedPreferences sp = await SharedPreferences.getInstance();
int num = sp.getInt(ACCOUNT_NUMBER) ?? 0;
for (int i = 0; i < num; i++) {
String? username = sp.getString("$USERNAME$i");
String? password = sp.getString("$PASSWORD$i");
list.add(UserBo(username, password));
}
return list;
}
///保存账号列表
static saveUsers(List<UserBo> users, SharedPreferences sp) {
sp.clear();
int size = users.length;
for (int i = 0; i < size; i++) {
sp.setString("$USERNAME$i", users[i].account!);
sp.setString("$PASSWORD$i", users[i].password!);
}
sp.setInt(ACCOUNT_NUMBER, size);
}
}
import 'dart:convert';
import 'package:get_storage/get_storage.dart';
import 'package:special_equipment_flutter/ui/common/data.dart';
import 'package:special_equipment_flutter/model/user_bo.dart';
import 'package:special_equipment_flutter/utils/string_utils.dart';
class SpKeys {
static const USER_NAME = "spUserName";
static const PASSWORD = "spPassword";
static const NAME = "spName";
static const JSESSION_ID = "spJsessionId";
static const USER_ID = "spUserId";
......@@ -19,6 +22,10 @@ class SpKeys {
///拍照位置
static const CAMERA_ADDRESS = "camera_address";
static const ACCOUNT_NUMBER = "account_number";
static const ACCOUNT = "account";
static const PASSWORDS = "password";
}
class StorageUtil {
......@@ -77,6 +84,11 @@ class StorageUtil {
return userId;
}
T getPassword<T>() {
var password = get(SpKeys.PASSWORD);
return password;
}
T getName<T>() {
var nickName = get(SpKeys.NAME);
return nickName;
......@@ -134,4 +146,37 @@ class StorageUtil {
return false;
}
}
///删掉单个账号
// delUser(UserBo user) {
// List<UserBo> list = getUsers();
// list.remove(user);
// saveUsers(list);
// }
///保存账号,如果重复,就将最近登录账号放在第一个
saveUser(UserBo user) {
List<UserBo>? userList = get(SpKeys.ACCOUNT_NUMBER);
userList ??= [];
bool isFlag = true;
for (int i = 0; i < userList.length; i++) {
if (userList[i].account == user.account) {
userList.removeAt(i);
isFlag = false;
}
}
if (isFlag) {
userList.add(user);
} else {
userList.insert(0, user);
}
set(SpKeys.ACCOUNT_NUMBER, userList);
}
getUserList<T>() {
List<UserBo>? userList = get(SpKeys.ACCOUNT_NUMBER);
userList ??= [];
return userList;
}
}
//// ignore_for_file: non_constant_identifier_names, library_private_types_in_public_api, import_of_legacy_library_into_null_safe
//
//import 'package:flutter/material.dart';
//import 'package:flutter_swiper/flutter_swiper.dart';
//
//class SlideBanner extends StatefulWidget {
// const SlideBanner({super.key});
//
// @override
// _SwiperPageState createState() => _SwiperPageState();
//}
//
//class _SwiperPageState extends State<SlideBanner> {
// ignore_for_file: non_constant_identifier_names, library_private_types_in_public_api, import_of_legacy_library_into_null_safe
import 'package:card_swiper/card_swiper.dart';
import 'package:flutter/material.dart';
import 'package:special_equipment_flutter/dio/api.dart';
import '../model/banner_list_bo.dart';
class SlideBanner extends StatefulWidget {
const SlideBanner({super.key, required this.bannerList});
final List<Data>? bannerList;
@override
_SwiperPageState createState() => _SwiperPageState();
}
class _SwiperPageState extends State<SlideBanner> {
List<Map> imgList = [
{"url": "assets/images/image0.png"},
{"url": "assets/images/image1.png"},
{"url": "assets/images/image2.png"},
{"url": "assets/images/image3.png"},
{"url": "assets/images/image4.png"},
{"url": "assets/images/image5.png"},
];
// List<Map> imgList = [
// {"url": "assets/images/image0.png"},
// {"url": "assets/images/image1.png"},
// {"url": "assets/images/image2.png"},
// {"url": "assets/images/image3.png"},
// {"url": "assets/images/image4.png"},
// {"url": "assets/images/image5.png"},
// {
// "url":
// "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fcdn.aitecar.com%2Fwp-content%2Fuploads%2F2014%2F11%2F20141119113831dc84baa9b3e7d0c7a37a.jpg&refer=http%3A%2F%2Fcdn.aitecar.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1671264681&t=d919a7187f42bd7c0ac775ce08fc63bd"
// },
// {
// "url":
// "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fwww2.autoimg.cn%2Fchejiahaodfs%2Fg8%2FM12%2FA3%2F22%2Fautohomecar__ChwEmmDmZhSAUiI3AAHEf6vp_kw118.png&refer=http%3A%2F%2Fwww2.autoimg.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1671264664&t=0a7d80e389aab22d6e724df0183e8f57"
// },
// {
// "url":
// "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fp4.itc.cn%2Fimages01%2F20211023%2F55209e5c4f324f2ba3a0a27e51c7486a.jpeg&refer=http%3A%2F%2Fp4.itc.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1671264668&t=c0395ee14ae1b7674d3283c4ba4bb4bc"
// },
// {
// "url":
// "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fwww2.autoimg.cn%2Fchejiahaodfs%2Fg8%2FM12%2FA3%2F22%2Fautohomecar__ChwEmmDmZhSAUiI3AAHEf6vp_kw118.png&refer=http%3A%2F%2Fwww2.autoimg.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1671264664&t=0a7d80e389aab22d6e724df0183e8Qf57"
// },
// ];
//
//// List<Map> imgList = [
//// {
//// "url":
//// "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fcdn.aitecar.com%2Fwp-content%2Fuploads%2F2014%2F11%2F20141119113831dc84baa9b3e7d0c7a37a.jpg&refer=http%3A%2F%2Fcdn.aitecar.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1671264681&t=d919a7187f42bd7c0ac775ce08fc63bd"
//// },
//// {
//// "url":
//// "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fwww2.autoimg.cn%2Fchejiahaodfs%2Fg8%2FM12%2FA3%2F22%2Fautohomecar__ChwEmmDmZhSAUiI3AAHEf6vp_kw118.png&refer=http%3A%2F%2Fwww2.autoimg.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1671264664&t=0a7d80e389aab22d6e724df0183e8f57"
//// },
//// {
//// "url":
//// "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fp4.itc.cn%2Fimages01%2F20211023%2F55209e5c4f324f2ba3a0a27e51c7486a.jpeg&refer=http%3A%2F%2Fp4.itc.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1671264668&t=c0395ee14ae1b7674d3283c4ba4bb4bc"
//// },
//// {
//// "url":
//// "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fwww2.autoimg.cn%2Fchejiahaodfs%2Fg8%2FM12%2FA3%2F22%2Fautohomecar__ChwEmmDmZhSAUiI3AAHEf6vp_kw118.png&refer=http%3A%2F%2Fwww2.autoimg.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1671264664&t=0a7d80e389aab22d6e724df0183e8Qf57"
//// },
//// ];
//
// @override
// Widget build(BuildContext context) {
// var MySwiperWidget = Swiper(
// itemBuilder: (BuildContext context, int index) {
// //每次循环遍历时,将i赋值给index
// return Image.asset(
// imgList[index]['url'],
// fit: BoxFit.fill,
// );
//// return Image.network(
//// imgList[index]['url'],
//// fit: BoxFit.fill,
//// );
// },
// autoplay: true,
// duration: 300,
// itemCount: imgList.length,
//// layout: SwiperLayout.DEFAULT,
//// scale: 0.93,
//// viewportFraction: 0.9,
// //指示器样式
// pagination: const SwiperPagination(
// alignment: Alignment.bottomRight,
// builder: DotSwiperPaginationBuilder(
// color: Colors.black54,
// activeColor: Colors.white,
// size: 10,
// activeSize: 12,
// )),
// );
// return Scaffold(
// body: SizedBox(
// height: 200,
// width: double.infinity,
// child: MySwiperWidget,
// ));
// }
//}
@override
Widget build(BuildContext context) {
var MySwiperWidget = Swiper(
itemBuilder: (BuildContext context, int index) {
//每次循环遍历时,将i赋值给index
// return Image.asset(
// imgList[index]['url'],
// fit: BoxFit.fill,
// );
return Image.network(
'${Api.URL}special${widget.bannerList![index].advertisUrl!}',
fit: BoxFit.fill,
);
},
autoplay: true,
duration: 2000,
autoplayDelay: 5000,
itemCount: widget.bannerList!.length,
// pagination: const SwiperPagination(
// builder: DotSwiperPaginationBuilder(
// color: Color(0xFFD39C7F), activeColor: Color(0xFFFF4646))),
// layout: SwiperLayout.DEFAULT,
// scale: 0.93,
// viewportFraction: 0.9,
//指示器样式
// pagination: const SwiperPagination(
// alignment: Alignment.bottomRight,
// builder: DotSwiperPaginationBuilder(
// color: Colors.black54,
// activeColor: Colors.white,
// size: 10,
// activeSize: 12,
// )),
);
return Scaffold(
body: SizedBox(
height: 200,
width: double.infinity,
child: MySwiperWidget,
));
}
}
import 'package:card_swiper/card_swiper.dart';
import 'package:flutter/material.dart';
import 'package:special_equipment_flutter/dio/api.dart';
import '../model/banner_list_bo.dart';
//layouts swiper
class CardSwiper extends StatefulWidget {
const CardSwiper({super.key, required this.bannerList});
final List<Data>? bannerList;
@override
_CardSwiperState createState() => _CardSwiperState();
}
class _CardSwiperState extends State<CardSwiper> {
// List<Map> banner = [
// {"url": "assets/banner/banner1.jpg"},
// {"url": "assets/banner/banner2.jpg"},
// {"url": "assets/banner/banner1.jpg"}
// ];
@override
Widget build(BuildContext context) {
return SizedBox(
height: 230,
child: Swiper(
itemBuilder: (BuildContext context, int index) {
// return Image.asset(
// widget.bannerList[index].advertisUrl,
// fit: BoxFit.fill,
// );
return Image.network(
'${Api.URL}special${widget.bannerList![index].advertisUrl!}',
fit: BoxFit.fill,
errorBuilder: (context, error, stackTrace) {
return Image.asset('assets/day/no_data_icon.png');
},
);
},
onTap: (index) {
print(index);
},
itemCount: widget.bannerList!.length,
pagination: const SwiperPagination(
builder: DotSwiperPaginationBuilder(
color: Color(0xFFD39C7F), activeColor: Color(0xFFFF4646))),
// loop: false,
autoplay: true,
duration: 2000,
autoplayDelay: 5000
// viewportFraction: 0.8,
// scale: 0.9,
),
);
}
}
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
class NumChangeWidget extends StatefulWidget {
final double height;
int num;
final ValueChanged<int> onValueChanged;
final bool disabled;
NumChangeWidget(
{Key? key,
this.height = 25.0,
this.num = 0,
this.disabled = false,
required this.onValueChanged})
: super(key: key);
@override
_NumChangeWidgetState createState() {
return _NumChangeWidgetState();
}
}
class _NumChangeWidgetState extends State<NumChangeWidget> {
TextEditingController _numcontroller = TextEditingController();
@override
void initState() {
super.initState();
_numcontroller.addListener(_onNumChange);
}
void _onNumChange() {
String text = _numcontroller.text;
if (text.isNotEmpty) {
String result = text.replaceAll(RegExp(r'^[0]+'), ''); // 去掉首位0的正则替换
if (result != '') {
widget.num = int.parse(result);
widget.onValueChanged(widget.num);
}
if (result != text) {
_numcontroller.selection =
TextSelection.fromPosition(TextPosition(offset: result.length));
}
}
}
@override
Widget build(BuildContext context) {
_numcontroller.text = widget.num.toString();
return Container(
height: widget.height,
decoration: const BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(2.0)),
color: Colors.black54),
child: Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
GestureDetector(
onTap: _minusNum,
child: Container(
width: 25.0,
alignment: Alignment.center,
child: Icon(Icons.horizontal_rule_outlined,
color: widget.num == 0 || widget.disabled
? Color.fromRGBO(255, 255, 255, .4)
: Colors.white),
),
),
Container(
width: 0.5,
color: Colors.black54,
),
Container(
width: 32.0,
alignment: Alignment.center,
child: TextField(
controller: _numcontroller,
//TextEditingController,用于获取文本值
keyboardType: TextInputType.number,
//设置键盘为数字
textAlign: TextAlign.center,
// 内容左右居中
maxLines: 1,
decoration: const InputDecoration(
border: InputBorder.none,
contentPadding: EdgeInsets.only(bottom: 10),
),
inputFormatters: [
FilteringTextInputFormatter.digitsOnly, //设置只允许输入整数
],
style: TextStyle(fontSize: 16, color: Colors.white),
readOnly: widget.disabled),
),
Container(
width: 0.5,
color: Colors.black54,
),
GestureDetector(
onTap: _addNum,
child: Container(
width: 25.0,
alignment: Alignment.center,
child: Icon(
Icons.add_outlined,
color: widget.disabled
? const Color.fromRGBO(255, 255, 255, .4)
: Colors.white,
), // 设计图
),
),
],
),
);
}
void _minusNum() {
if (widget.num == 0 || widget.disabled) {
return;
}
setState(() {
widget.num -= 1;
if (widget.onValueChanged != null) {
widget.onValueChanged(widget.num);
}
});
}
void _addNum() {
if (widget.disabled) {
return;
}
setState(() {
widget.num += 1;
if (widget.onValueChanged != null) {
widget.onValueChanged(widget.num);
}
});
}
}
......@@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
# In Windows, build-name is used as the major, minor, and patch parts
# of the product and file versions while build-number is used as the build suffix.
version: 1.0.6+6
version: 1.0.7+7
environment:
sdk: '>=3.1.3 <4.0.0'
......@@ -57,7 +57,10 @@ dependencies:
flutter_bmflocation: ^3.5.0
sliding_up_panel: ^2.0.0+1
event_bus: ^2.0.0
card_swiper: ^3.0.1
# pdf: ^3.11.0
# printing: ^5.12.0
# pdfx: ^2.6.0
# geolocator: ^7.1.0
# geocoding: ^2.1.1
......@@ -73,7 +76,7 @@ dependencies:
# event_bus: ^2.0.0
# provider: ^6.0.5
# shake_animation_widget: ^3.0.3
# flutter_xupdate: ^2.0.0
# flutter_xupdate: ^0.0.2
dev_dependencies:
......@@ -100,7 +103,6 @@ flutter:
# To add assets to your application, add an assets section, like this:
assets:
- assets/home/top_bg_icon.png
- assets/home/day_control_white_icon.png
- assets/home/monthly_scheduling_white_icon.png
- assets/home/weekly_survey_white_icon.png
......@@ -136,6 +138,9 @@ flutter:
- assets/examine/no_pass_icon.png
- assets/examine/examine_gary_icon.png
- assets/examine/history_icon.png
- assets/name.pdf
# An image asset can refer to one or more resolution-specific "variants", see
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment