构建 VIN 解码模式的社区贡献系统
发布: (2026年3月13日 GMT+8 08:25)
3 分钟阅读
原文: Dev.to
Source: Dev.to
Overview

VIN 解码听起来很简单,直到你意识到每个制造商的实现方式都不同,而权威数据库(NHTSA VPIC)只覆盖美国市场的车辆。
我们维护 Corgi,一个开源离线 VIN 解码器。为了解决国际车辆的问题,我们构建了一个社区贡献系统。下面介绍它的工作原理。
The Problem
VIN(车辆识别码)由 17 位字符组成:
- 第 1‑3 位: WMI(世界制造商标识码)
- 第 4‑8 位: 车辆属性(车型、发动机等)
- 第 9 位: 校验位
- 第 10 位: 车型年份
- 第 11 位: 工厂代码
- 第 12‑17 位: 序列号
NHTSA 的 VPIC 数据库将 WMI 映射到制造商,并定义了第 4‑8 位的解释方式,但它仅覆盖在美国销售的车辆。
示例:
- 特斯拉上海工厂使用 WMI
LRW。 - 特斯拉柏林工厂使用 WMI
XP7。
这两个 WMI 在 VPIC 中都不存在。
Our Solution: YAML Patterns
贡献者添加一个 YAML 文件来描述新的 WMI:
wmi: LRW
manufacturer: Tesla
make: Tesla
country: China
vehicle_type: Passenger Car
years:
from: 2020
to: null
sources:
- type: service_manual
description: Tesla Model 3/Y VIN decoder
url: https://example.com/source
patterns:
- pattern: "3E****"
element: Model
value: Model 3
- pattern: "YG****"
element: Model
value: Model Y
- pattern: "*D****"
element: Drive Type
value: AWD
- pattern: "*C****"
element: Drive Type
value: RWD
test_vins:
- vin: LRW3E7FA6NC433523
expected:
make: Tesla
model: Model 3
drive_type: RWDValidation Pipeline
当 PR 被打开时,CI 会运行多项检查。
Schema Validation (Zod)
const wmiFileSchema = z.object({
wmi: z.string().length(3).regex(/^[A-HJ-NPR-Z0-9]{3}$/),
manufacturer: z.string().min(1),
make: z.string().min(1),
country: z.string().min(1),
vehicle_type: z.enum(VALID_VEHICLE_TYPES),
years: yearsSchema,
patterns: z.array(patternSchema).min(1),
test_vins: z.array(testVinSchema).min(1),
});Check Digit Verification
每个测试 VIN 必须拥有有效的校验位(第 9 位):
function validateCheckDigit(vin: string): boolean {
const weights = [8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2];
const transliteration = { A:1, B:2, /* … */ };
let sum = 0;
for (let i = 0 - npm: