Skip to content

工具函数

VonaJS 提供了一组工具函数,可以更加便利的使用序列化能力

工具清单

工具: @Serializer工具: v说明
@Serializer.excludev.serializerExclude排除字段
@Serializer.transformv.serializerTransform使用SerializerTransform
@Serializer.sensitivev.serializerSensitive对字段值进行脱敏处理
@Serializer.getterv.serializerGetter采用getter机制生成新的字段值
@Serializer.customv.serializerCustom使用自定义函数对字段值进行处理

TIP

既然@Serializer工具非常简洁,直观,为什么还要提供v工具?

  1. v工具可以实现通过 App Config 修改配置
  2. v工具和@Serializer工具底层逻辑是一致的

@Serializer.exclude/v.serializerExclude

比如,排除EntityStudent中的name字段

1. @Serializer.exclude

diff
class EntityStudent {
+ @Serializer.exclude()
  @Api.field(v.title($locale('Name')))
  name: string;
}

2. v.serializerExclude

diff
class EntityStudent {
+ @Api.field(v.serializerExclude(), v.title($locale('Name')))
  name: string;
}

3. App Config

可以在 App Config 中修改配置

src/backend/config/config/config.ts

  • 方法 1: 直接修改 Openapi 参数
typescript
// onions
config.onions = {
  entity: {
    'demo-student:student': {
      fields: {
        name: { exclude: false },
      },
    },
  },
};
  • 方法 2: 构造一个新的 schema
typescript
import { $makeSchema, v } from 'vona-module-a-openapi';

// onions
config.onions = {
  entity: {
    'demo-student:student': {
      fields: {
        name: $makeSchema(v.serializerExclude(), z.string()),
      },
    },
  },
};

@Serializer.transform/v.serializerTransform

比如,将EntityStudent中的name字段值转化为大写

我们直接使用序列化中创建的 SerializerTransform upper

1. @Serializer.transform

diff
class EntityStudent {
+ @Serializer.transform('demo-student:upper')
  @Api.field(v.title($locale('Name')))
  name: string;
}

2. v.serializerTransform

diff
class EntityStudent {
+ @Api.field(v.serializerTransform('demo-student:upper'), v.title($locale('Name')))
  name: string;
}

3. App Config

可以在 App Config 中修改配置

src/backend/config/config/config.ts

  • 方法 1: 直接修改 Openapi 参数
typescript
// onions
config.onions = {
  entity: {
    'demo-student:student': {
      fields: {
        name: {
          serializerTransforms: {
            'demo-student:upper': {},
          },
        },
      },
    },
  },
};
  • 方法 2: 构造一个新的 schema
typescript
import { $makeSchema, v } from 'vona-module-a-openapi';

// onions
config.onions = {
  entity: {
    'demo-student:student': {
      fields: {
        name: $makeSchema(v.serializerTransform('demo-student:upper'), z.string()),
      },
    },
  },
};

@Serializer.sensitive/v.serializerSensitive

比如,将EntityStudent中的name字段值进行脱敏处理

比如,name 原始值为tom,脱敏之后为t***m

1. @Serializer.sensitive

diff
class EntityStudent {
+ @Serializer.sensitive({ patternFrom: /(\w)(\w+)(\w)/, patternTo: '$1***$3' })
  @Api.field(v.title($locale('Name')))
  name: string;
}

2. v.serializerSensitive

diff
class EntityStudent {
  @Api.field(
+   v.serializerSensitive({ patternFrom: /(\w)(\w+)(\w)/, patternTo: '$1***$3' }),
    v.title($locale('Name')),
  )
  name: string;
}

3. App Config

可以在 App Config 中修改配置

src/backend/config/config/config.ts

  • 方法 1: 直接修改 Openapi 参数
typescript
// onions
config.onions = {
  entity: {
    'demo-student:student': {
      fields: {
        name: {
          serializerTransforms: {
            'a-serialization:sensitive': {
              patternFrom: /(\w)(\w+)(\w)/,
              patternTo: '$1***$3',
            },
          },
        },
      },
    },
  },
};
  • a-serialization:sensitive: a-serialization模块提供的 SerializerTransform
  • 方法 2: 构造一个新的 schema
typescript
import { $makeSchema, v } from 'vona-module-a-openapi';

// onions
config.onions = {
  entity: {
    'demo-student:student': {
      fields: {
        name: $makeSchema(
          v.serializerSensitive({ patternFrom: /(\w)(\w+)(\w)/, patternTo: '$1***$3' }),
          z.string(),
        ),
      },
    },
  },
};

基于 MIT 许可发布