如何解决如何在 Protocol Buffers 中构建数据模型
例如,我需要一个这样的模型:
[
{
"type": "input","identity": "protocol_buffers_input","value": "Input Value","rules": {
"required": true,"max_length": 100
},"properties": {
"label": "Input Controller","readonly": false,"default_value": "Input Default Value","width": "100%","placeholder": "Input Placeholder"
},"business": {
"client_visible": true,"disabled": false
},"disabled": true
},{
"type": "select","identity": "protocol_buffers_select","value": ["key1","key2"],"rules": {
"required": true
},"properties": {
"label": "Select Controller","default_value": ["key1","clear_able": true,"filterable": false,"options": [
{ "label": "label1","value": "key1" },{ "label": "label2","value": "key2" },{ "label": "label3","value": "key3" }
],"multiple": true,"placeholder": "Select Placeholder"
},{
"type": "switch","identity": "protocol_buffers_switch","value": true,"properties": {
"label": "Switch Controller","default_value": true
},{
"type": "image","identity": "protocol_buffers_image","value": "","properties": {
"label": "Image Controller","tip": "Image Controller Tips"
},{
"type": "number","identity": "protocol_buffers_number","value": 1,"rules": {
"min_value": 0,"max_value": 100,"required": true
},"properties": {
"label": "Number Controller","default_value": 1,"step": 1,"placeholder": "Number Placeholder"
},"disabled": true
}
]
虽然input、select、switch、image、number对象同级,但对象的属性(值、规则、属性)存在差异。
如何在没有接口和继承机制的情况下建立相应的数据模型?将每个对象完全分开?
解决方法
文件结构
proto
├─ form
│ ├─ business.proto
│ ├─ input.proto
│ ├─ select.proto
│ ├─ image.proto
│ ├─ number.proto
│ ├─ ...
│ └─ switch.proto
└─ items
└─ index.proto
基本数据模型
// form/business.proto
syntax = "proto3";
package form;
message Business {
bool client_visible = 1;
bool disabled = 2;
}
// form/input.proto
syntax = "proto3";
package form;
import "form/business.proto";
message InputRules {
bool required = 1;
uint32 max_length = 2;
}
message InputProperties {
string label = 1;
bool readonly = 2;
string default_value = 3;
string width = 4;
string placeholder = 5;
}
message Input {
string type = 1;
string identity = 2;
string value = 3;
InputRules rules = 4;
InputProperties properties = 5;
Business business = 6;
bool disabled = 7;
}
// form/image.proto
syntax = "proto3";
package form;
import "form/business.proto";
message ImageRules {
bool required = 1;
}
message ImageProperties {
string label = 1;
bool readonly = 2;
string tip = 3;
}
message Image {
string type = 1;
string identity = 2;
string value = 3;
ImageRules rules = 4;
ImageProperties properties = 5;
Business business = 6;
bool disabled = 7;
}
实体模型
// items/index.proto
syntax = "proto3";
package items;
import "form/input.proto";
import "form/textarea.proto";
import "form/radio.proto";
import "form/checkbox.proto";
import "form/select.proto";
import "form/date.proto";
import "form/switch.proto";
import "form/image.proto";
import "form/number.proto";
message Nested {
uint32 id = 1;
oneof items {
form.Input input = 2;
form.Textarea textarea = 3;
form.Radio radio = 4;
form.Checkbox checkbox = 5;
form.Select select = 6;
form.Date date = 7;
form.Switch switch = 8;
form.Image image = 9;
form.Number number = 10;
}
}
message SearchRequest {
string query = 1;
int32 page_number = 2;
int32 per_page = 3;
}
message SearchResponse {
repeated Nested items = 1;
}
service SearchService {
rpc Search(SearchRequest) returns (SearchResponse);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。