# 信用卡生成器 (Card Generator)

虚拟信用卡号生成工具，支持多种卡类型和输出格式。

## 功能特性

- ✅ 支持多种国际卡类型（银联、Visa、MasterCard、AMEX、Discover）
- ✅ 可选 Luhn 算法校验
- ✅ 灵活的有效期生成（2026-2030）
- ✅ 多种输出格式（Pipe、JSON、CSV、Pretty）
- ✅ 批量生成支持

## 技术实现

### 卡号生成算法

#### 纯随机生成
```
卡号 = 固定前缀 + 随机数字
```

#### Luhn算法生成
```
1. 固定前缀 + 随机数字（n-1位）
2. 计算校验位
3. 附加校验位得到完整卡号
```

### 有效期生成

```javascript
月份: random(1-12) → 格式化为两位数 "01"-"12"
年份: random(26-30) → 格式化为两位数 "26"-"30"
```

### CVV生成

```javascript
CVV = random(0, 10^cvvLength - 1) → 格式化为指定位数
```

## 配置说明

### 卡类型配置结构

```javascript
{
  name: '卡类型名称',
  prefix: '卡号前缀',
  length: 卡号总长度,
  cvvLength: CVV长度,
  useLuhn: 是否使用Luhn算法
}
```

### 添加新卡类型

编辑 `src/tools/card-generator/config.js`：

```javascript
CARD_TYPES.newcard = {
  name: '新卡类型',
  prefix: '123456',
  length: 16,
  cvvLength: 3,
  useLuhn: true
};
```

## API 参考

### CardGenerator 类

```javascript
const CardGenerator = require('./generator');
const generator = new CardGenerator();
```

#### 方法

**generate(type)**
- 参数：`type` (string) - 卡类型，默认 'unionpay'
- 返回：Object - 包含 number, month, year, cvv, type

**generateBatch(count, type)**
- 参数：
  - `count` (number) - 生成数量
  - `type` (string) - 卡类型，默认 'unionpay'
- 返回：Array - 卡信息数组

**getSupportedTypes()**
- 返回：Array - 所有支持的卡类型

### Formatter 类

```javascript
const Formatter = require('./formatter');
const formatter = new Formatter();
```

#### 方法

**format(card, format)**
- 参数：
  - `card` (Object) - 卡信息对象
  - `format` (string) - 格式类型，默认 'pipe'
- 返回：string - 格式化后的字符串

**formatBatch(cards, format)**
- 参数：
  - `cards` (Array) - 卡信息数组
  - `format` (string) - 格式类型
- 返回：string - 格式化后的字符串（多行）

## 使用示例

### 基础用法

```bash
# 生成单张银联卡
node src/index.js card

# 生成Visa卡
node src/index.js card -t visa

# 批量生成
node src/index.js card -n 10
```

### 不同格式输出

```bash
# Pipe格式（默认）
node src/index.js card
# 输出: 6228367541234567|08|28|456

# JSON格式
node src/index.js card -f json

# CSV格式
node src/index.js card -f csv

# 美化格式
node src/index.js card -f pretty
```

### 编程使用

```javascript
const CardGenerator = require('./src/tools/card-generator/generator');
const Formatter = require('./src/tools/card-generator/formatter');

const generator = new CardGenerator();
const formatter = new Formatter();

// 生成单张卡
const card = generator.generate('visa');
console.log(formatter.format(card, 'pipe'));

// 批量生成
const cards = generator.generateBatch(5, 'unionpay');
cards.forEach(card => {
  console.log(formatter.format(card, 'pipe'));
});
```

## 测试验证

### 手动测试

```bash
# 测试不同卡类型
node src/index.js card -t unionpay
node src/index.js card -t visa
node src/index.js card -t mastercard
node src/index.js card -t amex
node src/index.js card -t discover

# 测试批量生成
node src/index.js card -n 20

# 测试不同格式
node src/index.js card -f json
node src/index.js card -f csv
node src/index.js card -f pretty
```

### Luhn算法验证

```bash
# 生成Visa卡（使用Luhn算法）
node src/index.js card -t visa -f json

# 使用在线工具验证卡号
# https://www.freeformatter.com/credit-card-number-generator-validator.html
```

## 常见问题

### Q: 为什么银联卡不使用Luhn算法？
A: 可以在配置中启用。默认不启用是为了保持与原始样本数据的一致性。

### Q: 如何修改有效期范围？
A: 编辑 `src/tools/card-generator/config.js` 中的 `EXPIRY_CONFIG`。

### Q: 生成的卡号能用于真实交易吗？
A: **绝对不能！** 这些是测试用的虚拟卡号，没有任何实际价值。

### Q: 如何添加自定义输出格式？
A: 在 `config.js` 的 `OUTPUT_FORMATS` 中添加新格式：

```javascript
OUTPUT_FORMATS.custom = {
  name: '自定义格式',
  formatter: (card) => `${card.number} - ${card.month}/${card.year} - ${card.cvv}`
};
```

## 扩展建议

- [ ] 支持自定义前缀和长度
- [ ] 添加卡号验证功能
- [ ] 支持配置文件导入卡类型
- [ ] 生成完整的持卡人信息（姓名、地址等）
- [ ] 支持特定BIN（银行识别码）生成

## 相关资源

- [Luhn算法详解](https://en.wikipedia.org/wiki/Luhn_algorithm)
- [信用卡号结构](https://en.wikipedia.org/wiki/Payment_card_number)
- [BIN数据库](https://binlist.net/)
