本想做个问卷系统,在github上找到一个叫做surveyjs的项目,正好是我需要的东西。
官网
vue项目,surveyjseditor例子
可以只用单个survey页面或者把编辑器导入也行。
这里我的是问卷生成,所以俩部分都需要使用
本地找个空文件夹
打开gitbash命令行窗口
git clone https://github.com/surveyjs/surveyjs_vue_quickstart.git
项目克隆下来后
直接运行肯定不行
显然根目录下少了nodejs的node_modules
在该目录下打开命令行窗口
运行
npm install
(可能需要翻墙)
装好对应的依赖和库
就可以
npm run dev
运行了
打开项目目录
直接打开上面的components组件目录,里面SurveyEditor.vue是我们引用需要写的组件代码。
<template>
<div>
<div id="surveyEditorContainer"></div>
</div>
</template>
<script>
import * as SurveyEditor from 'surveyjs-editor'
import 'surveyjs-editor/surveyeditor.css';
import * as SurveyKo from "survey-knockout";
import * as widgets from "surveyjs-widgets";
import "inputmask/dist/inputmask/phone-codes/phone.js";
widgets.icheck(SurveyKo);
widgets.select2(SurveyKo);
widgets.inputmask(SurveyKo);
widgets.jquerybarrating(SurveyKo);
widgets.jqueryuidatepicker(SurveyKo);
widgets.nouislider(SurveyKo);
widgets.select2tagbox(SurveyKo);
widgets.signaturepad(SurveyKo);
widgets.sortablejs(SurveyKo);
widgets.ckeditor(SurveyKo);
widgets.autocomplete(SurveyKo);
widgets.bootstrapslider(SurveyKo);
export default {
name: 'survey-editor',
data () {
return {
}
},
mounted () {
let editorOptions = { showEmbededSurveyTab: true };
this.editor = new SurveyEditor.SurveyEditor('surveyEditorContainer', editorOptions);
this.editor.saveSurveyFunc = function() {
console.log(JSON.stringify(this.text));
};
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
</style>
大部分代码都很容易理解,showEmbededSurveyTab是用来选择是否显示应用在不同项目中需要写的代码的子页面,我改为false
如何把该组件引入自己的项目中–
新建项目
按上次vue总体结构学习这节配置好vue项目结构之后。
把该加入的SurveyEditor.vue放入component目录
把该vue里用到的比如surveyjs-editor、survey-konckout、surveyjs-widgets、phone一一用
npm install xxxx -D
安装好
然后在页面里需要使用到该组件时只需要
如上导入即可
另外,生成的页面导入,该页面创建完问卷后点击save survey会产生一个关于该问卷的格式信息,在saveSurveyFunc方法里我们可以对该数据进行处理提交给数据库。
当获取到该数据后要对新的问卷页面进行渲染,则可以这样:
新建页面
<template>
<div id="surveyContainer">
<!-- <link href="https://surveyjs.azureedge.net/1.0.66/survey.css" type="text/css" rel="stylesheet" /> -->
<survey :survey="survey"></survey>
</div>
</template>
<script type="text/javascript">
import * as Survey from 'survey-vue'
import 'bootstrap/dist/css/bootstrap.css';
Survey.Survey.cssType = "bootstrap";
var surveyJSON = {"pages":[{"name":"page1","elements":[{"type":"comment","name":"question1","title":"aaa"},{"type":"dropdown","name":"question2","choices":["item1","item2","item3"]}]},{"name":"page2","elements":[{"type":"radiogroup","name":"question3","choices":["item1","item2","item3"]}]},{"name":"page3","elements":[{"type":"matrix","name":"question4","columns":["Column 1","Column 2","Column 3"],"rows":["Row 1","Row 2"]}]}],"maxTimeToFinishPage":10,"showTimerPanel":"top"}
var mysurvey = new Survey.Model(surveyJSON);
export default{
data(){
return{
survey:mysurvey
}
},
methods:{
sendDataToServer:function(survey){
alert("The results are:" + JSON.stringify(survey.data));
}
},
created(){
mysurvey.onComplete.add(this.sendDataToServer);
}
}
</script>
(这里要用安装bootstrap和survey-vue)
这样就能渲染出对应的问卷或考试页面(考试可以设置提交限定时间),上面的surveyJSON是我现导入的数据,一般使用要从服务器获取。
关于created和mounted的区别
created是在页面创建的时候,mounted是页面渲染结束后,上面的created应做修改
参考