海创软件组-20200628-Vue学习过程中的记录

问卷调查前端与后端的分离设计

  • 问卷调查项目的实现以及收获
    • 前期准备
      • vue-router
      • Element-UI组件库
      • axios http库
    • 实现过程
      • 关键的选项渲染部分
      • 部分数据结构
    • 总结
    • 值得注意

问卷调查项目的实现以及收获

这一次是本团队的二轮考核项目,相较于一轮考核,两者之间的复杂程度跨度巨大,对我而言,前端独立实现一个网页可能不会遇到很多问题,但是只有前端实现某一个项目是无法实现更多更复杂的功能的,因此你需要和后端合力实现,起初我和后端的理解都认为是他给接口,我渲染的两点一线的操作,直到后面,我错了,由于沟通不当导致后期渲染出现了阻碍,严重影响了实现时常,多花了一个星期处理这件事。

前期准备

前期我们需要有element-ui、axios以及vue-router作为主要的插件,用来实现页面内容、页面结构、页面与页面之间的切换以及与后台交互,本次的项目是基于Vue.js,通过vue-cli(脚手架)搭建的一个简单的项目,主要功能就是提供一个问卷调查,实现基本的判断,实现前后端交互,体验前后端交互的技巧与困难。

vue-router

Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。包含的功能有:嵌套的路由/视图表;模块化的、基于组件的路由配置;路由参数、查询、通配符;基于 Vue.js 过渡系统的视图过渡效果;细粒度的导航控制;带有自动激活的 CSS class 的链接;HTML5 历史模式或 hash 模式,在 IE9 中自动降级;自定义的滚动条行为。

本次的项目页面与页面之间的联系也是通过vue-router来实现的

  • 问卷部分
    • Login 登陆界面
    • Personal_info 个人信息界面
    • Course_cm 课程评价界面
    • Graduation_cm 毕业评价界面
    • Suggestion 建议界面
  • 后台部分
    • back 后台管理界面
    • info 后台个人信息界面
routes: [
    {
      path: '/Login',
      component: Login
    },
    {
      path: '/Personal_info',
      component: Personal_info
    },
    {
      path: '/Graduation_cm',
      component: Graduation_cm
    },
    {
      path: '/Course_cm',
      component: Course_cm
    },
    {
      path: '/Suggestion',
      component: Suggestion
    },
    {
      path: '/back',
      name: back,
      component: back,
    },
    {
      path: '/info',
      name: info,
      component: info,
      query:{
        stuid:undefined
      }
    },
    //优先显示的界面
    {
      path: '/',
      redirect:'/Login'
    },
  ]

Element-UI组件库

在这里插入图片描述

Element,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库,整个ui风格简约,很实用,使用demo组件可以快速实现体验交互细节,快速开发

本次的页面设计主要使用了element-ui的布局容器来实现对页面的整体布局,通过它提供的各类选项框来对问卷选项进行设置,配合Vue.js中的v-for的指令可以实现对一套完整的问卷题目进行动态生成,即后台如果有需要,则可以修改其中的对象,达到增删题目或者改查题目的需求。

axios http库

Axios,基于 Promise 的 HTTP 客户端,可以工作于浏览器中,也可以在 node.js 中使用。
功能:
1.从浏览器中创建 XMLHttpRequest
2.从 node.js 中创建 http 请求
3.支持 Promise API
4.拦截请求和响应
5.转换请求和响应数据
6.取消请求
7.自动转换 JSON 数据
8.客户端支持防止 XSRF 攻击

其中我主要用到了,post和get请求
1.post请求

          postHandle(object2){
            var test2 = object2
            let data = {ename:test2.ename, requireid:test2.requireid, 
                        reqsmid:test2.reqsmid, stuid: Vue.prototype.$stuid}          			axios.post('http://192.168.2.67:8080/Graduation/text/doRequirement.do',data,{})
            console.log(test2)
          },

2.get请求

      allGet() {
        //从后端获取数据
        var stuid = this.$route.query.stuid
        var that = this;
        axios.get("http://192.168.2.67:8080/Graduation/text/all.do",{
          params:{
            stuid
          }
        })
          .then(function (response) {
            that.tecour = response.data.tecour
            that.tereq = response.data.tereq
            that.students = response.data.students
            that.suggest = response.data.suggest
          })
          .then(res => console.log(res))
          .catch(err => console.log(err))
      },

以上的内容后面再细说

实现过程

关键的选项渲染部分

此处是毕业评价的部分,无需绘制表格

    <div id="Graduation_cm_form">
    <span v-for="b_title in requirements" class="Graduation_span">
      <h2>毕业要求:{{b_title.requireid}}</h2>
      {{b_title.name}}
      <div v-for="l_title in b_title.requirementsmall">
        <span class="Graduation_span">
        {{l_title.reqsmid}}{{l_title.requirename}}
          <div class="Graduation_cm_juz">
            <el-radio-group style="flex-direction: unset" v-model="l_title.ename" @change="postHandle(l_title)">
              <el-radio label="完全达到" class="answer-1">完全达到</el-radio>
              <el-radio label="达到" class="answer-1">达到</el-radio>
              <el-radio label="基本达到" class="answer-1">基本达到</el-radio>
              <el-radio label="基本未达到" class="answer-1">基本未达到</el-radio>
              <el-radio label="完全未达到" class="answer-1">完全未达到</el-radio>
            </el-radio-group>
          </div>
        </span>
      </div>
    </span>
    </div>

其中由于使用的是双重循环来实现对大题目和小题目的渲染,因此数据结构必须是嵌套的关系,由于开始的时候和后端搭档沟通不当,导致数据结构是分层关系,我所学的技能不能支持我进行对json格式进行二次处理,因此就让后端搭档帮忙重构了一次数据结构,也是这一部分导致了后期她的工作量攀升,我感到十分抱歉。

部分数据结构

data(){
          return{
            stuid:Vue.prototype.$stuid,
            requirements:[
              {
                name: undefined,
                requireid:undefined,
                requirementsmall:[
                  {
                    requireid:undefined,
                    reqsmid:undefined,
                    requirename:undefined,
                    ename:undefined
                  }
                ]
              }
            ]
          }

其实后来发现,并不需要后端给我每个题目的id和小题目的id,可以通过先前在上文贴出来的代码中的index进行输出序号,只需要让index++就好

<span v-for="(tereq,index) in tereq" :key="index" class="Graduation_span">
	<h2>毕业要求:{{index+1}}</h2>
		{{tereq.name}}
	<div v-for="(l_title,index1) in tereq.requirename" :key="index1">
	<span class="Graduation_span">
		{{index+1}}.{{index1+1}}{{l_title.require}}

本来想通过vue-router来实现单页面中的选项卡的切换,但是发现element-ui有现成的组件,因此就用了element-ui的组件来实现,以下是info的例子

  <el-container id="back-box1">
    <el-header id="back-box2">
      <span>后台管理界面</span>
    </el-header>
    <div id="info_box">
      <el-tabs>
        <el-tab-pane label="个人信息" name="first">
          <div class="personal_input">
           //
          </div>
        </el-tab-pane>
        <el-tab-pane label="毕业评价" name="second">
          <div id="Graduation_cm_form">
            <span v-for="(tereq,index) in tereq" :key="index" class="Graduation_span">
              <h2>毕业要求:{{index+1}}</h2>
              {{tereq.name}}
              <div v-for="(l_title,index1) in tereq.requirename" :key="index1">
                <span class="Graduation_span">
                {{index+1}}.{{index1+1}}{{l_title.require}}
                  <div class="Graduation_cm_juz">
                    <el-radio-group style="flex-direction: unset" v-model="l_title.ename">
                      <el-radio label="完全达到" class="answer-1">完全达到</el-radio>
                      <el-radio label="达到" class="answer-1">达到</el-radio>
                      <el-radio label="基本达到" class="answer-1">基本达到</el-radio>
                      <el-radio label="基本未达到" class="answer-1">基本未达到</el-radio>
                      <el-radio label="完全未达到" class="answer-1">完全未达到</el-radio>
                    </el-radio-group>
                  </div>
                </span>
              </div>
            </span>
          </div>
        </el-tab-pane>
        <el-tab-pane label="课程评价" name="third">
          <div id="Course_cm_form">
            <div id="Course_form_tital">
              <span>课程类型</span>
              <span>课程名称</span>
              <span>支撑程度</span>
            </div>
            <div id="Course_form_component">
              <ul v-for="(tecour,index) in tecour" :key="index">
                <div class="leftpart">
                  <span>{{tecour.disname}}</span>
                </div>
                <li v-for="(i,index1) in tecour.coursename" :key="index1">
                  <div class="rightpart">
                    <div class="subject">
                      <div>
                        {{i.cours}}
                      </div>
                    </div>
                    <div class="selectlist">
                      <el-radio-group v-model="i.assname">
                        <el-radio class="selectRadio" label="非常高">非常高</el-radio>
                        <el-radio class="selectRadio" label="较高">较高</el-radio>
                        <el-radio class="selectRadio" label="一般">一般</el-radio>
                        <el-radio class="selectRadio" label="较低">较低</el-radio>
                        <el-radio class="selectRadio" label="非常低">非常低</el-radio>
                      </el-radio-group>
                    </div>
                  </div>
                </li>
              </ul>
            </div>
          </div>
        </el-tab-pane>
        <el-tab-pane label="建议" name="fourth">
          <div class="suggestion">
            <h1>四、建议</h1>
            <el-input type="textarea" :rows="10" placeholder="请输入内容" id="textarea" v-model="suggest.sugname"
                      maxlength="500"></el-input>
          </div>
        </el-tab-pane>
      </el-tabs>
    </div>
  </el-container>

总结

通过这一次的考核,基本熟知了element-ui的布局容器的使用方法,以及别的组件的使用技巧,重点是明白了自己的不足,由于没有学会axios的封装以及封装后的接口正确的使用方式,导致后期对接口的维护比较繁琐,每一次的重建都要自己主动去到每一个页面修改代码,而不是直接修改接口文件的代码,此外,和后端的沟通十分重要,在前期有着合理的项目安排以及设计,对后期的实现减少遇阻的可能性。

值得注意

前后端交互的过程免不了遇到跨域请求的问题,后端只需要再加上一个注解,允许跨域请求,前端就可以正常访问了,如果出现400之类的报错,请检查自己的数据结构是否和后端不匹配。

你可能感兴趣的:(vue)