第五篇 用Vue创建前端

关键词

Vue Highcharts ElementUI

GitHub

stockspec_vue
网站入口

思路

根据需求,一共需要三个页面,第一个页面是各种指标的列表,点击对应的指标转到第二个页面,展示相应指标的股票排行表格,点击表格的某一行跳转到第三个页面显示该股票的日K图。
在看了Element-ui的文档之后,看到el-dialog,觉得第三个页面可以直接从第二个页面弹出el-dialog实现,这样第二个页面就无需跳转可以一直展示。

创建project

用vue cli创建project

vue init webpack stockspec
PS D:\codes\vue\stockspec_vue> vue init webpack stockspec

? Project name stockspec
? Project description A Vue.js project
? Author mmdfish 
? Vue build standalone
? Install vue-router? Yes
? Use ESLint to lint your code? No
? Set up unit tests No
? Setup e2e tests with Nightwatch? No
? Should we run `npm install` for you after the project has been created? (recommended) npm

   vue-cli · Generated "stockspec".

实现

  • 引入Element-ui
// stockspec/src/main.js
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'

Vue.use(ElementUI)
  • 引入Highcharts的highstock
// stockspec/src/main.js
import HighchartsVue from 'highcharts-vue'
import Highcharts from 'highcharts'
import stockInit from 'highcharts/modules/stock'

stockInit(Highcharts)
Vue.use(HighchartsVue)
  • 页面设置
    根据需求,创建两个页面,stockspec/src/component/stock.vue和stockspec/src/component/stockspec.vue。
    加入路由,在stockspec/src/router/index.js中加入这两个页面的定义。
import stock from '@/components/stock'
export default new Router({
  routes: [
    {
      path: '/',
      name: 'HelloWorld',
      component: HelloWorld
    },
   {
      path: '/stock',
      name: 'Stock',
      component: stock
    },
    {
      path: '/stockspec',
      name: 'StockSpec',
      component: stockspec
    },
  ]
})
  • 指标列表入口
    stockspec/src/component/stock.vue
    用element-ui的layout 做最简单的布局,vue中一个template只能有一个组件,如果有多个组件会报错。解决方法是把这些el-row放在一个div中。stock里加入跳转stockspec的路由,用router-link做路由跳转,参数参考上一篇Django的request的参数。
    这里一定要注意 router-link的用法,和path配对的是query,刷新页面数据不会丢失。和name配对的是params,刷新页面参数会丢失。具体看跳转时候现实的网址就能发现不同。
<template>
  <div>
<el-row :gutter="10">
    <el-col :span="4">贝塔系数(年)</el-col>
    <el-col :span="4"><router-link :to="{ path: 'stockspec', query: {specname: 'beta_y', order:'asc', abs:true}}">最小</router-link></el-col>
    <el-col :span="4"><router-link :to="{ path: 'stockspec', query: {specname: 'beta_y', order:'desc', abs:true}}">最大</router-link></el-col>
</el-row>
<el-row>
...
<el-row>
</div>
</template>
  • 指标排行页面
    stockspec/src/component/stockspec.vue
    这个页面内容比较多,有些后续再写。
  1. 获取路由参数
getData() {
      this.specname = this.$route.query.specname;
      this.order = this.$route.query.order;
      this.abs = false;
      if(this.$route.query.abs) {
        this.abs = this.$route.query.abs
      }
}
  1. 从后端拿到数据
    通过第一步拿到的路由参数,从Django后端获得json数据,就是response.data,这里用axios来从后端获取数据。第四篇里说到返回的json数据orient是table,那就用response.data.data获得其中的data部分。这里就不想细说了,多用console.log在chrome里debug就很容易看到。
import axios from "axios";
created() {
    this.getData();
    axios
      .get("http://127.0.0.1:8000/stockserver/spec/", {
        params: {
          specname: this.specname,
          order: this.order,
          abs: this.abs
        }
      })
      .then(response => {
        this.stockSpecData = response.data.data;
      });
}
  1. 用el-table展示数据
    因为el-table里有很多细节的地方,后续会对el-table在本项目的用法详细介绍。el-table传入数据为 stockSpecData,就是从后端拿到的json数据。点击每一行调用row-click的displayDetails方法弹出dialog显示该股票的日K数据,点击每一行的name列打开新浪股票的对应股票页面可以看更多的数据。
<el-table :data="stockSpecData" :header-cell-style="{background:'#eef1f6',color:'#606266'}" :height="tableHeight" style="width: 100%" @row-click="displayDetails">
    <el-table-column prop="code" label="代码" fixed :show-overflow-tooltip="true"></el-table-column>
    <el-table-column prop="name" label="名字" fixed :show-overflow-tooltip="true">
      <template slot-scope="scope">
        <a :href="getLink(scope.row.code)" target="_blank" class="buttonText"><div style="font-size:16">{{scope.row.name}}</div></a>
      </template>
    </el-table-column>
    <el-table-column
      v-for="(item,key) in titleData"
      :key="key"
      :prop="item.value"
      :label="item.name"
    >
      <template slot-scope="scope">
        <span>{{getDisplayValueScope(scope)}}</span>
      </template>
    </el-table-column>
  </el-table>

el-table的row-click调用的方法默认有row,column,event参数方便在方法里使用,具体内容可以用console.log打印出来看。displayDetails方法通过选择的股票代码去后端获取股票日K数据,然后把el-dialog的visible.sync设置为 true。

displayDetails(row, column, event) {
      if(column.label == "名字") {
        return
      }
      this.selectcode = row.code
      this.selectname = row.name

      axios
      .get("http://127.0.0.1:8000/stockserver/dayk/", {
        params: {
          code: this.selectcode,
        }
      })
      .then(response => {
        this.dayk = response.data.data;
        this.candleprops = {
          'code':this.selectcode,
          'name':this.selectname,
          'kdata': this.dayk,
          'reladay': this.selectreladayk,
        };
        this.dialogTableVisible = true
      });
    },
  1. 显示el-dialog
    el-dialog 的visible.sync为true时,会弹出。在el-dialog里嵌入candlechart显示日K数据。candlechart调用的就是highcharts的highstock,后续再介绍。
    customSize设置dialog相对于页面的比例大小。
    另外两个el-dialog的style是给dialog加上滚动条。
<el-dialog :title="selectname + '(' + selectcode + ')'" :visible.sync="dialogTableVisible" custom-class="customSize">
      <div v-if="dialogTableVisible"><candlechart :props1="candleprops"></candlechart></div>
</el-dialog>
<style>
  .customSize{
    width:70%;
    height:70%;
  }
//实现内部滚动条
 .el-dialog {
    display: flex;
    flex-direction: column;
  }
  .el-dialog__body {
    overflow: auto;
  }
</style>
  1. 其他
    stockspec/src/component/common.vue
    一些通用的方法和常量,包括中英文的Dictionary spec_dict,显示数据的精度getDisplayValueScope和getDisplayValue,用export default导出
<script type="text/javascript">
    const spec_dict = ...
    function getDisplayValueScope(scope) {
      var name = scope.column.property
      var value = scope.row[scope.column.property]
      return getDisplayValue(name,value)
    }

    function getDisplayValue(name,value) {
      ...
    }
    export default {
        spec_dict,
        getDisplayValueScope,
        getDisplayValue
    }
</script>

在其他vue中调用

import common from './common.vue'
common.getDisplayValue(name,value)
let specdict = common.spec_dict

关于el-table和highcharts在本项目的应用,后续会再写。

运行

如果前两个python项目都正常运行的话,从github clone之后应该是能直接看到运行效果的。

cd stockspec
# install dependencies
npm install
# serve with hot reload at localhost:8080
npm run dev
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350