Options
All
  • Public
  • Public/Protected
  • All
Menu

External module "index.d"

changelog

3.x.x 及以上版本不兼容老 UI,老 UI 只能使用 2.x.x 版本

该模块承载了巧思问卷答题客户端的核心逻辑流程,基于此模块可以单独开发自制的答题页面客户端,使用本模块以后,除了遵从一些启动配置和接口交互之外,只需专注于开发每个题型的 UI 即可,下面会详细介绍如何基于此模块创建自己的答题客户端应用。

使用了该核心包后,在控制台打印核心包的数据时,会发现里面的页面,节点,选项等对象上都有很多属性,但是你们如果要使用其中的属性来渲染页面,则切记一定要使用文档中提及到的属性,如果文档中没有提及到的属性,即使在控制台看到了它的内容好像是和设计端设置的内容一样,也不能使用,因为这些属性是核心包内部使用的,没有在文档中暴露给 UI,是因为它们可能会发生变化,如果后续移除了,UI 就没法正常渲染了。

已经暴露给 UI 的属性是不会轻易更改的,如果发生更改会升级核心包大版本。

如果你从代码编辑器中定位到这些属性的定义处,会发现它们都被@ignore 标注了,说明它们不应该被 UI 使用。

如果发现某个属性 UI 要使用到却没有出现在文档中(即被@ignore 了)则在 os-client-core 中提 issue。

安装核心逻辑依赖包

我们的核心包包含两种:

  1. 一个是纯核心包,只有与运行环境无关纯答题逻辑流程,无法直接运行,需要参照运行环境配置的规则,基于该纯核心包适配一些环境运行规则,然后才能在你希望的环境上运行起来。

  2. 另一个是 web 适配包,该包是参照运行环境配置的规则,基于纯核心包设配了 web 运行环境环境规则,可以直接使用与构建 web 端的答题客户端

如果你想构建基于 web 的答题客户端,建议直接使用 web 适配包,免去环境适配的工作,如果你要构建非 web 端(如小程序,原生 app)的答题客户端,则只能使用纯纯核心包,然后自行按规则配置好环境运行规则,再继续。

安装核心包:

npm install @choiceform/os-client-core/
# 或者
yarn add @choiceform/os-client-core

安装好以后可以分别按类似于下面方式使用:

使用核心包:

// 纯核心包和web适配核心包同时只用一个,自动提示包则按需使用
// 使用纯核心包
import { Core } from '@choiceform/os-client-core';
// 使用web环境适配核心包
import { Core } from '@choiceform/os-client-core/dist/web-core';
// 如果你的答题端需要支持填空题自动提示功能,需要额外使用自动提示搜索的辅助包
// 不支持的不要使用
import { getAutoCompleteData } from '@choiceform/os-client-core/dist/support/atcp';

运行环境适配

纯核心包中只包含题目解析和答题控制流程,并不包含运行环境适配的功能,比如运行时需要使用缓存,需要使用获取远程数据,需要获取系统当前语言等,这些东西在不同的运行环境中实现是不一样的,纯核心包期待每个使用它的地方为它适配好这些东西。

比如核心包可以用于微信小程序中来开发一个答题小程序,这时候就可以把微信小程序的wx.getStorage()配置为缓存获取方法,把wx.request()配置为获取远程数据的方法等。

再比如用于 web 方面时,localStorage配置为缓存适配,xmlHttpRequest配置为网络请求适配。

web 适配包是在纯核心包功能的基础上默认加入了 web 方面的适配的包,在开发 web 端的答题程序时,无需再次进行 web 适配,即可调用包中的接口开始启动答题流程。

对于其他环境上的开发则需先添加好环境适配在启动答题流程。

具体的适配规则请参照CCCore.registerEnv方法和CCEnvOptions中的说明。 也可以参照一下两个资源了解如何而配置环境运行规则:

  1. 自带的 web 核心环境适配
  2. 小程序的环境适配

如果你使用 typescript 编写项目,则该安装包的更目录下有 index.d.ts 提供基本的数据类型。强烈建议使用 typescript 来编写答题 UI 程序,这样在编程的时候就能通过编辑器的智能提示就能知道 UI 使用的数据源的数据结构,和相关说明.

类型文件 tips

核心包的typescript类型文件中使用了const enum, 在使用--isolatedModules配置进行编译的项目中,const enum无法被识别,不会成inline字面量,所以运行的时候会出错。如果你的项目使用了--isolatedModules配置进行编译,可以在package.json中的scripts中增加一个任务:

{
  "scripts": {
    "postinstall": "node node_modules/@choiceform/os-client-core/enum2union.js"
  }
}

这样当每次安装最近的核心包后,都会自动将核心包类型文件中的const enum准成literal union,避免--isolatedModules配置进行的编译问题。

默认使用const enum是因为它较literal union在类型辨析和文档生成方面更友好,尤其当是number union的时候。

开始创建答题客户端

我们将主要以 web 端为例进行说明,所以略过了环境适配,但是 UI 渲染的规则是通用的。

对于非 web 端的可以参考小程序答题端这个项目

你可以使用任何方式来创建一个项目,建议基于常见框架或库来创建:

对于这些常见的库和框架,我们写了一些项目案例放到了这里,你可以以这些案例项目为模板仓库创建自己的项目

当创建好项目以后我们需要安装该核心包作为依赖。

使用核心逻辑依赖包

核心包中提供了CCClient类型的CCClient对象,里面包含四个对象:

  • 核心CCClient.Core,它是CCCore类型。
  • 多语言模块CCClient.I18n,它是CCI18n类型
  • 事件中心CCClient.EventHub,它是CCEventHub类型
import {Core, I18n, EventHub} from `@choiceform/os-client-core`;
console.info(Core, I18n, EventHub);

当成功把依赖加入到自己的项目中之后,就要开始对答题客户端进行编程了。

了解答题程序流程

这里说明答题客户端运行的主要流程

  1. 访问答题程序,页面进行初始化配置
  2. 获取问卷封面信息并展示封面。
  3. 答题者点击封面的开始按钮
  4. 获取题目数据并展示初始的题目。
  5. 答题者对题目进行作答,如选中某个选项,在某个输入框中输入文字等
  6. 答题者可以作答完一道题后点击下一题按钮进入到下一题,或者点击上一题按钮回到之前的题目。
  7. 重复 5,6 两步操作,直到所有题目答完。
  8. 如果答题内容不符合要求,或答题过程中碰到严重错误,则会弹出提示消息或错误消息。
  9. 如果配置了奖励,则答完题目以后会跳转到奖励页面,这时需要获取奖励数据并展示奖励内容。

基于核心包自制答题客户端时,除了专注于制作 UI 页面外,还需要在 UI 与核心包之间做出必要的交互,后面我们会以上面列出的答题流程为基础说明这两者之间要做哪些必要的交互。

下面具体说明各个流程与页面的渲染

web 端答题程序路由规则(仅适用于 web 核心适配包)

一般情况下,web 端答题程序应该实现下面四个路由:

为了简单起见,web 核心包适配环境时已经固定好了路由名称,使用 web 核心包时需要按照这个规则路由

以下是说明中,xxxx 就是问卷 id

  • 1.开始页面路由,即主路由:/,地址是形如:http://your.host.com?sid=xxxx的规则

由于历史遗留问题,会兼容支持http://your.host.com?xxxx格式的开始页面地址。

该路由必须实现,该路由应该是程序启动后默认进入的路由

  • 答题页面路由:/survey,地址形如:http://your.host.com/survey?sid=xxxx

该路由必须实现

  • 奖励页面路由:/reward,展示奖励结果,地址形如: http://your.host.com/reward?sid=xxxx的规则,和答题页面的格式一样

如果你的答题程序从来不考虑奖励和抽奖,则可以不实现该路由.

  • 实时预览页面路由/themes,用于内嵌到问卷编辑器内部,让问卷设计者在设计问卷时可以实施查看某个问题在答题页面的 UI 展现.

如果你的答题程序不提供查看实时预览效果,则可以不实现该路由.

答题程序运行启动流程

  1. 进入程序后,调用核心包提供的CCCore.setup方法初始化页面配置,需要传入一个CCSetupOptions类型的参数,这个方法是一个异步方法,要等该方法执行完以后才能执后续的的操作。

  2. 初始化完成后,需要打开开始页面,在开始页面中需要调用CCCore.fetchStartState方法获得问卷封面数据,这是一个CCStartState类型的数据,然后根据开始页面/封面渲染规则进行页面渲染.

  3. 当问卷封面的开始答题按钮被点击以后,需要进入到答题页面,在这进入答题页面后调用CCCore.fetchSurveyState方法可以获得题目数据,这个数据是一个CCSurveyState类型的对象,当前要渲染的题目是CCSurveyState.nodes属性,然后可以根据答题页面渲染规则来渲染题目。

  4. 当题目中的选项被点击或输入框被输入时,UI 层需要按UI 与核心交互回调函数说明的规则调用对应的回调函数通知核心模块,这个在答题页面渲染规则中对个各个题目的渲染规则说明中也有详细的解释.

  5. 在答题时点击上一题下一题时,UI 层需要按UI 与核心交互回调函数说明的规则调用对应的回调函数通知核心模块。

  6. 当有警告消息和错误消息时,核心模块会发出该消息,在初始化的时候需要设置CCSetupOptions.notifyCCSetupOptions.alertCCSetupOptions.errorCCSetupOptions.locateError等几个方法来接受警告或错误消息,并在 UI 中以适当的方式将消息展示出来。

  7. (适用于 web 端)如果配置了奖励,则在答题页面回答完了所有问题后,点击领奖按钮需要进入到奖励页面,到达奖励页面后需要调用CCCore.fetchRewardState方法来获取奖励数据,这个数据是一个CCRewardState类型的对象,然后照奖励页面/页面渲染规则来渲染奖励页面。

  8. (仅使用 web 端)实时预览页面是一个独立页面,不在正式答题的流程内,也不会和其他几个页面发生跳转关系,他用于嵌入到问卷编辑器中提供实时预览功能,具体的渲染规则请参照实时预览页面渲染规则

开始页面/封面渲染规则

封面数据是一个CCStartState类型的对象,在该类型的 API 文档CCStartState中说明了应该在页面中渲染那些内容。

答题页面渲染渲染规则

答题页面的数据是一个CCSurveyState类型的对象,在答题页面中主要要渲染以下一些内容.

  • 题目

关联属性:CCSurveyState.nodes,这个属性是一个题目列表,之中有时候包含一个题目,有时候包含多个题目,需要一一渲染这些题目,其中可能出现以下这些题目类型,点击每个类型的链接可以查看该类型的渲染规则.

关联属性CCSurveyState.answerResumer,是CCAnswerResumer类型,如果该属性有值,且CCAnswerResumer.show的值为true,则先不要渲染题目,而是先渲染一个断点续答恢复确认面板,让答题者选择是基于之前缓存的答题记录继续做答,还是重新开始做答. 具体的渲染细节参照CCAnswerResumer类型中的说明;

  • 预览工具

关联属性CCSurveyState.previewTool,是CCPreviewTool类型,如果该属性有值,说明是预览模式,需要渲染一个预览辅助工具,使得测试答题的人在预览模式下能进行一些调试操作,具体的渲染规则查看CCPreviewTool类型中的说明.

  • 计时器

关联式属性CCSurveyState.restTime,如果该属性有值,则需要在答题页面的某个地方渲染这个值作为剩余时间的提示,这个值是一秒一秒地减少的.

  • 进度条

关联属性CCSurveyState.needProgressBarCCSurveyState.progress,如果CCSurveyState.needProgressBar的值为 true,则需要渲染当前答题进度,进度就是CCSurveyState.progress的值

如果CCSurveyState.nextButton属性有值,则需渲染前进(下一题)按钮,按钮的文字就是该属性的值, 点击以后需要调用CCUIEventHandler.handleNextClick方法

奖励页面/页面渲染规则(适用于 web 端)

该页面的数据是一个CCRewardState的对象,在该类型的 API 文档CCRewardState中说明了应该在页面中渲染那些内容。

实时预览页面渲染规则(适用于 web 端)

该页面的数据是一个CCRealtime类型的数据,真正要渲染的数据躲在CCRealtime.data中,它是CCRealtimeState类型,它有几个变化:

  • CCRealtimeState.isStart的值为true时,当成开始页面渲染

  • CCRealtimeState.isGift的值为true时,当成奖励页面渲染

  • 如果以上皆不是,则当成答题页面渲染.

  • 如果问卷内容支持多种语言,需要渲染多语言切换下拉列表,无论当成那个页面渲染,都需要.

  • 如果问卷中要求使用计时器或进度条,当以答题页面方式渲染的时候可以渲染一个不动的时间或进度调效果,供预览.当以开始页面和奖励页面渲染的时候则不需要.

  • 前进后退按钮,同答题页规则相同

多语言切换下拉列表

如果问卷支持多种语言的内容,则在开始页面,答题页面和实时预览页面中都需要添加一个问卷内容语言切换下拉列表 下拉列表的内容源自于:

langTable中包含两个或两个以上语言是就渲染语言选择列表,没有langTable属性,或langTable中包含的语言只有一个则不要渲染语言选择列表.

当答题者点击预览列表切换语言时,需要回调CCUIEventHandler.handleLangChange方法.

样式与主题

设计端中可以为问卷设置全局样式,分别通过以下方式访问到:

为每个节点也能设计一些布局信息,参照[[CCBNode.layout]]。

需要使用这些信息渲染页面

UI 与核心交互回调函数

各个页面和题目的 UI 被渲染出来以后,答题者可以在上面进行一些操作,当进行这些操作的时候,UI 层需要调用对应的回调函数来通知核心模块。

这些回调函数的规则在CCUIEventHandler类型中有详细的说明。

强化 UI 和逻辑分离的概念

平时我们使用 react,vue,angular 等库或框架编写前端项目时,我们的数据源和业务逻辑都是自己管理的,他们或者作为组件的状态,或者作为传入组件的属性,但是无论哪种,我们在项目中都有地方对他们的值进行修改和控制,用框架的更新属性的方法更改了这些值以后,框架就能感知到变化,就会驱动页面更新

但是当我们基于@choiceform/os-client-core开发答题页面程序时,答题程序的数据源和业务逻辑都是在这个包里的,答题页面程序负责开发的只是 UI 程序,UI 程序里面对业务逻辑是一无所知值的,对于数据源中某些属性的变化也是无感知的.所以就无法驱动页面更新,我们需要制定一些规则,UI 程序需要遵循这些规则,才能让核心逻辑程序包和 UI 程序可以正常地相互协作.

规则:

  • UI 程序中使用了核心包以后,每个页面都可以通过特定的数据获取方法从核心包中取到当前页面的数据,数据层次从页面到题目,从题目到选项一层层下去,UI 中可以绑定这个数据上的各种属性渲染出页面内容.(这一步没有障碍)

  • UI 永远只可以使用数据源中的内容,永远不要更改数据源中的任何内容.我们以选项的操作和渲染举例说明,我们用 react 代码片段举例,其中的option是一个CCOption选项,question是一个CCBNode问题, handler是一个CCUIEventHandler事件处理器,我们假设他是从 state 中读取出来的,真实情况下可能是从上层 props 中传进来的,

    option就是数据源

    import React from 'react';
    class MyOption extends React.Component {
      render(){
       const {handler, option, question} = this.state;
       return <div className='option-item'
          style={{ background: option.selected ? 'red' : 'gray' }}>
          <span>{option.text}</span>
          <input type="checkbox"
            checked={option.selected}
            onClick={() => handler.handleOptionClick(option, question)}
          />
        </div>
      }
    }

    在上述的代码中,我们渲染了一个选项,

    • 我们绑定了option.selected属性(依靠CCOption.selected来判断选项是否被选中,当选项未被选中时,背景渲染成gray色,checkbox处于不被check的状态,

    当选项选中时,背景渲染成red色,checkbox处于被check的状态

    • 当选项被点击时,选项应该在选中与被选中的状态之间切换,这时候我们监听onClick事件,我们第一想法就是要使用setState方法把把option.selected属性的值从true改成false,或者从false改为true,这样 UI 页面就自然而然更新了,但是我们上面说了 UI 永远不能改数据源中的内容,所以 UI 程序中不能直接去改写option.selected属性,而是通过调用CCUIEventHandler.handleOptionClick方法告诉核心逻辑层,核心逻辑层会去改写option.selected的值

    • 但是这样会出现一个问题,核心层去改动了数据源中的内容时用的是非 UI 驱动的方法,UI 对此是无感知的.导致更改以后,UI 页面不会更新,这个问题在下一点中进行说明和解决.

    为什么不让 UI 修改数据源:核心包中的逻辑是非常复杂的,就是为了让 UI 层能够专注于 UI 的开发,不参与答题流程的逻辑,我们才抽出的核心逻辑包,所以 UI 中对答题流程是一无所知的,就以上面选项选中的行为为例,简单想来,点击后不就是切换option.selected属性是falsetrue吗,但是真实场合下,如果是单选题,你这个选项被选中后,之前另外被选中的某个选项应该被取消选中,如果是多选题,因为选中数量已经达到多选最大限制数量,再去点击某个未选中的选项,其实是不能把该选项变为选中状态的,其他的还有选项排他,选项互斥的各种复杂逻辑,所以 UI 层即使想改,也是无法正确更改数据源上的内容的,如要正确更改,就必须把所有逻辑都考虑进来,一丝不漏,这样就把逻辑和 UI 混在一起了,就偏离了我们 UI 层和逻辑层分离的初衷.

    抽出逻辑层以后,才能方便我们对同样的逻辑(只要导入核心包即可)建立不同平台上不限个 UI 项目,定制各种各种风格的答题程序.

  • 怎样让 UI 层知道核心逻辑改动了数据源?

    • 在前面我们强调了 UI 不直接更改数据源的规则,以及 UI 和逻辑分离的原因,但是当 UI 和逻辑分离以后,UI 发生操作后委托逻辑层的的回调函数中对数据源进行更改以后,UI 是不知道的,导致数据源中数据虽然发生了变化, UI 页面却没有被更新

    • 为了解决这个问题,核心包中在更改任何可能影响 UI 渲染的数据时,都会在CCEventHub发出一个SET_PROPS事件,监听CCEventHub中的SET_PROPS事件,然后再驱动 UI 页面更新。

  • 编写 UI 答题程序时要习惯 UI 和逻辑分离的思维,否则你很容易犯在UI中更改数据源的错误,一旦 UI 中改动了数据源中的属性,逻辑层再基于被 UI 中改坏的数据进行逻辑处理时,可能得到一个错误的结果,会导致数据结果出错.

  • UI 组件自己内部的状态不是数据源,当然是由你自己任意管理,随意更改啦,不要混淆了概念哦.

  • 如果你对核心包的工作流程的理解达到炉火纯青的地步,其实你也是可以在 UI 中偶尔改一下数据源的内容,因为你知道这个改动不会影响到整个答题答题流程,这个在定制 UI 中临时解决一些特殊需求时非常有用。

  • 建议使用 typescript 构建答题客户端,这时候核心包中的类型提示说明能帮助你快速了解各个属性的用途。

  • UI 中调用CCUIEventHandler的回调函数中传入的选项,题目等对象型参数,必须是数据源中的原始对象,不能是经 UI 中拷贝后的副本。

关于多语言翻译

核心包中自己适应的多语言已经翻译好了,如果你对现有的核心包中翻译的内容不满意,则可以在调用初始化方法:[CCCore.setup]的参数中配置CCSetupOptions.langSrcMap属性来把核心包使用的多语言内容变成你想要的方式.

关于 UI 的多语言,需要 UI 中自行解决,其中核心包中导出了一个I18n对象,里面包含CCI18n.MessageFormat属性,是一个通用的多语言翻译工具,UI 程序中可以沿用.在之前列出的例子项目中,也展示了如何解决 UI 程序自身的多语言问题. 如果要新增支持的多语言,代号请参照百科全书, 我们居于其中的代号改为使用xx_xx这样小写字母加下划线的方式的代号.

案例项目

小程序

原生应用

web 端(仅适用于 web 端)

UI 答题程序可以做成常规项目,或者动态模板项目,我们后面的项目会采用动态模板的方式

关于两者的比较,请看os-client-live中的文档说明。

项目部署和注册(仅适用于 web 端)

答题程序做完以后,需要做以下事情,才能使你的答题程序和巧思调研系统结合起来一起工作.

  1. 需要将你的答题程序部署到远程服务器.可以通过网址访问
  2. 需要注册到巧思调研系统,提供好以下资料,联系巧思相关工作人员.
    • 你这个程序是常规方案的,还是动态模板加载方案的.
    • 你这个程序想注册成什么名称:如名称叫做我的答题程序.如果该名字已被注册则需要换名字.
    • 你这个程序部署在了那个地址:如地址是:https://www.myclient.com
    • 你在本地开发时启动的地址:如地址是:http://localhost:8080,这个地址是方便你本地开发调试使用的. 工作人员收到这些资料后,会审核你的答题程序,通过审核以后该程序会被注册到巧思调研系统,
  3. 如果审核注册成功,进入巧思问卷编辑器后,在主题设置中的答题应用程序下拉列表中,将会看到你答题程序名称,你可以选择适用你的答题程序来作为当前问卷的答题程序
  4. 选择好以后,点击问卷发布,点击即发布后的链接,就可以看到答题页面正式你的答题程序.结合成功!

调试(仅适用于 web 端)

  • 如果你在本地开发时已经在自己机器上有本地开发版的问卷编辑器,并且你准备用这个本地开发编辑器连接你的答题 UI 程序进项开发调试,则你什么操作也不需要做,他就会自动连通你本地的http://localhost:8080上的答题程序,记得要注意你本地启动的端口必须和上面准备资料中的端口一致哦.

  • 在本地的设计端配置config/local.ts中可以添加多个本地临时实验的答题端程序配置,如果你的设计端代码仓库中还没有这个文件,则启动设计端后就会出现,如果该文件报错,则删除掉该文件,重新启动一下设计端.

  localClient: [
    {
      dynamic: false,
      id: 'My Client Demo',
      value: 'My Client Demo',
      host: 'http://localhost:4402',
      prod: false
    }
  ],

这样这个程序只会在你本地的设计端中出现.不会再发布后的设计端中出现

  • 如果你使用非本地的问卷编辑器想连接本地的答题 UI 程序进行开发,则需要做以下操作才能连通.

    • 默认情况下服务器上的问卷编辑器会连接服务骑上的答题程序,以上面提供的资料为例就是连通https://www.myclient.com

    • 我们在打开问卷编辑器的地址中附加额外参数use_local_client,这时候编辑器不再使用https://www.myclient.com上的答题程序,而是转为使用你本地的http://localhost:8080上启动的答题程序,记得要注意你本地启动的端口必须和上面准备资料中的端口一致哦.

置顶说明

最新的格式规范,具体规则参照os-service-umbrella 的变更日志

每次发布新版本时,需要更改 package.json 的版本号,同时需要将 changelog 中的[Unreleased]改为版本号和发布日期,并且会更改代码包中的版本名和发布日期,操作比较繁琐,所以写了个脚本来自动更改,运行yarn release [version] [commit]就会自动做这些更改(不填入版本号则自动递增,填入版本号时版本号不能变低,否则会报错),输入 commit 参数则会自动 git commit 版本更新的更改。

更改代码包中的版本名是为了在答题端调试时在控制台中打印cfState.core能快速看到当前使用的核心包的版本号,便于定位问题。

一般来说,发起 pr 的提交中,只需要在 changelog 中标注更改即可,不需要升级版本号的提交,因为我们可能需要将多个 pr 都合并完后再发包,如果每个 pr 中都升级版本号,就会导致操作历史混乱。

我们等到各个 pr 都合并进来 staging 分支以后,确定了要发包时,才升级版本号并做出一个 chores:release vx.x.xx 的提交,这样,这个提交总是代表确实在这个提交处发布了一个包。

changelog

[Unreleased]

Added

Changed

Fixed

Removed

3.6.15 - 2022-8-26

Changed

  • 重做插件资源加载器,支持自动重试和手动重试。

3.6.14 - 2022-8-24

Changed

  • 修复类型发布错误

3.6.13 - 2022-8-24

Changed

  • 类型优化
  • 配合类型优化的业务流程改造

3.6.12 - 2022-8-16

Fixed

  • 修复一些事件触发

3.6.11 - 2022-8-12

Fixed

  • 忘记升级 os-cfpd

3.6.10 - 2022-8-12

Added

  • 支持解析逻辑判断时的无视大小写设置

3.6.9 - 2022-7-20

Fixed

  • 答题消耗时间计算错误 bug

3.6.8 - 2022-7-20

Fixed

  • 图片框选题其他选项隐藏显示控制 bug

3.6.7 - 2022-6-7

Fixed

  • 级联题深层必填验证

3.6.6 - 2022-5-27

Changed

  • 多语言改造与老数据兼容

3.6.5 - 2022-5-23

Fixed

  • #221
  • 选项组文本变量解析 bug

3.6.4 - 2022-5-16

Fixed

  • 紧急修复循环回挖变量外层循环节点没有被执行时解析出错的 bug。

3.6.3 - 2022-5-12

Changed

  • 调整多语言代码,增加支持一些语言

3.6.2 - 2022-5-3

Added

  • 对接后台图片上传多云端适配接口,支持上传到腾讯云和七牛云

Fixed

  • 修复上传破损图片导致上传过程卡死问题

3.6.1 - 2022-4-28

Added

  • 修复动态组件返回 promise 的问题

3.6.0 - 2022-4-27

Changed

  • 针对 ssr 做了一些调整

3.4.58 - 2022-4-26

Fixed

  • 临时解决了以下情况 :

    当级联题有两层,两层菜单题都开启必答。当第一层选中一个选项后,该选项对应的第二层菜单题没有作答,此时点击「下一题」可以进入下一题。正确的反馈是弹出错误。 但是如果级联题有三层,那么这次 PR 的逻辑可能会导致逻辑错误。

3.4.57 - 2022-4-22

Fixed

  • 修复某些情况下忘记解析嵌套的变量标签
  • 修复加载 js 文件没有同步进行的问题

3.4.56 - 2022-4-1

Added

  • 对输入的小数位数进行验证

Changed

  • 调整自动推导参数对接方式

3.4.55 - 2022-3-31

Changed

  • 纯粹为了升级 cfpd 发包

3.4.54 - 2022-3-31

Changed

  • 循环单页组中的题目总是不显示问题头内容的

Fixed

  • 修复完整答题时间的 bug

3.4.53 - 2022-3-30

Changed

  • 更改答题客户端规则

3.4.52 - 2022-3-28

Added

  • 选项组标题支持富文本解析

Changed

  • 图片选择题,上传题,菜单题,级联题的选项可以显示富文本内容

Fixed

  • 字符验证时允许小数点

3.4.51 - 2022-3-20

Removed

  • 移除了媒体转化成图片名的措施,以后:在显示内容中总是##围绕的 URL 地址,在参数中总是纯 URL 地址

3.4.50 - 2022-3-19

Changed

  • 增加自动 logo 显示控制属性
  • 修改自定义 logo 属性总是存在于全局 state 上,不在存在结束节点上。

3.4.49 - 2022-3-16

Fixed

  • 修复授权与奖励授权 code 冲突问题

3.4.48 - 2022-3-16

Changed

  • 移除日志
  • 主进程不等待微信分享完成。

Fixed

  • 修正一些翻译内容
  • 微信授权 code 冲突
  • 回复链接跳转后的错误中断处理

3.4.47 - 2022-3-16

Changed

  • 使用 cfpd 类型系统替换 core 中的现有类型

3.4.46 - 2022-3-15

Added

  • 增加日志

3.4.45 - 2022-3-15

Changed

  • 短化预设样式的选择器

3.4.43 - 2022-3-12

Fixed

  • 紧急修复因配置更改导致图片不显示的问题

3.4.42 - 2022-3-11

Fixed

  • 紧急修复随机、循环中的题目出现的未完成答案中提交 null 的 bug

3.4.41 - 2022-3-11

Added

  • 增加对预设富文本样式的处理
  • 更改图标获取路径

Fixed

  • 书签下载 bug

3.4.40 - 2022-3-1

Fixed

  • 选项组展示顺序调整,第一层的选项组们的位置由它包含的最靠前的选项决定,而不是直接放在未进入选项组的选项前面
  • 修复点击语言切换的时候,页面发生闪烁的问题

3.4.39 - 2022-2-28

Fixed

  • 修正单页显示只有一题的时候,点击下一题没有反应

3.4.38 - 2022-2-28

Added

  • 支持解析在初始页使用语言切换设置
  • 支持在预览模式下禁用快速答题按钮

3.4.34 - 2022-1-24

Added

  • 自定义的 url 参数支持

Changed

  • utils 暴露获取单个答案的方法
  • 验证题目时尝试验证所有的选项并标记错误

3.4.33 - 2022-1-18

Changed

  • 特殊处理页面跳转类型的第三方对接,如果准备打开跳转页面,则不显示内置的结束页面或配额失败错误弹框等内容,避免跳转前的闪烁问题。

3.4.32 - 2022-1-17

Changed

  • 支持从纯变量中解析出第三方对接 url

Fixed

  • 修复正式提交中没有处理配额满和收集器满的边缘情况

3.4.31 - 2022-1-13

Fixed

  • 修复奖励节点没有图片时的渲染问题

3.4.30 - 2022-1-13

Added

  • 创建 responses 是提交全部的 url 查询参数

Changed

  • 调整级联回调中 index 的规则为总是遵循原始索引
  • 减少 SET_PROPS 的时间的 debounce 时间

Fixed

  • 奖励页面图片和视频数据缺失

3.4.21 - 2022-1-10

Fixed

  • 修复多语言翻译错误

3.4.20 - 2022-1-10

Removed

  • 不再为发布的类型和文档中前置 readonly

3.4.19 - 2022-1-10

Changed

  • 更新地域字典内容和类型规范
  • 引入 os-cfpd,解压方法和枚举类型改为使用 os-cfpd 中的,其他类型暂未变动。
  • 简化引用选项追随流程
  • 移除 BEFORE_NEXT_OK,新增 beforeGotoNext 的 hook
  • 修复部分 bug

3.4.18 - 2021-12-31

Fixed

  • 修复变量个节点组内容没有成功加载多语言翻译的 bug

3.4.17 - 2021-12-17

Fixed

  • 修复提交结果中的 hookParams 问题

3.4.16 - 2021-12-17

Fixed

  • 修复第三方对接时的参数解析 bug

3.4.14 - 2021-12-17

Fixed

  • 修复图片地址转换时未考虑绝对路径(离线场合使用)的问题
  • 修复视频地址在离线端没有被转成本地地址的 bug
  • 修复一些没有被接住的 Promise 返回值

3.4.11 - 2021-12-9

Added

  • 限制自定义奖励不能被分享,分享出去后提示错误

Changed

  • 借助后台新加的接口支持重写奖励页面的数据源

Fixed

  • 修复奖励页面主题、layout、多语言等数据的缺失问题

3.4.10 - 2021-12-8

Fixed

  • 修复选项过滤器比较基准选项组 bug

3.4.9 - 2021-12-7

Added

  • 首页数据中新增了 publishedAt 属性

Changed

  • 更改微信分享时的图标

3.4.8 - 2021-12-4

Changed

  • 移除一些错误日志,优化跳转链接后的错误处理

3.4.7 - 2021-12-1

Changed

  • 优化减少开始页面的加载资源
  • 开始页面初始渲染完成后,会启动预加载
  • 资源不再在点击开始时一起加载,而是结合预加载程序按需加载。

3.4.6 - 2021-11-29

Added

  • 增加开始按钮点击后的资源加载时间监控
  • 新增对接后台支持的 socket 未完成答案提交

Removed

  • 移除了老方案的未完成题目的答案提交

3.4.5 - 2021-11-27

Fixed

  • 避免多次加载同一本脚本

3.4.4 - 2021-11-25

Added

  • 增加短信验证倒计时拦截保护

Changed

  • 提取验证码获取模块
  • 更改短信验证返回值类型

3.4.3 - 2021-11-24

Fixed

  • 修复 HTML 标签 tagName 大小写问题
  • 修复吸收选项引用组时节点不存在的情况

3.4.1 - 2021-11-23

Added

  • 新增问题区隐藏属性 node.headHidden
  • 新增循环圈单页组规则
  • 支持循环回挖变量,节点运行时名称变量。
  • 使用新方案实现未完成题目的答案提交

Changed

  • 适应新规则修正一些测试案例
  • 图片热点题支持多个热点

Removed

  • 移除了选项索引相关属性

3.3.3 - 2021-11-8

Fixed

  • 修复奖励节点中 layout 信息缺失问题

3.3.2 - 2021-11-6

Changed

  • 重构了选项排他功能
  • 简化了级联题回调,以配合统一的选项排他处理。

Fixed

  • 修复奖励节点显示语言 bug
  • 修复 v-config 深层嵌套解析失败 bug

3.3.1 - 2021-11-2

Added

  • 为给 UI 用的选项组增加当前级别属性

Fixed

  • 节点回溯单页中不能回溯的 bug
  • 选项分组变量拼接 bug

3.3.0 - 2021-10-30

Added

  • 为填空题选项增加前缀和后缀属性的类型描述
  • 支持使用逻辑反转
  • 当前矩阵的行列选项高度或者宽度是hidden 的时候,标记选项的visiablefalse
  • 增加选项分组支持
  • 连续评价题和 maxdiff 的翻页控制回调函数
  • 支持 cfpd 内置多语言
  • 节点回溯

Changed

  • 重做通用的排序题回调方法
  • 重做变量解析

Fixed

  • 移除排序题排序方式属性

Removed

  • 移除老式选项分组处理

3.2.0 - 2021-9-29

Added

  • 超时未完成答题时的答案提交
  • 使用 beacon api 在关闭页面之前提交未完成的答案
  • 解析新增变量:选项已被选中

Changed

  • 超时的时候移除答案缓存
  • 更改答案中答题总时间的属性名 cost_time => time_comsuming,且单位有毫秒改成秒
  • 离线模式下的偏好语言按问卷存储,在线模式下的仍然按全局存储
  • 调整离线 taskInfo 的推送时机,改成到验证通过后,尝试提交之前。
  • 移除 promisify 模式,改成 async/await
  • 连续评价题和 maxdiff 的翻页控制数据改有核心包管理。
  • 离线端上传的图片直接使用地址,不用 base64 渲染
  • 标准化 taskInfo 的数据结构和测试

Fixed

  • 预览模式下切换语言后的答案回复 bug
  • 排序题答案回复 bug
  • 数值分配题权重指示答案回复 bug
  • 矩阵行列单选自动推导数据 bug
  • 随机组组内挑选答案回复 bug
  • 离线 end_survey 在配额提交的触发时机错误 bug

Removed

  • 移除了防止的 html parser,改用有环境提供的 parser

3.1.2 - 2021-9-23

Changed

  • 预览数据改用强缓存策略
  • 统一选项 value 为 string 类型
  • 更改文档部署方式:直接放到本仓库内

Fixed

  • 修复级联题断点续答答案恢复 bug
  • 后台 api 错误码翻译 bug
  • 数据节点自动选中 bug

Removed

  • 移除数据节点老数据兼容处理
  • 移除级联菜单题 tabs 模式支持

3.1.1 - 2021-9-18

Added

Changed

  • 更改上传题的文件路径属性名

  • 只在微信环境中加载 wxsdk,并且加载失败后不中断系统运行

  • 更改默认后退语言和语言有限度选择机制

  • 多语言内容改为内置

  • 升级了构建工具

  • 配合新 UI 调整了部分不合理的属性名:normalIconUrl、activeIconUrl

Fixed

  • 其他选项排他没有排除掉另一个其他纯备注选项的输入框的问题。

Removed

  • 移除了所有 deprecated 的属性,不在支持老 UI
  • 移除针对 RN 的定制事件
  • 移除针对 lite 版问卷预览的特殊处理功能

2021 年 9 月份之前的 changelog 没有被记录

Index

Modules

Enumerations

Interfaces

Type aliases

Type aliases

AllKeyToType

AllKeyToType<T, B>: object

Type parameters

  • T

  • B

Type declaration

CCEventHubCb

CCEventHubCb: function

监听自定义时间的回调函数规格

Type declaration

    • params

      e 事件参数

      params

      data 附加数据

      Parameters

      Returns void

CCIAssistPropKeys

CCIAssistPropKeys: keyof CFPDOptMapping

辅助属性名称

CCIAssistProps

CCIAssistProps: AllKeyToType<CFPDOptMapping, string>

辅助属性

CCIMappingProps

映射属性

CCIMappingValue

CCIMappingValue: string | CCNodeImage

映射属性的值

CCIOptionAnswerValue

CCIOptionAnswerValue: number | string | CCICoords | CCMaxDiffRecord[]

CCIRequestFn

CCIRequestFn: function

Type declaration

CCOptGroupChild

CCOptGroupChild: CCOptGroup | CCOption

CFOptionInputData

CFOptionInputData: string | number | CCUploadResult | null

选项输入内容

CFPDMarkIconName

CFPDMarkIconName: "rating-love" | "rating-nps" | "rating-love" | "rating-star" | "rating-thumbs-up" | "rating-thumbs-down" | "rating-number"

CFPDMatrixYOptionDimension

CFPDMatrixYOptionDimension: string | MATRIX_OPTION_DISPLAY_MODE

矩阵题选项的宽高尺寸设置

CFPDOptMapKey

CFPDOptMapKey: keyof CFPDOptMapping

属性表

CFPDOptMappingValue

CFPDOptMappingValue: string | CFPDNodeImage

选项映射值

CFPDOptionGroupChild

CFPDOptionGroupChild: CFPDOptionGroup | CFPDGroupedOptionInfo

选项组的子项的两种形态,分别是选项组和选项 由于目前选项组的顶层也使用了作为选项组的基本数据结构

CFPDRefFollowMappings

CFPDRefFollowMappings: Partial<AllKeyToType<CFPDOptMapping, boolean>>

引用选项死死追随的的映射属性配置 如果某个属性为true,则是死死追随引用源的。

CFPDSwitchValue

CFPDSwitchValue: boolean | CFPDLogicConfig

开关值JSON类型

CFParamNames

CFParamNames: keyof CCQueryParams

标准参数名称列举

CFQuestionInputData

CFQuestionInputData: string | CCValidateData | CCMapLocation | CCICoords

问题输入内容

NODE_ANSWER_TYPE

题目答案类型枚举

OPT_ANSWER_TYPE

选项答案类型枚举

Generated using TypeDoc