arrow_back

编码

print
  1. 编码

    编码是前端编码工程师、应用服务(C# 或 Java)编码工程师、数据库编码工程师使用的对应用或模块编写和提交源代码的页面。通过该页面提交的源代码会被压缩保存在服务器上。随后(多人)人工编写的代码和自动生成的代码由 Pittypat 自动合并输出为完整的 VS 解决方案或 Maven 工程。

    Pittypat 允许开发人员直接在浏览器中编写相关的代码,也可以事先在本地 IDE 中编写源代码,通过浏览器粘贴提交到服务器。

    在输出应用或模块、功能、对象时,如果尚未提交任何源代码,那么 Pittypat 会编写默认的源代码,如果已经提交了源代码,Pittypat 将输出开发者提交的源代码。因此在输出的解决方案中,源代码已经是开发者提交后的源代码,Pittypat 会自动合并人工提交的代码和自动生成的代码,不再需要生成发布人员再通过其他途径(比如邮件、QQ)从编码人员那里收集源代码并合并到解决方案中。

    当需求等发生变更后,设计师可能会重新调整设计,并重新输出代码。如果此前编码工程师已经提交了源代码,Pittypat 会在输出的代码中使用人工编写的代码,而不是使用自动生成的代码。也就是说:

    1. 源代码组织

      Pittypat 允许在单个浏览器页面中编写 HTML、CSS、JS、Java、C# 或 SQL 代码。

      根据安排工作时编码类别和模块的不同,不同开发者所看到的源代码资源管理器的结构是不同的。开发者仅能查看和编写安排给自己的工作任务对应的模块的代码。

      1. Android AppShell

        Pittypat 实验性地为 Android 提供了一个 AppShell下载 PittypatAppShell for Android Studio),这是一个在 Android 上对单个 WebView 的封装,开发者可以利用该 AppShell 实现一个原生应用,用于访问 Pittypat 应用的站点。

      2. C#

        C#(文件扩展名 .cs)分为两个部分。一个是目标应用的业务代码,包括实体类和 Api 代码。另外一个是开源的 Pittypat 核心库代码。

        C# 代码组织
        C# 代码组织
        • 应用业务代码

          位于 cs/com.{开发者代码}.{应用标识符}/{模块标识符} 目录下。

          Api.cs 文件包含了模块中所有功能的 Api 函数的定义和实现。由于 Pittypat 仅仅允许修改功能方法体的代码,因此 Api.cs 还可以继续展开,以便开发者按每一个功能编写和保存源代码。

          Args 目录中是模块中功能实体类的源代码文件列表,这些文件都不需要人工修改。

          Data 目录中是模块中对象实体类的源代码文件列表,这些文件都不需要人工修改。

        • Pittypat 核心库代码

          核心库源代码和基础功能的源代码都使用 BSD 协议 开源。

          在浏览器中,仅仅允许开发者查看这些源代码,而不能修改。如果开发者需要修改这些源代码,应该在本地 IDE 中修改。

      3. Java

        Java(文件扩展名 .java)分为两个部分。一个是目标应用的业务代码,包括实体类和 Api 代码。另外一个是开源的 Pittypat 核心库代码。

        Java 代码组织
        Java 代码组织
        • 应用业务代码

          位于 java/com.{开发者代码}.{应用标识符}/{模块标识符} 目录下。

          Api.java 文件包含了模块中所有功能的 Api 函数的定义和实现。由于 Pittypat 仅仅允许修改功能方法体的代码,因此 Api.java 还可以继续展开,以便开发者按每一个功能编写和保存源代码。

          args 目录中是模块中功能实体类的源代码文件列表,这些文件都不需要人工修改。

          data 目录中是模块中对象实体类的源代码文件列表,这些文件都不需要人工修改。

        • Pittypat 核心库代码

          核心库源代码和基础功能的源代码都使用 BSD 协议 开源。

          在浏览器中,仅仅允许开发者查看这些源代码,而不能修改。如果开发者需要修改这些源代码,应该在本地 IDE 中修改。

      4. SQL

        SQL 代码文件位于 sql/com.{开发者代码}.{应用标识符}/{数据库类型} 目录下。数据库类型包括:mysql、sqlserver、oracle、db2 和 pgsql(PostgreSQL)。

        SQL 代码组织
        SQL 代码组织

        Pittypat 为每一种数据库中的 .sql 文件名称前缀一个数字,表示它们的执行顺序。

        • 1_tables.sql

          包含了目标应用中所有数据库表的 SQL 代码。这些代码都不需要人工修改。开发者可以继续展开单独查看某一个表的代码。

        • 2_global.sql

          包含了目标应用数据库使用的公共的函数、视图或存储过程等的定义。该文件可能需要人工编写。默认的,Pittypat 提供了一组基础函数或存储过程,分别参见 MySQL 参考SQL SERVER 参考ORACLE 参考

        • 3_init.sql

          包含了用于初始化目标应用数据库的 SQL 代码。该文件可能需要人工调整。默认的,Pittypat 创建了目标应用在 waln_authority 中注册应用和模块列表的代码,如果不使用 waln_authority,这些初始化代码可以不要。

        • 4_views.sql

          包含了目标应用中所有对象视图的 SQL 代码。视图代码可能需要人工修改。开发者可以继续展开单独查看或修改某一个视图的代码。

        • 5_procedures.sql

          包含了目标应用中所有功能存储过程的 SQL 代码。存储过程代码可能需要人工修改。开发者可以继续展开单独查看或修改某一个存储过程的代码。

      5. Web

        Web 前端代码包含 HTML、CSS 和 JS。

        Web 代码组织
        Web 代码组织
        • web/css/pittypat.css

          定义 Pittypat 通用页面的样式表。不需要开发者修改。

        • web/js/pittypat.js

          包含了 long.js,以及 Pittypat 自定义的基础代码。不需要开发者修改。请参见 pittypat.js 参考

        • web/index.html

          系统首页的 HTML。需要开发者修改。如果当前应用将融入其他应用站点中,可以不提供此页面。

        • web/index.js

          系统首页的 JS。需要开发者修改。如果当前应用将融入其他应用站点中,可以不提供此代码。

        • app.css

          位于 com.{开发者代码}.{应用标识符} 目录下,定义目标应用使用的公共的样式表。可能需要开发者修改。

        • app.js

          位于 com.{开发者代码}.{应用标识符} 目录下,定义目标应用使用的公共的 JS 代码。可能需要开发者修改。

        • _api.js

          位于 com.{开发者代码}.{应用标识符}/{模块标识符} 目录下,定义目标模块访问远程服务器使用 API。可能需要开发者修改,通常仅需要调整数据的客户端验证代码部分。

        • {功能标识符}.html

          位于 com.{开发者代码}.{应用标识符}/{模块标识符} 目录下,定义了目标功能对应的 HTML 代码。可能需要开发者修改。

        • {功能标识符}.js

          位于 com.{开发者代码}.{应用标识符}/{模块标识符} 目录下,定义了目标功能的前端交互 JS 代码。可能需要开发者修改。

        • 帮助页面

          位于 com.{开发者代码}.{应用标识符}/{模块标识符}/help 目录下,定义了目标模块帮助页面的 HTML 代码。可能需要开发者修改。

          此文件没有显示在编码页面的资源管理器中,未来可能需要专人编写帮助手册。在输出的 IDE 工程中可以编辑修改帮助页面。

    2. 人工编码量

      根据我们的研究和实践,总代码量、自动代码量、人工代码量比例关系如下:

      类别 代码 人工 人工比例
      前端代码 首页 check 70%
      app.css check 30%
      app.js check 10%
      _api.js check 10%
      功能.html check 54%
      功能.js check 67%
      C#/Java 对象实体类
      功能实体类
      功能 Api check 11%
      SQL tables.sql
      global.sql check 30%
      init.sql check 30%
      views.sql check 7%
      procedures.sql check 63%
      合计 24%
    3. 在 Pittypat 中,数据库表的源代码不需要人工编写,会由 Pittypat 自动根据开发者选择的数据库平台类型输出合适的 SQL 代码。

      Pittypat 为数据库表输出的源代码不是简单的 create table,而是会事先检查表、列、索引是否已经存在,然后根据判断结果决定是要添加、更新还是删除。这种方式有利于在应用已经发布到生产环境中后,在不破坏现有数据的情况下再次更新数据库表的结构。

      以下是 Pittypat 为 MySQL 创建的一个数据库表的源代码示例:

      注释部分的 selectinsertupdatedelete 语句用于工程师在编码过程中复制使用,减少自己编码的工作量。

    4. 对象 UI JS

      功能.js 文件中,Pittypat 为该功能引用的每一个数据对象创建一个 _ui 命名空间中的 JS 对象,其中包含了与该数据对象相关的所有的 DOM 操作。JS 源代码可能需要人工调整。

      以下一个 js 源代码示例(Pittypat 默认创建的代码):

      1. bind()

        将指定的对象绑定到目标元素。

        语法

        _ui.obj.bind(args, model, $model)
        • args

          进行服务器请求时传入的参数。

        • model

          要绑定的数据对象实例。

        • $model

          要绑定到的 DOM 元素。

        • 返回值

          $model,也就是要绑定到的 DOM 元素。

        此函数通常不负责绑定目标元素的结构、样式等,仅仅是将对象属性按要求的格式显示在对应位置上,内部不会创建新的对象 DOM 元素。$$.util.fmt 命名空间提供一组支持不同数据类型的格式化方法。

      2. html

        这是一个属性的 get 方法,返回单个数据对象以表单方式显示时使用的 DOM 结构。

        语法

        _ui.obj.html
        • 返回值

          字符串格式的 HTML 片段。

      3. show()

        根据 html 属性创建一个新的对象 DOM 元素,将新元素添加到目标上下文中,并使用 bind 绑定新元素。

        语法

        _ui.obj.show(args, model, $context)
        • args

          进行服务器请求时传入的参数。

        • model

          要绑定的数据对象实例。

        • $context

          新创建的对象对应的 DOM 元素所处的上下文。

        • 返回值

          新创建的对象对应的 DOM 元素。

      4. rowHtml

        这是一个属性的 get 方法,返回单个数据对象以列表行方式显示时使用的 DOM 结构。

        语法

        _ui.obj.rowHtml
        • 返回值

          字符串格式的 HTML 片段。

      5. insert()

        为指定的数据对象基于 rowHtml 创建一个新的 DOM 元素,并将新元素添加到指定列表的指定位置。

        通常创建或插入(INSERT)一条数据后执行该函数,以便将新插入的数据对象显示在列表中。

        语法

        _ui.obj.insert(args, model, pos, $list)
        • args

          进行服务器请求时传入的参数。

        • model

          要添加到列表中的数据对象实例。

        • pos

          数据对象对应的 DOM 元素在列表中的插入位置。如果为 0,添加到列表最前面。如果小于 0,则添加到列表最后面。

        • $list

          数据对象对应的 DOM 元素要添加到的列表。

        • 返回值

          新创建的对象对应的 DOM 元素。

        示例

      6. insertAll()

        为一组数据对象基于 rowHtml 创建一组新的 DOM 元素,并将所有新元素添加到指定列表的指定位置。

        通常在查询(SELECT)到一组数据对象集合后执行该函数,以便将查询到的数据对象显示列表中。

        语法

        _ui.obj.insertAll(args, models, pos, $list)
        • args

          进行服务器请求时传入的参数。

        • models

          要添加到列表中的数据对象实例的数组。

        • pos

          数据对象对应的 DOM 元素在列表中的插入位置。如果为 0,添加到列表最前面。如果小于 0,则添加到列表最后面。

          如果 pos 为 0,最终显示的顺序会与数组中元素的顺序相反。

        • $list

          数据对象对应的 DOM 元素要添加到的列表。

        • 返回值

          $list 本身。

        示例

      7. update()

        将指定的数据对象更新到现有的 DOM 元素上。默认使用 bind 进行数据绑定。

        通常在更新(UPDATE)一条数据后执行该函数,以便更新数据对象的显示列表。

        语法

        _ui.obj.update(args, model, $model, $list)
        • args

          进行服务器请求时传入的参数。

        • model

          要更新的数据对象实例。

        • $model

          现有的 DOM 元素。

        • $list

          DOM 元素所处的集合。

        • 返回值

          $model 本身。

        示例

      8. remove()

        将指定参数或数据对象对应的 DOM 元素从列表中移除。

        通常在删除(INSERT)一条数据后执行该函数,以便更新数据对象的显示列表。

        语法

        _ui.obj.remove(args, model, $list)
        • args

          进行服务器请求时传入的参数。

        • model

          要从列表中移除的 DOM 元素对应的数据对象。

        • $list

          DOM 元素所处的集合。

        示例

      9. paging()

        为数据对象的分页列表更新分页信息。

        通常与 insertAll 一起使用。

        语法

        _ui.obj.paging(args, total, rows, $context)
        • args

          进行服务器请求时传入的参数。

        • total

          复合条件的记录总数,用于计算需要的总页码数。

        • rows

          当前加载的记录总数,通常是当前分页上的记录数目。

        • $context

          分页信息元素所处的上下文。

        示例

      10. rowsChanged()

        当添加一条或多条新数据,或者删除一条或多条数据时,用于更新分页信息。

        语法

        _ui.obj.rowsChanged(rows, $context)
        • rows

          大于 0 表示新添加的数据行数,小于 0 表示删除的数据行数。

        • $context

          分页信息元素所处的上下文。

        示例

    5. 对象实体类

      Pittypat 为每一个数据对象在 C# 或 Java 中创建一个实体类。对象实体类的代码不需要人工调整。

      以下是一个在 C# 中的示例(Pittypat 默认创建的代码):

      以下是一个在 Java 中的示例(Pittypat 默认创建的代码):

      对象的实体类提供 readwriter 两个方法的实现。

      read 用于从数据库查询到的 DataReader 中读取单个对象实例。在 .NET 中 IDataReader 是 ADO.NET 的一个基础接口,在 Java 中 DataReader 是 Pittypat 定义的一个基础对象。

      write 用于将对象转换为 JSON 对象字符串,并写入指定的文本流,也就是实现对象的 JSON 序列化。在 .NET 中,Pittypat 重写了所有必要的基础类型(它们的标识符为 .NET 通用类型名称前缀 @ 符号,比如字符串为 @string),以便这些基础类型实现 IJson 接口,从而自己完成 JSON 序列化工作。在 Java 中,Pittypat 没有重写每一个基础类型,而是通过 pittypat.Json 帮助类实现基础类型的 JSON 序列化。

    6. 对象视图

      Pittypat 为每一个对象创建一个数据库视图。视图的源代码可能需要人工调整,但是调整量非常少。

      以下是 Pittypat 为 MySQL 创建的一个数据库视图的源代码示例(Pittypat 默认创建的代码):

      在编写视图代码时,仅仅允许开发者编写 as 关键字之后的部分。Pittypat 会自动在最后添加一个 ;,不需要人工添加。如果人工添加了 ;,那么 Pittypat 将保留该符号,不再自动添加新的 ;

    7. 功能 HTML

      Pittypat 为每一个功能创建一个 html 文件。通常,除了模块第一个功能(入口功能)的 html 文件外,其他功能的 html 文件有可能是不需要的。

      以下是一个示例(Pittypat 默认创建的代码):

    8. 功能 JS

      Pittypat 为每一个功能在目标模块的 js 文件中创建一个 API 的 AJAX 或 Web Socket 调用。

      以下是一个示例(Pittypat 默认创建的代码):

    9. 功能实体类

      Pittypat 为每一个功能创建一个实体类,该类包含了一个功能所有的参数的定义,每一个参数在类中对应一个属性,或者对应一对 get 和 set 方法。

      以下是在 C# 中的一个示例(Pittypat 默认创建的代码):

      以下是在 Java 中的一个示例(Pittypat 默认创建的代码):

      C# 中索引器或者 Java 中 setParameterValuegetParameterValue 用于以字典的方式设置或获取对象的属性值。这种方式能够避免通过反射获取或设置属性值,提高效率。

      write 方法用于将对象序列化为 JSON 字符串,并写入目标文本流。

    10. 功能 API

      Pittypat 为每一个功能在模块类中创建一个方法。在 C# 中总是创建为异步方法。

      以下是在 C# 中的一个示例(Pittypat 默认创建的代码):

      以下是在 Java 中的一个示例(Pittypat 默认创建的代码):

      C# 中总是使用异步方法,目前 Java 不支持异步的方式执行功能方法。

      model 参数提供了功能的参数列表、当前用户信息等,具体请参见 FunctionModel 类的定义。

      progress 用于在操作过程中向客户端随时汇报操作的进度。目前只对 Web Socket 操作有效。具体请参见 IAsyncProgress 接口的定义。

    11. 功能存储过程

      Pittypat 为每一个功能在目标数据库中创建一个存储过程或数据库函数。

      以下是针对 MySQL 数据库的一个示例(Pittypat 默认创建的代码):

      存储过程中的参数包括开发者定义的参数和系统参数。系统参数包括三个:

      • _context

        输入参数,一个 JSON 字符串,其中包含了当前运行环境中的上下文信息,比如客户端 IP 地址和首选语言。

        目前该参数结构为:

        {
            lang: "语言",
            ip: "IP 地址"
        }

        语言比如:zh-CN,开发者可以根据客户端语言向用户返回目标语言的数据。根据服务器不同,IP 地址可能是 IPv4 或 IPv6。

        由于 _context 是一个字符串,开发者需要自己使用数据库中提供的 JSON 解析函数解析使用该参数。

      • _success

        输出参数,一个布尔值,表示存储过程中的数据操作是否执行成功。如果将该参数设置为 false | 0,则客户端将接收到错误信息。

      • _message

        输出参数,一个字符串,当操作失败时向客户端返回的消息。

      如果目标系统中安装了沃恩提供的日志应用,可以通过 waln_log.log_op 记录用户的操作留痕信息,通常只对数据更新操作记录此类信息。默认的,Pittypat 会为所有的操作自动添加该代码。

    12. _api.js

      Pittypat 为每一个模块创建一个 _api.js 文件,该文件包含了模块中所有功能的应用服务请求 API。

      以下是一个示例(Pittypat 默认创建的代码):

    13. 模块服务 Api 类

      Pittypat 为每一个模块创建一个 Api.cs/java 文件,该文件包含了模块中所有功能的服务端 Api 代码,并封装为一个模块类。

      以下是在 C# 中的一个示例(Pittypat 默认创建的代码):

      以下是在 Java 中的一个示例(Pittypat 默认创建的代码):

    14. 所有表

      Pittypat 为每一个模块创建一个 tables.sql 文件,文件内容是空的,以便开发人员编写针对该模块的数据库初始化代码。

      以下是针对 MySQL 数据库的一个示例(Pittypat 默认创建的代码):

    15. 数据库全局函数

      Pittypat 为每一个模块创建一个 local.sql 文件,文件内容是空的,以便开发人员编写针对该模块的公共的视图、函数或存储过程。

      以下是针对 MySQL 数据库的一个示例(Pittypat 默认创建的代码):

    16. 数据库初始化

      Pittypat 为每一个模块创建一个 init.sql 文件,文件内容是空的,以便开发人员编写针对该模块的数据库初始化代码。

      以下是针对 MySQL 数据库的一个示例(Pittypat 默认创建的代码):

    17. 所有视图

      Pittypat 为每一个模块创建一个 views.sql 文件,该文件包含了所有对象视图的代码。

      以下是针对 MySQL 数据库的一个示例(Pittypat 默认创建的代码):

    18. 所有存储过程

      Pittypat 为每一个模块创建一个 procedures.sql 文件,该文件包含了所有功能存储过程的代码。

      以下是针对 MySQL 数据库的一个示例(Pittypat 默认创建的代码):

    19. 输出源代码

      在编码页面右上角,用户头像对应的下拉菜单中包含一个 输出应用 的菜单项,点击该菜单项可以输出整个应用。

      Pittypat 会将一个应用输出为一个完整的 Visual Studio 解决方案,或者适合于 Java 开发环境的 Maven 工程,其中包含源代码、文档以及其他相关的资源。解决方案将被打包为一个可下载的压缩包,解压缩后可以使用相应的 IDE 打开使用。解决方案或工程中仅包含当前用户有权限查看和编码的模块。输出 App 时需要填写如下的选项:

      1. 用户前端

        H5 Web、微信小程序、Android 或 iOS 原生应用。目前已支持 H5 Web。

      2. 应用服务

        应用服务的类型,可以是 Java 或 C#。如果在创建应用时只选择了一种语言,这里的选项就是禁用的。

      3. 数据服务

        目标数据服务的类型,可以是 MySQL、SQL SERVER 或 ORACLE。如果在创建应用时只选择了一种数据库,这里的选项就是禁用的。

    20. 编写源代码

      Pittypat 提供在浏览器中编写和保存代码的支持,并且支持语法高亮显示源代码,但是不支持对源代码的编译功能,也不支持智能感知功能。通常开发人员会在本地 IDE 中编写代码,调试通过后再将源代码粘贴到浏览器提交保存。Pittypat 在输出代码时会将开发人员提交保存的代码与自动输出的代码合并。

      源代码在提交前会首先进行压缩,压缩后最大支持的长度为 2M 字节,因此建议源代码的总长度不超过 2M,最大略微超过 2M。

      1. 填空式编码

        功能的 Api 方法代码、存储过程代码,对象的视图代码都采用填空式的编码方式。因为,功能方法声明、存储过程声明、视图声明都是不允许修改的。开发者只需要编写方法实现代码、存储过程实现代码和视图实现代码即可。

      2. HTML

        Pittypat 使用 HTML5 作为开发 html 的语言,App 的目标运行浏览器应该提供对 HTML5 协议的支持。

        关于 HTML5 的参考请参见 MDN 上的 HTML5 (可能包含英文内容)。

      3. CSS

        Pittypat 使用 CSS3 作为开发 CSS 的语言,App 的目标运行浏览器应该提供对 CSS3 协议的支持。目前 Pittypat 还不支持直接在浏览器中编写 SASS、LESS 等代码,如果需要使用 SASS 或 LESS,开发者可以在本地 IDE 中编写 SASS 或 LESS,并在本地编译成 CSS 后再提交到 Pittypat。

        关于 CSS3 的参考请参见 MDN 上的 CSS3 (可能包含英文内容)。

      4. JS

        Pittypat 使用 ECMAScript 5.1 或以上版本标准的 JavaScript,目前所有主流浏览器至少都支持 ECMAScript 5.1。开发者可以使用 ES6,甚至 ES7 的新特性,但是应该保证 App 的目标运行环境支持这些新的特性。

        关于 CSS3 的参考请参见 MDN 上的 JavaScript (可能包含英文内容)。

      5. C#

        Pittypat 使用 C# 5.0+ 语言规范,相对应的 .NET Framework 版本为 4.5.2+。开发者应该考虑使用 VS 2015 作为首选开发环境。

        Pittypat 深度定制 Web API,取消了 MVC 中的 Controller,请求会被直接路由到模块的 Api 类。

        关于 C# 语言请参见 MSDN 上的 C# 语言规范(可能包含英文内容)。

        关于 .NET Framework 4.5.2 请参见 .NET Framework 4.5.2 下载

        关于 VS 2015 请参见 VS 2015 社区版

      6. Java

        Java 取消了传统 MVC 中的 Controller,请求会被直接路由到模块的 Api 类。

      7. SQL

        Pittypat 已支持 3 种数据库的 SQL 代码编写:MySQL、MS SQL SERVER、ORACLE,未来将支持更多数据库。

        所有的标识符默认一律使用 " (双引号)引用,这是因为 " 是 ANSI 规范,所有数据库都支持,当进行数据库移植时能够提供最大的便利。

    21. 输出文档

      目前,Pittypat 输出数据库设计说明书、详细设计说明书和帮助手册。其他文档将陆续提供。

      1. 数据库设计说明书和详细设计说明书

        这两个文档都是通过客户端 JS 生成的 .html 文件,而不是 Word 文件。开发者可以直接打印文件,也可以将 HTML 复制到 Word 中创建 .doc.docx 文件。这两个文件都不需要人工修改,最多是在 Word 中创建目录和封面。

      2. 帮助手册

        Pittypat 为每一个模块、每一个功能创建了在线帮助页面,每一个模块的帮助页面位于 web/com/{开发者标识符}/{应用标识符}/{模块标识符}/help 目录下。Pittypat 已经将每一个功能页面的帮助按钮链接到了帮助页面中的相应位置,开发者只需要完善帮助页面,并将每一个功能的截图按照功能标识符的 camel 格式存放在 help/images 目录下即可。帮助页面可以直接打印,因此可以用作验收需要的提交文档。

    22. 请参见