168 lines
5.5 KiB
Dart
168 lines
5.5 KiB
Dart
import 'package:flutter/material.dart';
|
||
import '../../../../app/theme/app_colors.dart';
|
||
import '../../../../app/theme/app_typography.dart';
|
||
import '../../../../app/theme/app_spacing.dart';
|
||
|
||
/// KYC认证页面
|
||
///
|
||
/// 分级认证:L0(无认证) → L1(手机+邮箱) → L2(身份证) → L3(高级验证)
|
||
/// 每级解锁不同额度和功能
|
||
class KycPage extends StatelessWidget {
|
||
const KycPage({super.key});
|
||
|
||
@override
|
||
Widget build(BuildContext context) {
|
||
return Scaffold(
|
||
appBar: AppBar(title: const Text('身份认证')),
|
||
body: SingleChildScrollView(
|
||
padding: const EdgeInsets.all(20),
|
||
child: Column(
|
||
children: [
|
||
// Current Level
|
||
_buildCurrentLevel(),
|
||
const SizedBox(height: 24),
|
||
|
||
// KYC Levels
|
||
_buildLevel(
|
||
'L1 基础认证',
|
||
'手机号 + 邮箱验证',
|
||
['每日购买限额 \$500', '可购买券、出示核销'],
|
||
true,
|
||
AppColors.success,
|
||
),
|
||
_buildLevel(
|
||
'L2 身份认证',
|
||
'身份证/护照验证',
|
||
['每日购买限额 \$5,000', '解锁二级市场交易、P2P转赠'],
|
||
false,
|
||
AppColors.info,
|
||
),
|
||
_buildLevel(
|
||
'L3 高级认证',
|
||
'视频面审 + 地址证明',
|
||
['无限额', '解锁大额交易、提现无限制'],
|
||
false,
|
||
AppColors.primary,
|
||
),
|
||
],
|
||
),
|
||
),
|
||
);
|
||
}
|
||
|
||
Widget _buildCurrentLevel() {
|
||
return Container(
|
||
padding: const EdgeInsets.all(20),
|
||
decoration: BoxDecoration(
|
||
gradient: AppColors.primaryGradient,
|
||
borderRadius: AppSpacing.borderRadiusLg,
|
||
),
|
||
child: Row(
|
||
children: [
|
||
Container(
|
||
width: 56,
|
||
height: 56,
|
||
decoration: BoxDecoration(
|
||
color: Colors.white.withValues(alpha: 0.2),
|
||
borderRadius: BorderRadius.circular(14),
|
||
),
|
||
child: const Icon(Icons.verified_user_rounded, color: Colors.white, size: 28),
|
||
),
|
||
const SizedBox(width: 16),
|
||
Expanded(
|
||
child: Column(
|
||
crossAxisAlignment: CrossAxisAlignment.start,
|
||
children: [
|
||
Text('当前认证等级', style: AppTypography.bodySmall.copyWith(color: Colors.white70)),
|
||
const SizedBox(height: 4),
|
||
Text('L1 基础认证', style: AppTypography.h1.copyWith(color: Colors.white)),
|
||
const SizedBox(height: 4),
|
||
Text('每日购买限额 \$500', style: AppTypography.bodySmall.copyWith(color: Colors.white60)),
|
||
],
|
||
),
|
||
),
|
||
],
|
||
),
|
||
);
|
||
}
|
||
|
||
Widget _buildLevel(
|
||
String title,
|
||
String requirement,
|
||
List<String> benefits,
|
||
bool completed,
|
||
Color color,
|
||
) {
|
||
return Container(
|
||
margin: const EdgeInsets.only(bottom: 12),
|
||
padding: const EdgeInsets.all(16),
|
||
decoration: BoxDecoration(
|
||
color: AppColors.surface,
|
||
borderRadius: AppSpacing.borderRadiusMd,
|
||
border: Border.all(color: completed ? color.withValues(alpha: 0.3) : AppColors.borderLight),
|
||
),
|
||
child: Column(
|
||
crossAxisAlignment: CrossAxisAlignment.start,
|
||
children: [
|
||
Row(
|
||
children: [
|
||
Container(
|
||
width: 32,
|
||
height: 32,
|
||
decoration: BoxDecoration(
|
||
color: color.withValues(alpha: 0.1),
|
||
borderRadius: BorderRadius.circular(8),
|
||
),
|
||
child: Icon(
|
||
completed ? Icons.check_circle_rounded : Icons.lock_outlined,
|
||
color: color,
|
||
size: 18,
|
||
),
|
||
),
|
||
const SizedBox(width: 12),
|
||
Expanded(
|
||
child: Column(
|
||
crossAxisAlignment: CrossAxisAlignment.start,
|
||
children: [
|
||
Text(title, style: AppTypography.labelLarge),
|
||
Text(requirement, style: AppTypography.caption),
|
||
],
|
||
),
|
||
),
|
||
if (completed)
|
||
Container(
|
||
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4),
|
||
decoration: BoxDecoration(
|
||
color: AppColors.successLight,
|
||
borderRadius: AppSpacing.borderRadiusFull,
|
||
),
|
||
child: Text('已完成', style: AppTypography.caption.copyWith(color: AppColors.success)),
|
||
)
|
||
else
|
||
ElevatedButton(
|
||
onPressed: () {},
|
||
style: ElevatedButton.styleFrom(
|
||
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
|
||
minimumSize: Size.zero,
|
||
),
|
||
child: const Text('去认证', style: TextStyle(fontSize: 13)),
|
||
),
|
||
],
|
||
),
|
||
const SizedBox(height: 12),
|
||
...benefits.map((b) => Padding(
|
||
padding: const EdgeInsets.only(bottom: 4),
|
||
child: Row(
|
||
children: [
|
||
Icon(Icons.check_rounded, size: 14, color: completed ? color : AppColors.textTertiary),
|
||
const SizedBox(width: 6),
|
||
Text(b, style: AppTypography.bodySmall),
|
||
],
|
||
),
|
||
)),
|
||
],
|
||
),
|
||
);
|
||
}
|
||
}
|