[关闭]
@Wahson 2017-08-02T17:21:05.000000Z 字数 9606 阅读 972

前端元数据

bower install git://github.com/mrLeung/front-end-meta.git

TODO:

任务点:

新的元数据:

  1. // 数据定义
  2. // 说明:
  3. // 1. [field]? : type => 表示field字段是可选,类型是type
  4. // 2. FieldMeta & {prop:value} => 表示FieldMeta扩展了prop属性
  5. Model = {
  6. [fieldName]: any
  7. actions: array<string>,
  8. }
  9. dataType: {
  10. type: string, primitive|list|set|map|struct
  11. metadata: {}
  12. unitType: dataType
  13. }
  14. FieldMeta = {
  15. dataType: string, // idl 数据类型, primitive|list|map|set|struct|action,如“i32”、“list”,“TOrder
  16. element?: string, // ui元素,缺省时,会根据datatypedataTypeExtra,提供默认uih2-text|h2-textarea|h2-select-list|h2-radio-group|h2-checkbox
  17. name: string, // 字段名,如“orderNo
  18. label: string, // 字段名,如“订单号”
  19. require: boolean, // 是否必填,true | false
  20. mutil: boolean, // 多否多选,true | false
  21. format?: string, // 显示格式,用于日期显示,如“yyyy-MM-dd
  22. editable: boolean, // 是否可编辑,true|false
  23. validate: boolean, // 前是否需要校验,true|false
  24. length?: number, // 字符长度
  25. maxLength?: number, // 允许最大长度
  26. minLength?: number, // 允许最小长度
  27. regexp?: string, // 正则匹配
  28. prompt? : string, // 校验失败时的提示语,如“请输入备注”
  29. min?: number, // 数字最小值
  30. max?: number, // 数字最大值
  31. placeholder?: string, // placeholder
  32. candidates?: string | function(meta, model), // 候选值,下拉选项中的值,json串,如 "[{value:1,label:'男'},{value:2,label:'女'}]"
  33. candidateLabel?: string, // 组件显示字段名,针对下拉组件、radio-group组件等,“label
  34. candidateValue?: string, // 组件值字段名,针对下拉组件、radio-group组件等,“value
  35. alias?: string, // 别名,如果配置了此字段,提交表单时已这个字段作为key保存
  36. visible: boolean // 界面是否可见,仅对表单中的字段有效, 默认true
  37. }
  38. ActionMeta = {
  39. actionId: string, // 操作的唯一标识
  40. actionName: string, // 操作名,如 “收货”
  41. group: string, // 操作组,如 “更多”
  42. operType: number, // 操作类型,1:表单,2.弹窗
  43. formMeta: FormMeta, // 表单meta
  44. modelSrc?: string, // 弹窗的model请求url
  45. modelQueryParams?: list<string>
  46. }
  47. GridMeta = {
  48. title?: string, // 表格标题,可选
  49. grids: [
  50. Field & {
  51. colspan?: number, // 单元格占多少列
  52. rowspan?: number // 单元格占多少行
  53. }
  54. ],
  55. actions: { // 按钮操作
  56. [actionId]: ActionMeta & {
  57. // extended props
  58. }
  59. }
  60. }
  61. <h2-grid model={model} gridMeta={gridMeta}></h2-grid>
  62. FormMeta = {
  63. title: string, // 表单头
  64. formUrl: string, // 表单提交的url
  65. httpMethod: string, // 请求方法 GET | POST
  66. confirm?: string, // 确认提示
  67. isSubmitForbidden,
  68. fields: [
  69. Field1,Field2,...
  70. ],
  71. }
  72. <h2-form model={model} formMeta={formMeta}></h2-form>
  73. // h2-domain metadata
  74. DomainMeta = {
  75. query : {
  76. FormMeta & {
  77. paging: boolean // 是否需要分页 true|false
  78. }
  79. },
  80. actions: array<Action>,
  81. result : GridMeta
  82. }

idl表达元数据:

  1. // 数据结构定义
  2. struct QueryRequest {
  3. 1: i32 field1 ( m.ref = "admindb.QueryRequest.field1" )
  4. 2: optional string field2
  5. } (m.ref="admindb.QueryRequest")
  6. struct QueryResponse {
  7. 1: i32 field3 ( m.ref = "metadb.staffs.field3", m.editable="false" ) ,
  8. 2: optional string field4 ( m.ref = "metadb.staffs.field4", m.editable="false" )
  9. 3: list<Staffs> staffList ( m.metadata="struct@com.isuwang.soa.admin.service.OrganizationService::1.0.0::Staffs" )
  10. 4: TStaff aStaff (m.element="h2-action", m.metadata="action@com.isuwang.soa.admin.service.OrganizationService::1.0.0::queryStaffList")
  11. }
  1. // 服务接口定义
  2. DemoService {
  3. QueryResponse query(request: QueryRequest , pageRequest: PageRequest) (m.type="query")
  4. void delete(id: Int) (m.type="action",m.id="demo-delete", m.name="删除", m.operType="1", m.modelSrc="" )
  5. void add(request: DemoRequest) (m.type="action",m.id="demo-add", m.name="添加", m.operType="2" )
  6. }
  7. DemoLogisticService {
  8. void delete(id: Int) (m.type="action", m.id="demo-logistic-delete", m.name="删除", m.operType="1", m.modelSrc="" )
  9. void add(request: DemoLogisticRequest) ( m.type="action", m.id="demo-logistic-add", m.name="添加", m.operType="2" )
  10. }
  11. // 说明
  12. 1. m.scopeaction的范围,domain | field
  13. 2. m.ref 指定字段配置所在的数据库位置,可以配置添加或者覆盖属性值。
  14. 3. m.type=action:自动根据接口入参和出参,添加formMetaformMeta中的fields定义来源于入参出参中实体的field定义。
  15. m.type = query-action|domain-action|entity-action
  16. 4. m.permission="" // 此操作需要的权限
  17. 5. 接口定义约束:
  18. 6. 接口参数类型:primitive/list/set/map/struct 如果是struct(默认只有一个struct),
  1. // 元数据查询接口定义
  2. MetadataService {
  3. Method getMethodDesc( 1: string serviceName 2: string methodName 3: string version )
  4. list<Method> getAllMethodsDesc( 1: string serviceName 2: string version )
  5. Struct getStructDesc( 1: string serviceName 2: string structName 3: string version )
  6. }
  7. UIMetaService {
  8. /**
  9. * 1. foreach(services) => invoke metadataService.getMethods
  10. * 2. domainMeta.query = FormMeta( methods.filter(@query).get(0).args )
  11. * 3. domainMeta.actions = ActionMeta( methods.filter(@action && @action.scope=='domain' )
  12. * 4. domainMeta.result = GridMeta(
  13. * grids = list<FieldMeta>( methods.filter(@query).get(0).return ),
  14. * actions = ActionMeta( methods.filter(@action && @action.scope=='field' )
  15. * )
  16. */
  17. DomainMeta getDomainMeta( 1: list<string> services )
  18. GridMeta getGridMeta( 1: string serviceName, 2: string methodName )
  19. ActionMeta getActionMeta( 1: string serviceName, 2: string methodName )
  20. FormMeta getFormMeta( 1: string serviceName, 2: string methodName )
  21. }
  22. // --------------------------
  23. struct FieldMeta {
  24. 1: i32 id
  25. 2: string datatype
  26. 3: ...
  27. }
  28. struct ActionMeta {
  29. 1: string actionId: string
  30. 2: string actionName
  31. 3: i32 operType
  32. 4: FormMeta formMeta
  33. 5: optional string modelSrc
  34. }
  35. struct FormMeta {
  36. 1: string title
  37. 2: string formUrl
  38. 3: string httpMethod
  39. 4: optional string confirm
  40. 5: list<FieldMeta> fields
  41. }
  42. struct GridMeta {
  43. 1: list<FieldMeta> grids
  44. 2: map<string, ActionMeta> actions
  45. 3: string title
  46. }
  47. struct DomainMeta {
  48. 1: FormMeta query
  49. 2: list<ActionMeta> actions
  50. 3: GridMeta result
  51. }
  1. DROP DATABASE
  2. IF EXISTS metadb;
  3. CREATE DATABASE
  4. IF NOT EXISTS metadb DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
  5. DROP TABLE IF EXISTS metadb.fields;
  6. CREATE TABLE metadb.fields (
  7. id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  8. domain VARCHAR(50) NOT NULL COMMENT '领域,如 "orderdb"',
  9. entity VARCHAR(50) NOT NULL COMMENT '实体, 如"Torder"',
  10. name VARCHAR(50) NOT NULL COMMENT '字段名,如"orderNo"',
  11. alias VARCHAR(50) NULL COMMENT '别名,如"orderNum" ',
  12. element VARCHAR(50) NULL COMMENT '替换元素,如 "paper-input" ',
  13. label VARCHAR(50) NOT NULL COMMENT '字段名,如"订单号"',
  14. required SMALLINT(1) NOT NULL DEFAULT 0 COMMENT '是否必填 1: 是 0:否',
  15. mutil SMALLINT(1) NOT NULL DEFAULT 0 COMMENT '多否多选 1: 是 0:否',
  16. format VARCHAR(50) NULL COMMENT '显示格式,用于日期显示,如“yyyy-MM-dd”',
  17. editable SMALLINT(1) NOT NULL DEFAULT 0 COMMENT '是否可编辑 1: 是 0:否',
  18. validate SMALLINT(1) NOT NULL DEFAULT 0 COMMENT '前是否需要校验, 1: 是 0:否',
  19. length INT NULL COMMENT '字符允许长度',
  20. max_length INT NULL COMMENT '允许最大长度',
  21. min_length INT NULL COMMENT '允许最小长度',
  22. `regexp` VARCHAR(50) NULL COMMENT '正则匹配',
  23. prompt VARCHAR(50) NULL COMMENT '校验失败时的提示语,如“请输入备注”',
  24. min INT NULL COMMENT '数字最小值',
  25. max INT NULL COMMENT '数字最大值',
  26. candidates VARCHAR(1000) NULL COMMENT '下拉选项中的值,json串,如 "[{value:1,label:\'男\'},{value:2,label:\'女\'}]"',
  27. candidate_label VARCHAR(50) NULL DEFAULT 'label' COMMENT '组件显示字段名,针对下拉组件、radio-group组件等,“label”',
  28. candidate_value VARCHAR(50) NULL DEFAULT 'value' COMMENT '组件值字段名,针对下拉组件、radio-group组件等,“value”',
  29. placeholder VARCHAR(50) NULL COMMENT 'placeholder',
  30. visible SMALLINT(1) NOT NULL DEFAULT 1 COMMENT '界面是否可见 1: 是 0:否',
  31. created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  32. created_by INT (11) DEFAULT NULL,
  33. updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  34. updated_by INT (11) DEFAULT NULL,
  35. UNIQUE field_unique (domain,entity,name) COMMENT '字段唯一约束'
  36. ) COMMENT = '字段元数据';

组件定义的规范和约束:
组件初始化时会自动传入metadata、value和model(model作为context)
组件必须实现以下2个方法,并提供value属性,如果确实没有实现的必要,可以继承H2WidgetBase,该类提供了这三个方法的默认实现。
1. validate()
2. fire 'value-change' event
3. 必要是提供validate失败时的提示。


Document

  1. 提交表单时,只有visible=true && (required=true || validate=true) 才会触发字段校验

 

设计点:

  • 1. domain's actions: 调整h2-domain,下沉到meta,DomainMeta添加actions配置
  • 2. 表单表格嵌套,增加datatype=action
  • 3. 复杂单元格支持,页面实现调整
    • Field添加render字段,返回一个函数,用户可以定制此函数,render : function(model) { //... return }
  • 4. 表格添加筛选条件(查询条件),作为查询组件的一个扩展点,h2-domain-query提供slot
  • 5. 单元格简单样式支持,通过扩展支持,钩子函数传递,
    • Field添加styler字段,返回一个函数,用户可以定制此函数,styler : function(model) { //... return 'background:red;'}
  • 6. 支持表格分页查询,组件支持
  • 7. 表单表格数据筛选,组件扩展点实现
  • 8. 可编辑表格,h2-grid调整, h2-grid 添加editable属性

已实现组件

 

下周:

  • 1. 员工管理模块达到上线标准
  • 2. 图片上传组件
  • 3. 订单组件
  • 4. 交易员组件
  • 5. 供应商组件
  • 6. 代理公司组件

    • 1. 可编辑表格
    • 2. 数据类型组件抽离,支持外部动态添加新组件,已有组件再封装一层,保持取值和重置方法的一致性。
    • 3. 元数据组件文档整理
    • 4. 元数据下沉到idl
    • 5. action添加group特性
    • 6. grid layer & 样式调整
    • 7. 细化元数据idl,配置下沉到数据库,考虑元数据查询接口设计与实现(queryMeta)
    • 8. react.render实验

例子:

  1. GridMeta = {
  2. grids: [
  3. {
  4. datatype: "text",
  5. name: "orderNo",
  6. label: "订单号",
  7. required: true,
  8. mutil: false,
  9. },
  10. {
  11. datatype: "date",
  12. name: "createAt",
  13. label: "创建时间",
  14. required: true,
  15. mutil: false,
  16. format: 'yyyy-MM-dd'
  17. }
  18. ],
  19. actions: {
  20. "order-cancel": {
  21. actionId: "order-cancel",
  22. actionName: "取消",
  23. operType: 1,
  24. formMeta: {
  25. formUrl: "/order/cancelOrder.do",
  26. httpMethod: "GET",
  27. fields: [
  28. {
  29. datatype: "text",
  30. name: "orderId",
  31. label: "订单Id",
  32. required: true,
  33. mutil: false,
  34. },
  35. ],
  36. }
  37. },
  38. "new-order-item": {
  39. actionId: "new-order-item",
  40. actionName: "新子单",
  41. operType: 2,
  42. formMeta: {
  43. formUrl: "/order/saveOrderItem.do", // 表单提交的url
  44. httpMethod: "POST",
  45. fields: [
  46. {
  47. datatype: "text",
  48. name: "orderId",
  49. label: "订单Id",
  50. required: true,
  51. mutil: false,
  52. },
  53. {
  54. datatype: "select",
  55. name: "product",
  56. label: "产品",
  57. required: true,
  58. mutil: false,
  59. displayField: "productName",
  60. valueField: "productId",
  61. itemsField: "products",
  62. prompt: "请选产品"
  63. },
  64. {
  65. datatype: "text",
  66. name: "product",
  67. label: "备注",
  68. required: false,
  69. mutil: false,
  70. validate:true,
  71. max-length: 100
  72. }
  73. ],
  74. }
  75. }
  76. }
  77. }
  78. model = {
  79. products:[{
  80. productId: "123",
  81. productName: ""
  82. }]
  83. }
  84. FormMeta = {
  85. formUrl: "cancelOrder", // 表单提交的url
  86. httpMethod: "GET", // 请求方法 GET | POST
  87. fields: [
  88. {
  89. datatype: "text",
  90. name: "orderId",
  91. label: "订单Id",
  92. required: true,
  93. mutil: false,
  94. }
  95. ],
  96. }
  97. // h2-domain metadata
  98. DomainMeta = {
  99. query : {
  100. FormMeta & {
  101. paging: boolean // 是否需要分页 true|false
  102. }
  103. },
  104. result : GridMeta
  105. }

组件数据类型定义

datatype = 类型(可选项)

  • 1. string (length, max-length, min-length, regexp) // value是字符串
  • 2. number ( max, min ) // value是数字
  • 3. date ( max, min , format ) // value是日期的长整型
  • 4. select ( multi, displayField, valueField,itemsField ) // value是当前选中的值 1,[1,2]
  • 5. radio ( displayField, valueField ,itemsField ) // value是当前选中的值
  • 6. grid ( theads ) // value是表格的二维数组
    // 业务组件
  • 7. order-picker( displayField,valueField )
  • 8. purchase-order-picker( displayField,valueField )
  • 9. staff-picker( displayField,valueField )
  • 10. action ( actionMeta ) //
  • 11.
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注