2019/06/19
唯一のこだわりは、SPA(Single Page Application)として開発すること。登録や変更などで画面遷移しているのはすごく煩わしいので、自分のやりたいこと(wants)を1画面にて簡単に追加・変更等の管理ができるようにしたい。
簡単に言ってしまうと、Todoリストの拡張版。ただ、チェックボックスがあるような、Todoリストではなく、下記のような機能をつける。
<フロントエンド>
・Vue.js / Vuex
<バックエンド>
・Python3.6 / Django2.0 / REST Framework
・MySQL
勉強のため、下記の2つで構築・公開
①レンタルサーバー
フロントとバックを違う環境で構築し、APIを呼ぶ
- フロント:レンタルサーバー(Vue.js)
- バックエンド:Heroku(Python + Django REST Framework + MySQL)
※Herokuは一定時間アクセスがないとスリープになるので、少し待つ場合あり
②AWS ※ただしhttps非対応
Vue.jsも、Django REST FrameworkによるAPI構築もはじめてやりましたので、勉強のために下記を実施。
Vue.js / APIの呼出しについて
Python Djangoについて
Django REST Framework / Vue.js関連の参考URL
【参考URL】
・ Python Django チュートリアルまとめ
・ Django REST Frameworkを使って爆速でAPIを実装する
・ Django + Vue.js な開発環境を作ろう
・ Django REST framework with Vue.js
・ Django REST Frameworkでユーザ認証周りのAPIを作る
・ Django REST framework カスタマイズ方法 - チュートリアルの補足
・ サーバーサイドJavaエンジニアがVue.jsの基本を学習したときのメモ
Vue.jsでドラッグ&ドロップするなら「Vue.Draggable」がおすすめらしい。
【インストール】 npm i -S vuedraggable
【参照URL】
・https://github.com/SortableJS/Vue.Draggable
・https://www.kabanoki.net/1712
・https://qiita.com/kimuray/items/d728fa1635aeacad359f
・http://sagatto.com/20171031_vuejs_sortable
<draggable v-model="wants" :element="'tbody'" :options="{handle:'.handle', animation:150, delay:150}" v-on:end="onEnd">
// ドラック&ドロップ対象のテーブルを囲む
</draggable>
<script>
import draggable from 'vuedraggable'
export default {
name: 'WantsIndex',
components: {
Chart,
draggable
},
data () {
//省略
},
computed: {
//省略
},
created () {
//省略
},
methods: {
// Vue.Draggableの移動が終わったら処理を実施
onEnd () {
var num = 0
// wantslistをループして、更新データを作成する
for (var i = 0; i < this.wants.length; i++) {
num += 1
var addnum = {
id: this.wants[i].id,
displayOrder: num
}
this.upwants.push(addnum)
}
// 更新処理を実施
axios.patch(`${process.env.API_ENDPOINT}wantsupdate/`, {
upwants: this.upwants
})
},
//省略
}
}
</script>
vue-chartjsを使用すると、簡単にグラフが作成できる。
インストール
npm install vue-chartjs chart.js --save
参照URL
https://vue-chartjs.org/guide/#introduction
http://www.sky-limit-future.com/entry/vue_use_chartjs
<template>
<div class="container">
<br>
<div class="card-group">
// 省略
<!-- カード3: 100wantsのドーナツチャート -->
<div class="card">
<Chart :chart-data="datacollection" :height="200"></Chart>
</div>
</div>
<br>
// 省略
</div>
</template>
<script>
import Chart from './Chart.js'
export default {
name: 'WantsIndex',
components: {
Chart,
draggable
},
data () {
//省略
},
computed: {
//省略
},
created () {
//省略
},
methods: {
fetchData () {
// 省略
},
// グラフデータの取得
getChartdata () {
this.datacollection = {
labels: ['未着手', '実施中', '達成'],
datasets: [
{
data: [this.getStatus('nostart'), this.getStatus('doing'), this.getStatus('done')],
backgroundColor: ['lightgreen', 'lightblue', 'lightgray']
}
]
}
},
}
}
</script>
アバターアイコンは、ユーザに登録してもらいDBにて保持する形ではなく、グローバルに認識されるアバターを登録してもらい、それを表示されるようにする(e-mailアドレスでの紐付け)
v-gravatar と指定して、emailアドレスをv-bindする。
【参照URL】
https://ja.gravatar.com
https://www.npmjs.com/package/vue-gravatar
<!-- カード1: ユーザの情報(e-mailアバター、ニックネーム、likes一覧、いいね数、twitterアイコンを表示) -->
<div v-for="user in users" v-bind:key="user.id" class="card">
<div class="card-body">
<span><v-gravatar v-bind:email="user.email" :size="60" class="w-30 rounded" default-img="mm"/>
<strong>{{ user.nickname }}</strong>
</span>
<br><br>
<small><router-link to="/userlikelist"><button class="btn-sm btn-warning">Likes一覧</button></router-link></small>
<small><button v-on:click="download()" class="btn-sm btn-success">List Download</button></small>
</div>
</div>
初学者としては、言語の基礎を学んだあとは、チュートリアルとして、TodoList・掲示板・Twitterのような投稿システムなどを作成してみる、という流れが多いと思いますが、その次のステップとして、それらの機能を拡張していくのが、とてもやりやすいのではないか、と作りながら思いました。
Django REST Framework API の便利さ、Vue.jsのおもしろさ・難しさ、などいろいろ感じることができました。
ログイン機能実装、DB連携、CRUDなどもはじめて実施しましたので、とても苦労しましたが、徐々に機能がついていき、できることが増えていくときなどとても充実感がありました。
今回使用した、Django REST Framework API、Vue.jsなどはじめて触りました。当然、いろいろなところでつまりながらです。仕事以外の時間はすべてこれに費やした感じがします。(約3ヶ月弱くらい)
やっているときは、Qiitaをめちゃくちゃ参考にさせていただきました。結果をQiitaに投稿することが1つの大きな目標になり、その目標も達成することができました。(本投稿)