2025.7.16 备份

main
xufei 2025-07-16 08:38:10 +08:00
parent d0307e7f09
commit 102b5b7011
12 changed files with 1325 additions and 43 deletions

View File

@ -221,4 +221,62 @@ U6Hzm1ninpWeE+awIDAQAB
);
}
///TODO --------------------------------- ---------------------------------
///
static Future<Map<String, dynamic>> setFeedBack(String backTitle,String backContent,String backType,String imgPaths) {
return HttpManager().request(
basePath,
'/app/feedback/upload',
method: Method.post,
data: {
"FEEDBACK_TITLE":backTitle,
"FEEDBACK_CONTENT":backContent,
"FEEDBACK_TYPE":backType,
"FEEDBACK_IMG" :imgPaths,
"loginUserId":SessionService.instance.loginUserId,
"CORPINFO_ID":SessionService.instance.corpinfoId,
"USER_ID":SessionService.instance.loginUserId,
},
);
}
///
static Future<Map<String, dynamic>> changePassWord(String oldPwd,String confirmPwd) {
return HttpManager().request(
basePath,
'/app/user/editUserPwd',
method: Method.post,
data: {
"USERNAME": SessionService.instance.loginUser?["USERNAME"]??"",
"PASSWORD": oldPwd,
"NOWPASSWORD": confirmPwd,
"CORPINFO_ID":SessionService.instance.corpinfoId,
"USER_ID":SessionService.instance.loginUserId,
},
);
}
///
static Future<Map<String, dynamic>> getDutyManagement(int showCount, int currentPage) {
return HttpManager().request(
basePath,
'/app/user/editUserPwd?showCount=$showCount&currentPage=$currentPage',
method: Method.post,
data: {
"CORPINFO_ID":SessionService.instance.corpinfoId,
"USER_ID":SessionService.instance.loginUserId,
// ISMAIN:loginUser.ISMAIN,
// ISSUPERVISE:loginUser.ISSUPERVISE,
"DEPARTMENT_ID":SessionService.instance.deptId,
"TYPE": 'edit'
},
);
}
}

View File

@ -0,0 +1,61 @@
import 'package:flutter/material.dart';
import 'package:qhd_prevention/pages/my_appbar.dart';
import 'package:qhd_prevention/tools/h_colors.dart';
import '../../tools/tools.dart';
import 'mine_departure_record.dart';
import 'mine_duty_management.dart';
class MineDepartureListPage extends StatelessWidget {
const MineDepartureListPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: MyAppbar(title: "离岗"),
backgroundColor: h_backGroundColor(),
body: Column(
children: [
GestureDetector(
child: _setItemWidget("离岗管理"),
onTap: () {
pushPage(MineDutyManagementPage(), context);
},
),
Divider(height: 1, color: Colors.black12),
GestureDetector(
child: _setItemWidget("离岗记录"),
onTap: () {
// pushPage(MineSignPage(), context);
pushPage(MineDepartureRecordPage(), context);
}
),
],
),
);
}
Widget _setItemWidget(final String text) {
return Container(
height: 55,
color: Colors.white,
child: Padding(
padding: EdgeInsets.all(15),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(text, style: TextStyle(fontSize: 16)),
Icon(Icons.chevron_right),
],
),
),
);
}
}

View File

@ -0,0 +1,249 @@
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:qhd_prevention/pages/my_appbar.dart';
import '../../tools/tools.dart';
import 'mine_duty_application.dart';
import 'mine_duty_detail.dart';
class LeaveRecord {
final String applicant;
final String department;
final String position;
final DateTime startDate;
final DateTime endDate;
final String status;
final Color statusColor;
LeaveRecord({
required this.applicant,
required this.department,
required this.position,
required this.startDate,
required this.endDate,
required this.status,
required this.statusColor,
});
}
class MineDepartureRecordPage extends StatefulWidget {
const MineDepartureRecordPage({super.key});
@override
State<MineDepartureRecordPage> createState() => _MineDepartureRecordPage();
}
class _MineDepartureRecordPage extends State<MineDepartureRecordPage> {
Future<void> _onRefresh() async {
//
await Future.delayed(const Duration(seconds: 2));
// fetchData()
setState(() {
// TODO:
});
}
@override
Widget build(BuildContext context) {
//
final leaveRecords = [
LeaveRecord(
applicant: "王轩",
department: "测试部",
position: "测试员",
startDate: DateTime(2025, 7, 18),
endDate: DateTime(2025, 7, 18),
status: "无需审批",
statusColor: const Color(0xFF4CAF50),
),
LeaveRecord(
applicant: "王轩",
department: "测试部",
position: "测试员",
startDate: DateTime(2025, 7, 16),
endDate: DateTime(2025, 7, 16),
status: "无需审批",
statusColor: const Color(0xFF4CAF50),
),
LeaveRecord(
applicant: "李思",
department: "开发部",
position: "高级工程师",
startDate: DateTime(2025, 7, 20),
endDate: DateTime(2025, 7, 22),
status: "待审批",
statusColor: const Color(0xFFF57C00),
),
LeaveRecord(
applicant: "张伟",
department: "产品部",
position: "产品经理",
startDate: DateTime(2025, 7, 15),
endDate: DateTime(2025, 7, 17),
status: "已拒绝",
statusColor: const Color(0xFFF44336),
),
];
return Scaffold(
backgroundColor: const Color(0xFFF5F7FA),
appBar: MyAppbar(title: "离岗记录"),
body:
RefreshIndicator(
onRefresh: _onRefresh,
child:
//
Expanded(
child: ListView.builder(
padding: const EdgeInsets.symmetric(vertical: 16),
itemCount: leaveRecords.length,
itemBuilder: (context, index) {
final record = leaveRecords[index];
return _buildRecordCard(record,context);
},
),
// ),
// ],
),
),
);
}
Widget _buildRecordCard(LeaveRecord record, BuildContext context) {
final dateFormat = DateFormat('yyyy-MM-dd');
final isSameDay = record.startDate == record.endDate;
final dateRange = isSameDay
? dateFormat.format(record.startDate)
: "${dateFormat.format(record.startDate)}${dateFormat.format(record.endDate)}";
return
// GestureDetector(
// onTap: () {
// pushPage(MineDutyDetailPage(), context);
// },
// child:
Container(
margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(12),
boxShadow: [
BoxShadow(
color: Colors.grey.withOpacity(0.1),
spreadRadius: 1,
blurRadius: 6,
offset: const Offset(0, 2),
)
],
),
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
//
Row(
children: [
// Container(
// width: 40,
// height: 40,
// decoration: BoxDecoration(
// color: const Color(0xFFE3F2FD),
// shape: BoxShape.circle,
// ),
// child: const Icon(Icons.person, color: Color(0xFF1976D2)),
// ),
// const SizedBox(width: 12),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"申请人:${record.applicant}",
style: const TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
),
),
const SizedBox(height: 4),
Text(
"部门:${record.department} \n岗位:${record.position}",
style: TextStyle(
fontSize: 13,
color: Colors.grey[600],
),
),
],
),
const Spacer(),
Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6),
decoration: BoxDecoration(
color: record.statusColor.withOpacity(0.1),
borderRadius: BorderRadius.circular(20),
),
child: Text(
record.status,
style: TextStyle(
color: record.statusColor,
fontWeight: FontWeight.w500,
),
),
),
],
),
const SizedBox(height: 16),
//
Row(
children: [
const Icon(Icons.calendar_today, size: 18, color: Colors.grey),
const SizedBox(width: 8),
Text(
"离岗时间: $dateRange",
style: const TextStyle(color: Colors.grey),
),
],
),
const SizedBox(height: 8),
//
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
TextButton(
onPressed: () {
pushPage(MineDutyDetailPage(), context);
},
style: TextButton.styleFrom(
foregroundColor: const Color(0xFF1976D2),
),
child: const Text("查看详情"),
),
// const SizedBox(width: 16),
// if (record.status == "待审批")
// ElevatedButton(
// onPressed: () {},
// style: ElevatedButton.styleFrom(
// backgroundColor: const Color(0xFF1976D2),
// padding: const EdgeInsets.symmetric(horizontal: 20),
// ),
// child: const Text("审批", style: TextStyle(color: Colors.white)),
// )
],
),
],
),
),
// ),
);
}
}

View File

@ -0,0 +1,264 @@
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:qhd_prevention/pages/my_appbar.dart';
class MineDutyApplicationPage extends StatefulWidget {
const MineDutyApplicationPage({super.key});
@override
State<MineDutyApplicationPage> createState() => _MineDutyApplicationPage();
}
class _MineDutyApplicationPage extends State<MineDutyApplicationPage> {
DateTime? _startDate;
DateTime? _endDate;
final TextEditingController _reasonController = TextEditingController();
final String _applicant = "王轩";
Future<void> _selectDate(BuildContext context, bool isStartDate) async {
final DateTime? picked = await showDatePicker(
context: context,
initialDate: DateTime.now(),
firstDate: DateTime(2000),
lastDate: DateTime(2100),
builder: (BuildContext context, Widget? child) {
return Theme(
data: ThemeData.light().copyWith(
colorScheme: const ColorScheme.light(
primary: Color(0xFF1976D2),
// buttonTheme: ButtonThemeData(
// textTheme: ButtonTextTheme.primary,
// ),
),
),
child: child!,
);
},
);
if (picked != null) {
setState(() {
if (isStartDate) {
_startDate = picked;
//
if (_endDate == null || _endDate!.isBefore(picked)) {
_endDate = picked;
}
} else {
//
if (_startDate != null && picked.isBefore(_startDate!)) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('结束日期不能早于开始日期'))
);
} else {
_endDate = picked;
}
}
});
}
}
void _submitApplication() {
if (_startDate == null || _endDate == null) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('请选择离岗时间'))
);
return;
}
if (_reasonController.text.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('请输入离岗原因'))
);
return;
}
//
showDialog(
context: context,
builder: (context) => AlertDialog(
title: const Text('申请提交成功'),
content: const Text('您的离岗申请已成功提交,请等待审批'),
actions: [
TextButton(
onPressed: () {
Navigator.pop(context); //
Navigator.pop(context); //
},
child: const Text("确定"),
)
],
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: const Color(0xFFF5F7FA),
appBar:MyAppbar(title: "离岗申请"),
body: SingleChildScrollView(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
//
_buildDateField(
label: "离岗开始时间",
date: _startDate,
onTap: () => _selectDate(context, true),
),
const SizedBox(height: 16),
//
_buildDateField(
label: "离岗结束时间",
date: _endDate,
onTap: () => _selectDate(context, false),
),
const SizedBox(height: 24),
//
const Text(
"离岗原因",
style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500),
),
const SizedBox(height: 8),
//
Container(
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(12),
boxShadow: [
BoxShadow(
color: Colors.grey.withOpacity(0.1),
spreadRadius: 1,
blurRadius: 6,
offset: const Offset(0, 2),
),
],
),
child: TextField(
controller: _reasonController,
maxLines: 5,
decoration: const InputDecoration(
hintText: "请输入离岗原因",
hintStyle: TextStyle(color: Color(0xFF9E9E9E)),
border: InputBorder.none,
),
),
),
const SizedBox(height: 24),
//
_buildInfoRow("申请人", _applicant),
const SizedBox(height: 40),
//
SizedBox(
width: double.infinity,
child: TextButton(
onPressed: _submitApplication,
style: ElevatedButton.styleFrom(
backgroundColor: const Color(0xFF1976D2),
padding: const EdgeInsets.symmetric(vertical: 16),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
),
child: Text(
"提交",
style: TextStyle(fontSize: 16, color: Colors.white),
),
),
),
],
),
),
);
}
Widget _buildDateField({
required String label,
required DateTime? date,
required VoidCallback onTap,
}) {
return GestureDetector(
onTap: onTap,
child: Container(
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(12),
boxShadow: [
BoxShadow(
color: Colors.grey.withOpacity(0.1),
spreadRadius: 1,
blurRadius: 6,
offset: const Offset(0, 2),
),
],
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
label,
style: const TextStyle(fontSize: 16),
),
Text(
date != null ? DateFormat('yyyy-MM-dd').format(date) : "请选择日期",
style: TextStyle(
fontSize: 16,
color: date != null ? Colors.black : const Color(0xFF9E9E9E),
),
),
],
),
),
);
}
Widget _buildInfoRow(String title, String value) {
return Container(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(12),
boxShadow: [
BoxShadow(
color: Colors.grey.withOpacity(0.1),
spreadRadius: 1,
blurRadius: 6,
offset: const Offset(0, 2),
),
],
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
title,
style: const TextStyle(fontSize: 16),
),
Text(
value,
style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w500),
),
],
),
);
}
}

View File

@ -0,0 +1,203 @@
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:qhd_prevention/pages/my_appbar.dart';
class MineDutyDetailPage extends StatefulWidget {
const MineDutyDetailPage({super.key});
@override
State<MineDutyDetailPage> createState() => _MineDutyDetailPage();
}
class _MineDutyDetailPage extends State<MineDutyDetailPage> {
DateTime? _startDate;
DateTime? _endDate;
final TextEditingController _reasonController = TextEditingController();
final String _applicant = "王轩";
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: const Color(0xFFF5F7FA),
appBar:MyAppbar(title: "离岗详情"),
body: SingleChildScrollView(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
//
_buildInfoRow("申请人", _applicant),
const SizedBox(height: 24),
//
_buildDateField(
label: "离岗开始时间",
date: _startDate,
onTap: () {
}
// () => _selectDate(context, true),
),
const SizedBox(height: 16),
//
_buildDateField(
label: "离岗结束时间",
date: _endDate,
onTap: () {
},
// () => _selectDate(context, false),
),
const SizedBox(height: 24),
//
const Text(
"离岗原因",
style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500),
),
const SizedBox(height: 8),
//
Container(
width: double.infinity,
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(12),
boxShadow: [
BoxShadow(
color: Colors.grey.withOpacity(0.1),
spreadRadius: 1,
blurRadius: 6,
offset: const Offset(0, 2),
),
],
),
child: Text(
"原因",style: TextStyle(color: Colors.black),
// controller: _reasonController,
// maxLines: 5,
// decoration: const InputDecoration(
// hintText: "请输入离岗原因",
// hintStyle: TextStyle(color: Color(0xFF9E9E9E)),
// border: InputBorder.none,
// ),
),
),
const SizedBox(height: 24),
//
_buildInfoRow("审批状态", "无需审批"),
const SizedBox(height: 40),
//
SizedBox(
width: double.infinity,
child: TextButton(
onPressed: () {
Navigator.pop(context);
},
style: ElevatedButton.styleFrom(
backgroundColor: const Color(0xFF1976D2),
padding: const EdgeInsets.symmetric(vertical: 16),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
),
child: Text(
"返回",
style: TextStyle(fontSize: 16, color: Colors.white),
),
),
),
],
),
),
);
}
Widget _buildDateField({
required String label,
required DateTime? date,
required VoidCallback onTap,
}) {
return GestureDetector(
onTap: onTap,
child: Container(
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(12),
boxShadow: [
BoxShadow(
color: Colors.grey.withOpacity(0.1),
spreadRadius: 1,
blurRadius: 6,
offset: const Offset(0, 2),
),
],
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
label,
style: const TextStyle(fontSize: 16),
),
Text(
date != null ? DateFormat('yyyy-MM-dd').format(date) : "请选择日期",
style: TextStyle(
fontSize: 16,
color: date != null ? Colors.black : const Color(0xFF9E9E9E),
),
),
],
),
),
);
}
Widget _buildInfoRow(String title, String value) {
return Container(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(12),
boxShadow: [
BoxShadow(
color: Colors.grey.withOpacity(0.1),
spreadRadius: 1,
blurRadius: 6,
offset: const Offset(0, 2),
),
],
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
title,
style: const TextStyle(fontSize: 16),
),
Text(
value,
style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w500),
),
],
),
);
}
}

View File

@ -0,0 +1,331 @@
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:qhd_prevention/pages/my_appbar.dart';
import '../../http/ApiService.dart';
import '../../tools/tools.dart';
import 'mine_duty_application.dart';
import 'mine_duty_detail.dart';
class LeaveRecord {
final String applicant;
final String department;
final String position;
final DateTime startDate;
final DateTime endDate;
final String status;
final Color statusColor;
LeaveRecord({
required this.applicant,
required this.department,
required this.position,
required this.startDate,
required this.endDate,
required this.status,
required this.statusColor,
});
}
class MineDutyManagementPage extends StatefulWidget {
const MineDutyManagementPage({super.key});
@override
State<MineDutyManagementPage> createState() => _MineDutyManagementPageState();
}
class _MineDutyManagementPageState extends State<MineDutyManagementPage> {
int showCount=-1;
int currentPage=1;
Future<void> _onRefresh() async {
//
await Future.delayed(const Duration(seconds: 2));
// fetchData()
setState(() {
// TODO:
});
}
@override
void initState() {
_getListData();
}
@override
Widget build(BuildContext context) {
//
final leaveRecords = [
LeaveRecord(
applicant: "王轩",
department: "测试部",
position: "测试员",
startDate: DateTime(2025, 7, 18),
endDate: DateTime(2025, 7, 18),
status: "无需审批",
statusColor: const Color(0xFF4CAF50),
),
LeaveRecord(
applicant: "王轩",
department: "测试部",
position: "测试员",
startDate: DateTime(2025, 7, 16),
endDate: DateTime(2025, 7, 16),
status: "无需审批",
statusColor: const Color(0xFF4CAF50),
),
LeaveRecord(
applicant: "李思",
department: "开发部",
position: "高级工程师",
startDate: DateTime(2025, 7, 20),
endDate: DateTime(2025, 7, 22),
status: "待审批",
statusColor: const Color(0xFFF57C00),
),
LeaveRecord(
applicant: "张伟",
department: "产品部",
position: "产品经理",
startDate: DateTime(2025, 7, 15),
endDate: DateTime(2025, 7, 17),
status: "已拒绝",
statusColor: const Color(0xFFF44336),
),
];
return Scaffold(
backgroundColor: const Color(0xFFF5F7FA),
appBar: MyAppbar(title: "离岗管理",actions: [
TextButton(
onPressed: () {
pushPage(MineDutyApplicationPage(), context);
},
child: Text("申请",style: TextStyle(color: Colors.white,fontSize: 16,fontWeight:FontWeight.bold),))
],),
body:
RefreshIndicator(
onRefresh: _onRefresh,
child:
// Column(
// children: [
//
// Container(
// padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
// color: const Color(0xFFE3F2FD),
// child: const Row(
// children: [
// Icon(Icons.info_outline, color: Color(0xFF1976D2)),
// SizedBox(width: 8),
// Text(
// "离岗记录显示最近30天内的申请记录",
// style: TextStyle(color: Color(0xFF1976D2), fontSize: 14),
// ),
// ],
// ),
// ),
//
Expanded(
child: ListView.builder(
padding: const EdgeInsets.symmetric(vertical: 16),
itemCount: leaveRecords.length,
itemBuilder: (context, index) {
final record = leaveRecords[index];
return _buildRecordCard(record,context);
},
),
// ),
// ],
),
),
);
}
Widget _buildRecordCard(LeaveRecord record, BuildContext context) {
final dateFormat = DateFormat('yyyy-MM-dd');
final isSameDay = record.startDate == record.endDate;
final dateRange = isSameDay
? dateFormat.format(record.startDate)
: "${dateFormat.format(record.startDate)}${dateFormat.format(record.endDate)}";
return
// GestureDetector(
// onTap: () {
// pushPage(MineDutyDetailPage(), context);
// },
// child:
Container(
margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(12),
boxShadow: [
BoxShadow(
color: Colors.grey.withOpacity(0.1),
spreadRadius: 1,
blurRadius: 6,
offset: const Offset(0, 2),
)
],
),
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
//
Row(
children: [
// Container(
// width: 40,
// height: 40,
// decoration: BoxDecoration(
// color: const Color(0xFFE3F2FD),
// shape: BoxShape.circle,
// ),
// child: const Icon(Icons.person, color: Color(0xFF1976D2)),
// ),
// const SizedBox(width: 12),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"申请人:${record.applicant}",
style: const TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
),
),
const SizedBox(height: 4),
Text(
"部门:${record.department} \n岗位:${record.position}",
style: TextStyle(
fontSize: 13,
color: Colors.grey[600],
),
),
],
),
const Spacer(),
Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6),
decoration: BoxDecoration(
color: record.statusColor.withOpacity(0.1),
borderRadius: BorderRadius.circular(20),
),
child: Text(
record.status,
style: TextStyle(
color: record.statusColor,
fontWeight: FontWeight.w500,
),
),
),
],
),
const SizedBox(height: 16),
//
Row(
children: [
const Icon(Icons.calendar_today, size: 18, color: Colors.grey),
const SizedBox(width: 8),
Text(
"离岗时间: $dateRange",
style: const TextStyle(color: Colors.grey),
),
],
),
const SizedBox(height: 8),
//
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
TextButton(
onPressed: () {
pushPage(MineDutyDetailPage(), context);
},
style: TextButton.styleFrom(
foregroundColor: const Color(0xFF1976D2),
),
child: const Text("查看详情"),
),
// const SizedBox(width: 16),
// if (record.status == "待审批")
// ElevatedButton(
// onPressed: () {},
// style: ElevatedButton.styleFrom(
// backgroundColor: const Color(0xFF1976D2),
// padding: const EdgeInsets.symmetric(horizontal: 20),
// ),
// child: const Text("审批", style: TextStyle(color: Colors.white)),
// )
],
),
],
),
),
// ),
);
}
Future<void> _getListData() async {
try {
final raw = await ApiService.getDutyManagement(showCount,currentPage);
// print(raw);
// setState(() {
// workInfos = [
// {
// "icon": "assets/icon-apps/jobico1.png",
// "index": 1,
// "detail": "待排查",
// "num": (hidCount['dpc'] ?? 0).toString(),
// },
// {
// "icon": "assets/icon-apps/jobico2.png",
// "index": 2,
// "detail": "待整改",
// "num": (hidCount['dzg'] ?? 0).toString(),
// },
// {
// "icon": "assets/icon-apps/jobico3.png",
// "index": 3,
// "detail": "已超期",
// "num": (hidCount['ycq'] ?? 0).toString(),
// },
// {
// "icon": "assets/icon-apps/jobico4.png",
// "index": 4,
// "detail": "待验收",
// "num": (hidCount['dys'] ?? 0).toString(),
// },
// {
// "icon": "assets/icon-apps/jobico5.png",
// "index": 5,
// "detail": "已验收",
// "num": (hidCount['yys'] ?? 0).toString(),
// },
// ];
//
// });
} catch (e) {
// Toast
print('加载首页数据失败:$e');
}
}
}

View File

@ -19,14 +19,22 @@ class FirstSignPage extends StatefulWidget {
class _SignatureUpdatePageState extends State<FirstSignPage> {
String imagePath="";
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: MyAppbar(title: "更新签字信息"),
body: Column(
body:
Container(
margin: EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
GestureDetector(
onTap: () {
@ -35,30 +43,36 @@ class _SignatureUpdatePageState extends State<FirstSignPage> {
child: Text("用户",style: TextStyle(color: Colors.black,fontSize: 16)),
),
// _buildConfirmButton(),
_buildConfirmButton(),
],
),
const SizedBox(height: 8),
Row(
children: [
Text('签字照片:',
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: Colors.grey,
),
),
if (imagePath.isNotEmpty)
Image.file(File(imagePath)),
],
),
Row(
children: [
if (imagePath.isNotEmpty)
Text('签字照片:',
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.bold,
color: Colors.grey,
),
),
const SizedBox(width: 15),
if (imagePath.isNotEmpty)
Image.file(File(imagePath),width: 230,height: 150,fit: BoxFit.cover,),
],
),
const SizedBox(height: 8),
//
// const Spacer(),
// _buildConfirmButton(),
_buildTrueButton(),
],
),
),
);
}
@ -73,32 +87,58 @@ class _SignatureUpdatePageState extends State<FirstSignPage> {
Widget _buildConfirmButton() {
return SizedBox(
width: double.infinity,
width: 80,
height: 30,
child: ElevatedButton(
onPressed: () {
onPressed: () async {
final path = await Navigator.push(
context,
MaterialPageRoute(builder: (context) => MineSignPage()),
);
//
setState(() {
imagePath = path ?? '';
});
},
style: ElevatedButton.styleFrom(
backgroundColor: const Color(0xFF4285F4),
padding: const EdgeInsets.symmetric(vertical: 16),
padding: const EdgeInsets.symmetric(vertical: 5),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
),
),
child: imagePath.isNotEmpty
? const SizedBox(
width: 24,
height: 24,
child: CircularProgressIndicator(
strokeWidth: 2,
color: Colors.white,
),
)
: const Text(
'确认',
style: TextStyle(fontSize: 18, color: Colors.white),
child: Text(
'手写签字',
style: TextStyle(fontSize: 12, color: Colors.white),
),
),
);
}
}
Widget _buildTrueButton() {
return Center(
child: ElevatedButton(
onPressed: () {
},
style: ElevatedButton.styleFrom(
backgroundColor: const Color(0xFF4285F4),
padding: const EdgeInsets.symmetric(vertical:5,horizontal: 80),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
),
),
child: Text(
'确认',
style: TextStyle(fontSize: 14, color: Colors.white),
),
),
);
}

View File

@ -5,6 +5,8 @@ import 'package:qhd_prevention/pages/mine/mine_about_page.dart';
import 'package:qhd_prevention/pages/mine/mine_set_page.dart';
import 'package:qhd_prevention/tools/tools.dart';
import 'mine_departure_List.dart';
class MinePage extends StatefulWidget {
const MinePage({super.key});
@ -50,7 +52,15 @@ class _MinePageState extends State<MinePage> {
),
),
),
SizedBox(height: 10,),
GestureDetector(
child: _setItemWidget("离岗"),
onTap: () {
pushPage(MineDepartureListPage(), context);
},
),
Divider(height: 1,color: Colors.black12,),
GestureDetector(
child: _setItemWidget("设置"),
onTap: () {

View File

@ -1,9 +1,15 @@
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:qhd_prevention/customWidget/custom_button.dart';
import 'package:qhd_prevention/pages/my_appbar.dart';
import 'package:flutter/material.dart';
import 'package:qhd_prevention/tools/h_colors.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../http/ApiService.dart';
import '../login_page.dart';
class MineSetPwdPage extends StatefulWidget {
const MineSetPwdPage({super.key});
@ -40,13 +46,23 @@ class _MineSetPwdPageState extends State<MineSetPwdPage> {
return;
}
final RegExp regex = RegExp(r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{6,18}$');
if (regex.hasMatch(newPwd)) {
_showMessage('密码长度为6-18位必须包含大小字母小写字母数字和特殊符号。');
return;
}
//
if (newPwd.length < 8 || newPwd.length > 20) {
_showMessage('密码长度需在8-20位之间');
if (newPwd.length < 8 || newPwd.length > 18) {
_showMessage('密码长度需在8-18位之间');
return;
}
_showMessage('密码修改成功'); //
_changePass(oldPwd,newPwd);
}
void _showMessage(String msg) {
@ -93,14 +109,18 @@ class _MineSetPwdPageState extends State<MineSetPwdPage> {
_buildPwdField('确认新密码', _confirmPwdController),
const SizedBox(height: 15),
const Text(
'需8-20位字母大小写、数字、字符混合',
'需8-18位字母大小写、数字、字符混合',
style: TextStyle(color: Colors.grey, fontSize: 13),
),
const SizedBox(height: 30,),
SizedBox(
width: double.infinity,
height: 48,
child: CustomButton(text: "提交", backgroundColor: Colors.blue),
child: CustomButton(
onPressed: () {
_handleSubmit();
},
text: "提交", backgroundColor: Colors.blue),
),
],
),
@ -108,4 +128,44 @@ class _MineSetPwdPageState extends State<MineSetPwdPage> {
),
);
}
Future<void> _changePass(String oldPwd, String newPwd) async {
try {
//
final raw = await ApiService.changePassWord(oldPwd, newPwd);
// final hidCount = raw['hidCount'] as Map<String, dynamic>;
// print(hidCount);
if (raw['result'] == 'success') {
_showMessage('密码修改成功'); //
Navigator.pop(context,true);
//
await _clearUserSession();
//
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(builder: (context) => LoginPage()),
(Route<dynamic> route) => false, //
);
}else{
_showMessage('密码修改失败');
}
} catch (e) {
// Toast
print('加载首页数据失败:$e');
_showMessage('密码修改失败');
}
}
Future<void> _clearUserSession() async {
final prefs = await SharedPreferences.getInstance();
await prefs.remove('isLoggedIn'); //
}
}

View File

@ -89,6 +89,7 @@ class _SignatureConfirmPageState extends State<SignatureConfirmPage> {
imagepath = file.path;
Future.delayed(const Duration(milliseconds: 500), () {
Navigator.pop(context,imagepath);
});
});

View File

@ -14,7 +14,7 @@ packages:
description:
name: asn1lib
sha256: "9a8f69025044eb466b9b60ef3bc3ac99b4dc6c158ae9c56d25eeccf5bc56d024"
url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.6.5"
async:
@ -78,7 +78,7 @@ packages:
description:
name: convert
sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68
url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.1.2"
cross_file:
@ -126,7 +126,7 @@ packages:
description:
name: dio
sha256: "253a18bbd4851fecba42f7343a1df3a9a4c1d31a2c1b37e221086b4fa8c8dbc9"
url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/"
url: "https://pub.flutter-io.cn"
source: hosted
version: "5.8.0+1"
dio_web_adapter:
@ -134,7 +134,7 @@ packages:
description:
name: dio_web_adapter
sha256: "7586e476d70caecaf1686d21eee7247ea43ef5c345eab9e0cc3583ff13378d78"
url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.1"
encrypt:
@ -142,7 +142,7 @@ packages:
description:
name: encrypt
sha256: "62d9aa4670cc2a8798bab89b39fc71b6dfbacf615de6cf5001fb39f7e4a996a2"
url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/"
url: "https://pub.flutter-io.cn"
source: hosted
version: "5.0.3"
extended_image:
@ -253,7 +253,7 @@ packages:
description:
name: fluttertoast
sha256: "25e51620424d92d3db3832464774a6143b5053f15e382d8ffbfd40b6e795dcf1"
url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/"
url: "https://pub.flutter-io.cn"
source: hosted
version: "8.2.12"
html:
@ -581,7 +581,7 @@ packages:
description:
name: pointycastle
sha256: "4be0097fcf3fd3e8449e53730c631200ebc7b88016acecab2b0da2f0149222fe"
url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.9.1"
provider:

View File

@ -58,6 +58,11 @@ dependencies:
encrypt: ^5.0.3
pointycastle: ^3.6.2
#网页页面加载
webview_flutter: ^4.4.0
path_provider: ^2.0.1
dev_dependencies:
flutter_test:
sdk: flutter