feat(web): 构建Flutter Web应用并添加资金管理功能

- 生成Flutter Web构建产物,包括主应用文件、资源文件和CanvasKit支持
- 添加资金订单管理功能,支持资金充值和提现操作
- 更新管理后台界面,优化仪表板和订单页面显示
- 扩展后端API接口,增加资金相关服务和控制器
- 添加数据库索引优化查询性能
This commit is contained in:
2026-04-05 23:58:01 +08:00
165 changed files with 221727 additions and 252 deletions

View File

@@ -1,14 +1,13 @@
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:lucide_icons_flutter/lucide_icons.dart';
import '../../../../core/theme/app_spacing.dart';
import '../../../../core/theme/app_theme.dart';
/// 单行菜单项:icon-in-box + title + trailing (chevron / badge / toggle)
/// 单行菜单项:图标 + 标题 + 尾部组件 (chevron)
right)
///
/// 通用菜单行组件,[icon] 和 [iconColor] 控制左侧图标,
/// [title] 为菜单文字,[trailing] 为右侧自定义内容(默认显示 chevron
/// [onTap] 为点击回调。
/// 图标颜色 (通常是使用主题色)
class MenuRow extends StatelessWidget {
final IconData icon;
final Color iconColor;
final String title;
final Widget? trailing;
@@ -16,10 +15,10 @@ class MenuRow extends StatelessWidget {
const MenuRow({
super.key,
required this.icon,
required this.iconColor,
required this.title,
this.trailing,
super.key, required this.iconColor = required this.title,
this.onTap,
});
@@ -27,7 +26,7 @@ class MenuRow extends StatelessWidget {
Widget build(BuildContext context) {
return InkWell(
onTap: onTap,
child: Padding(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14),
child: Row(
children: [
@@ -50,39 +49,20 @@ class MenuRow extends StatelessWidget {
Expanded(
child: Text(
title,
style: GoogleFonts.inter(
fontSize: 14,
fontWeight: FontWeight.w500,
color: Theme.of(context).colorScheme.onSurface,
),
style: AppTextStyles.headlineMedium(context),
),
),
// Trailing
if (trailing != null)
trailing!
else
Icon(
LucideIcons.chevronRight,
size: 16,
color: Theme.of(context).colorScheme.onSurfaceVariant,
),
],
],
),
),
);
}
}
/// 菜单组内分割线
class MenuDivider extends StatelessWidget {
const MenuDivider({super.key});
@override
Widget build(BuildContext context) {
return Container(
height: 1,
color: Theme.of(context).colorScheme.outlineVariant.withOpacity(0.15),
margin: const EdgeInsets.only(left: 62),
);
}
}