@
sunchuo > 看下来感觉 op 是想后端尽可能少写代码,前后端尽可能少的重复劳动。所以一开始朝着 lowcode 方向走了。
我做过几乎一样的事情。
是这样的,但 lowcode 根本不可满足业务需求,只能通过大量的代码定义去减少重复的工作内容。
例如
```ts
export const LeadResource = defineResource({
name: 'Lead',
idType: 'lead',
title: '线索',
icon: <ActiveToggleIcon icon={BsTelephone} iconActive={BsTelephoneFill} />,
metadata: {},
});
```
这样能通过扩展和维护这个 Resource 构建大多元素,例如
```ts
defineMetadata(LeadResource, ResourceListViewSelectorMetaKey, {
views: [
{
label: '开放线索',
value: 'open',
query: {
filters: [`state = "${LeadStatusType.state.Open}"`],
},
},
],
});
```
不少内容和你的实现都有类似的地方,比较有意思, 只不过我大方向选择的 GQL 。
但我会尽量避免生成,而是通过动态去创建,目前主要用到生成的是 ts 的 interface 生成 zod 、typebox ( jsonschema ,但是有类型)。
> 但我会尽量避免生成,而是通过动态去创建
主要是方便修改复用,生成时怕的是生成后改不动会形成包袱。动态构建例如
```ts
export function createListPayload<T extends object>(Type: Constructor<T>): Constructor<PageResponse<T>> {
let name = getObjectName(Type);
let key = `${name}ListPayload`;
return computeIfAbsent(getTypeCache(), key, () => {
@
ObjectType(key)
class ListPayload {
@
Field((type) => Int)
total!: number;
@
Field((type) => [Type])
data!: T[];
}
return ListPayload;
});
}
```
对查询方法也适用,可以按需增加查询方法,例如
https://github.com/wenerme/wode/blob/f846c2158ff83ad7fcde781abd29ef7505f11258/packages/nestjs/src/type-graphql/resource/withBaseQuery.ts#L11