更新 llms-full.txt

This commit is contained in:
oyo
2025-06-19 16:52:57 +08:00
parent 57f92ebfe9
commit 210ad0faed

View File

@@ -125,7 +125,62 @@ DateTime endTime //会议结束时间
}
```
这种“正向替换”和“反向注入”可以按需递归调用去将多个互相之间有外键关系的对象组装成最终对象。例如还有另外一张表MeetingAgenda到Meeting有n:1的外键和另外一张表AgendaAttendance到MeetingAgenda有n:1外键。那么如果我要去组装以Meeting开始包含MeetingRoom, MeetingAgenda, AgendaAttendance的组装对象首先发现MeetingRoom是可以正向扩展到Meeting的反向注入MeetingAgenda而AgendaAttendance需要先反向注入到MeetingAgenda中。
- **TOCO中json结构描述:** 在TOCO中DTO使用一个json结构表示有时用户会在上下文中提供关于DTO的json描述所以你需要了解结构中一些关键字段便于你能够理解用户提供的DTOexpandList为正向替换reverseExpandList为反向注入customFieldList为自定义字段。expandListList中field为正向替换对应的本表外键字段的名字fieldName为正向替换之后给该字段的起的新名字reverseExpandList中field为反向注入对应的他表外键字段的名字fieldName为反向注入之后给该字段的起的新名字customFieldList中uuid为参数对应类结构的UUID当type为Enum、Eo时包含该字段innerType为List内部类型当type为List时包含该字段innerUuid为List内部类结构的UUID当type为List且innerType=Enum、Eo时包含该字段。
- **TOCO中json结构描述:** 在TOCO中DTO使用一个json结构表示该结构可用于理解DTO的含义或作为创建、更新DTO工具的参数。部分字段的含义为dto的uuid为唯一标识如果需要创建DTO则设置为null如果需要复用则填入其uuid。expandList为正向替换reverseExpandList为反向注入customFieldList为自定义字段。expandListList中field为正向替换对应的本表外键字段的名字fieldName为正向替换之后给该字段的起的新名字reverseExpandList中field为反向注入对应的他表外键字段的名字fieldName为反向注入之后给该字段的起的新名字customFieldList中uuid为参数对应类结构的UUID当type为Enum、Eo时包含该字段innerType为List内部类型当type为List时包含该字段innerUuid为List内部类结构的UUID当type为List且innerType=Enum、Eo时包含该字段。示例如下:
- meeting_with_room_dto
```json
{
"dto": {
"uuid": null,
"name": "meeting_with_room_dto",
"description": "会议详情,包含会议室信息,以及其中的会议列表",
"fromEntity": "meeting",
"expandList": [
{
"field": "room_id",
"fieldName": "meeting_room",
"dto": {
"uuid": null,
"name": "meeting_room_with_meetings_dto",
"fromEntity": "meeting_room",
"description": "会议室信息,包含会议列表",
}
}
],
"customFieldList":[
{
"name": "started",
"type": "Boolean",
"description": "是否开始"
}
]
}
}
```
- meeting_room_with_meetings_dto
```json
{
"dto": {
"uuid": null,
"name": "meeting_room_with_meetings_dto",
"description": "会议室详情,包含会议室信息,以及其中的会议信息",
"fromEntity": "meeting",
"reverseExpandList": [
{
"field": "room_id",
"dto": {
"uuid": "ffeec02d-2a32-1531-1ce1-b9bfc1993765",
"name": "meeting_base_dto",
"description": "会议基本信息",
"fromEntity": "meeting"
},
"fieldName": "meeting_list"
}
],
}
}
```
示例中meeting_with_room_dto和meeting_room_with_meetings_dto没有uuid为待创建的DTO。meeting_base_dto为已存在的DTO带有uuid。
- **预定义方法:** 对于每一个DTOTOCO会自动其根Entity的唯一索引生成一些预定义的RPC方法及实现预定义方法不仅获取了根Entity的数据还通过RPC调用的方式**自动**获取了**所有扩展字段**的数据并对数据进行了拼装处理。如实体user有unique index(username)则会针对UserDto生成UserDto UserDtoService.getByUserName(String userName)和List<UserDto> UserDtoService.getByUserNames(List<String> userNames)。预定义方法内部根据外键关系自动生成了复杂DTO数据的递归、Join拼装的能力会直接返回DTO内部的所有继承字段和扩展字段的数据。注意自定义字段的数据获取不会自动生成需要在对应的convert方法中编写代码。
- **公开性:** DTO可以设置公开性如果DTO为公开则其生成的预定义RPC方法也为公开RPC可以被其他模块订阅并调用如果DTO为非公开则其生成的预定义RPC方法也为非公开RPC其他模块不可见
- **跨模块依赖:** 如果DTO内引用了其他模块的DTO则TOCO会自动订阅其他模块的RPC(getByIds,getBy${foreignKey}等)方法用来获取对应的DTO
@@ -140,10 +195,10 @@ DateTime endTime //会议结束时间
注意判断使用哪种方式时,只能根据查询条件判断是否使用读方案,绝对禁止使用返回值是否需要数据拼装来判断!**如果现实中的代码和TOCO中的步骤有冲突时只能使用TOCO的定义**
#### **2.7 视图对象 (VO)**
- **定义与用途:** 在TOCO中VO表达某个BaseDTO(如果用户指明派生源也可使用其他DTO)为派生源通过外键关系不断关联多个BaseDTO的数据结构。VO用于在视图层与前端之间进行数据传输往往被当做HTTP API的返回值、或读方案的返回值使用由服务端返回至前端。注意VO不能作为RPC的返回值。
- **关键配置:** 名称(以Vo结尾)、根Entity、派生源、字段列表。VO中的字段分为三种a.继承DTO的字段和DTO的字段类型一样b.扩展字段含正向替换和反向注入字段类型为VO或List<VO>;c.自定义字段类型为基本类型或VO类型。VO中的字段来源于DTO可以根据页面需要进行裁剪可以根据外键关系扩展其他BaseDto(详见**字段扩展方式**)。如果在派生源中没有合适字段且明确无法通过外键扩展外部BaseDto的情况下可增加对应的自定义字段
- **关键配置:** 名称(以Vo结尾)、根Entity、派生源、字段列表。VO中的字段分为三种a.继承DTO的字段和DTO的字段类型一样b.扩展字段含正向替换和反向注入字段类型为VO或List<VO>;c.自定义字段类型为基本类型或VO类型。VO中的字段来源于DTO可以根据页面需要将无用字段进行裁剪可以根据外键关系扩展其他BaseDto(详见**字段扩展方式**)。如果在派生源中没有合适字段且明确无法通过外键扩展外部BaseDto的情况下可增加对应的自定义字段
- **与DTO的区别 (在TOCO语境下): **DTO用于服务层传输通常作为RPC的返回值与数据模型更近复用性较强VO用于视图层传输通常作为API的返回值与UI展示更为接近复用性较弱。
- **如何创建/生成:** VO通常由某个BaseDTO以及外键关系为基础派生也可以直接创建和DTO无关、内部全为自定义字段的VO尽量少用只为应对某些特殊页面需要组装一组完全无关的返回数据的场景
- **根VO和子VO:**TOCO中的VO分为两种1.根VO指最外层的VO结构需要经由TOCO创建2.子VO某个根VO的内部嵌套VO通过外键关系关联BaseDTO之后由TOCO自动创建。所以在TOCO中我们需要描述VO要描述的字段、扩展关系,并通过**创建根VO**的行为使TOCO**自动创建**其子VO即可完成一个复杂嵌套VO的创建过程无需单独创建子VO。
- **根VO和子VO:**TOCO中的VO分为两种1.根VO指最外层的VO结构需要经由TOCO创建有uuid作为唯一标识根VO可被其他根VO或子VO引用2.子VO某个根VO的内部嵌套VO通过外键关系关联BaseDTO之后由TOCO自动创建只附属于某个根VO只能被这一个根VO引用且没有uuid。所以在TOCO中我们需要描述VO要的字段、扩展关系并通过**创建根VO**的行为使TOCO**自动创建**其子VO或引用其他根VO即可完成一个复杂嵌套VO的创建过程无需单独创建子VO。
- **字段扩展方式:**同DTO的字段扩展方式可以通过任意**一个**派生源BaseDTO即可经过外键扩展成为复杂嵌套VO。只要存在外键关系且满足以下条件即可扩展对于正向替换当前实体存在指向其他实体的外键字段对于反向注入其他实体存在指向当前实体的外键字段。
例如有两个BaseDTO
```
@@ -188,7 +243,99 @@ DateTime endTime //会议结束时间
}
}
```
- **TOCO中json结构描述:** 在TOCO中VO使用一个json结构表示有时用户会在上下文中提供关于DTO的json描述所以你需要了解结构中一些关键字段便于你能够理解用户提供的VOexpandList为正向替换reverseExpandList为反向注入customFieldList为自定义字段。expandListList中field为正向替换对应的本表外键字段的名字fieldName为正向替换之后给该字段的起的新名字reverseExpandList中field为反向注入对应的他表外键字段的名字fieldName为反向注入之后给该字段的起的新名字customFieldList中uuid为参数对应类结构的UUID当type为Enum、Eo时会包含该字段innerType为List内部类型当type为List时会包含该字段innerUuid为List内部类结构的UUID当type为List且innerType=Enum、Eo时会包含该字段。
- **TOCO中json结构描述:** 在TOCO中VO使用一个json结构表示该结构可用于理解VO的含义或作为创建、更新VO工具的参数。部分字段的含义为expandList为正向替换reverseExpandList为反向注入customFieldList为自定义字段。expandListList中field为正向替换对应的本表外键字段的名字fieldName为正向替换之后给该字段的起的新名字reverseExpandList中field为反向注入对应的他表外键字段的名字fieldName为反向注入之后给该字段的起的新名字customFieldList中uuid为参数对应类结构的UUID当type为Enum、Eo时会包含该字段innerType为List内部类型当type为List时会包含该字段innerUuid为List内部类结构的UUID当type为List且innerType=Enum、Eo时会包含该字段。示例如下:
- meeting_with_room_vo
```json
{
"vo": {
"uuid": null,
"name": "metting_with_room_vo",
"description": "会议详情,包含会议室信息,以及会议室禁用列表",
"isRootVo": true,
"fromEntity": "meeting",
"fromDto": "meeting_detail_dto",
"fromDtoUuid": "cd55c96b-aa67-bfb2-7614-70b503a8f8bf",
"extendFieldList":[
{
"name": "id"
},
{
"name": "title"
}
],
"expandList": [
{
"field": "room_id",
"fieldName": "meeting_room",
"vo": {
"name": "meeting_room_with_meetings_vo",
"description": "会议室信息,包含会议列表",
"isRootVo": false,
"fromEntity": "meeting_room",
"fromDto": "meeting_room_base_dto",
"fromDtoUuid": "88437212-6370-99a6-1e7a-fe1469082d08",
"reverseExpandList": [
{
"field": "room_id",
"vo": {
"name": "meeting_base_vo",
"description": "会议基本信息",
"isRootVo": false,
"fromEntity": "meeting",
"fromDto": "meeting_base_dto",
"fromDtoUuid": "1a768c5e-b449-db5d-fe55-9d572d64332a",
"extendFieldList":[
{
"name": "startTime"
},
{
"name": "endTime"
}
]
},
"fieldName": "meeting_list"
}
],
"customFieldList":[
{
"name": "occupied",
"type": "Boolean",
"description": "是否被占用"
},
{
"name": "custom_eo",
"type": "Eo"
"uuid": "uuid of an eo"
},
{
"name": "status_list",
"type": "List",
"innerType": "Enum",
"innerUuid": "uuid of an enum"
},
{
"name": "custom_string_list",
"type": "List",
"innerType": "String"
}
],
"extendFieldList":[
{
"name": "id"
},
{
"name": "name"
}
]
}
}
]
}
}
```
示例中meeting_with_room_vo为根VO但没有uuid为待创建的根VO。meeting_room_with_meetings_vo和meeting_base_vo为meeting_with_room_vo的子VO无法被其他根VO引用且没有uuid。
- **派生源默认使用BaseDTO:** 除非用户指定了VO的派生源DTO否则创建VO时只可以用**BaseDTO**为派生源。
- **与DTO的转换关系:** 在创建一个**有派生源的**VO后TOCO会在生成代码时自动生成2种convert方法1.基础convert方法从DTO转换为VO仅转换结构以及基本类型字段的get/set方法命名为convertTo${VoName}、convertTo${VoName}List、convertTo${VoName}Map其中**Map转换方法**为底层批量方法通常也是自定义字段逻辑编写的位置复用性好会被其他convert方法调用单个和列表convert方法都通过**调用Map方法**来实现;2.带数据拼装逻辑的convert方法内部会**自动**调用基础convert方法从DTO转换为VO并设置基本类型字段数据然后再根据外键**自动**获取**扩展字段**的数据以拼装最终数据方法命名为convertAndAssembleData、convertAndAssembleDataList也就是说这两个方法已经**自动**获取了所有**继承字段**和**扩展字段**的数据)。这2种方法对应的代码会生成在VO对应的Converter类中
- **字段数据获取:** 对于继承自DTO的字段、以及扩展字段TOCO会在convert方法中自动生成数据的获取代码无需手动实现这两种字段的获取和拼装逻辑。对于自定义字段则**必须**在最底层的convertTo${VoName}Map方法中实现对应的获取和拼装逻辑以便于其他convert方法都能够**复用**这段逻辑。**禁止**在其他convert方法中实现自定义字段逻辑因为这样会导致某些场景下数据拼装不完整。