2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

勉強する気のない子供をどれだけ本気で勉強させるか!TODO webアプリ自作しました

Last updated at Posted at 2020-12-13

#npmを利用して勉強管理webアプリを自作
完成品は
image.png
日々の勉強ルーティンを2つのTODOリストで管理します。
やる事 ⇒ 完了
へ移動するだけの単純構造です。
1日が終わったら完了 ⇒ やる事へ戻し、優先度の高い教科から順番に並べておく。

これを簡単に実装する為に、npmのパッケージを利用しました!

#npmサイトで調べたdraggableパッケージを利用

npmサイト
image.png

実装するまで少し躓いたので、npmまとめサイトの使い方を記事に書きました
npmパッケージ検索サイトからの使い方を初心者が解説してみた!

#カスタマイズ
今回使いたいのは、リスト間の移動が出来る【two-list】
https://github.com/SortableJS/Vue.Draggable/blob/master/example/components/two-lists.vue
image.png

#gitからコードをcloneします
View codeをクリックします。
image.png

コードのページへ飛んでしまうので、階層を移動します
image.png

image.png

git clone https://github.com/SortableJS/Vue.Draggable.git

Vue.Draggableフォルダが追加されていました!
この後の手順はgithubにコマンドの解説等なかったので、
npmパッケージ検索サイトからの使い方を初心者が解説してみた!
でサンプルを動かした時の手順に沿って進んでみました。

image.png

Vue.Draggableフォルダへ階層を移動します。

cd Vue.Draggable

必要なnpmの他のパッケージをインストール

npm install

node_moduleフォルダに必要パッケージが全てインストールされました。

image.png

ブラウザで実装出来るように次のコマンドをタイプします

npm run serve

デモサイト、そのまま立ち上がりました。
必要な個所だけ抜き出していこうと思います。
image.png

#リスト間でタスクの移動が可能
example > components の中に入っている
two-list.vue

<template>
  <div class="row">
    <div class="col-3">
      <h3>Draggable 1</h3>
      <draggable class="list-group" :list="list1" group="people" @change="log">
        <div
          class="list-group-item"
          v-for="(element, index) in list1"
          :key="element.name"
        >
          {{ element.name }} {{ index }}
        </div>
      </draggable>
    </div>

    <div class="col-3">
      <h3>Draggable 2</h3>
      <draggable class="list-group" :list="list2" group="people" @change="log">
        <div
          class="list-group-item"
          v-for="(element, index) in list2"
          :key="element.name"
        >
          {{ element.name }} {{ index }}
        </div>
      </draggable>
    </div>

    <rawDisplayer class="col-3" :value="list1" title="List 1" />

    <rawDisplayer class="col-3" :value="list2" title="List 2" />
  </div>
</template>
<script>
import draggable from "@/vuedraggable";

export default {
  name: "two-lists",
  display: "Two Lists",
  order: 1,
  components: {
    draggable
  },
  data() {
    return {
      list1: [
        { name: "John", id: 1 },
        { name: "Joao", id: 2 },
        { name: "Jean", id: 3 },
        { name: "Gerard", id: 4 }
      ],
      list2: [
        { name: "Juan", id: 5 },
        { name: "Edgard", id: 6 },
        { name: "Johnson", id: 7 }
      ]
    };
  },
  methods: {
    add: function() {
      this.list.push({ name: "Juan" });
    },
    replace: function() {
      this.list = [{ name: "Edgard" }];
    },
    clone: function(el) {
      return {
        name: el.name + " cloned"
      };
    },
    log: function(evt) {
      window.console.log(evt);
    }
  }
};
</script>

#カスタマイズ
two-list.vueは以下のように

<template>
<div class="container">
  <div class="row">
    <div class="col-6">
      <h3 align="center">やること</h3>
      <draggable class="list-group" :list="list1" group="people" @change="log">
        <div
          class="list-group-item"
          v-for="(element, index) in list1"
          :key="element.name"
        >
          {{ element.name }} {{ index }}
        </div>
      </draggable>
    </div>

    <div class="col-6">
      <h3 alig="center">完了</h3>
      <draggable class="list-group" :list="list2" group="people" @change="log">
        <div
          class="list-group-item"
          v-for="(element, index) in list2"
          :key="element.name"
        >
          {{ element.name }} {{ index }}
        </div>
      </draggable>
    </div>
</div>
  </div>
</template>
<script>
import draggable from "vuedraggable";
export default {
  name: "two-lists",
  display: "タスクシート",
  order: 1,
  components: {
    draggable
  },
  data() {
    return {
      list1: [
        { name: "算数", id: 1 },
        { name: "国語", id: 2 },
        { name: "おやつ", id: 3 },
        { name: "理科", id: 4 },
        { name: "社会", id: 5 },
        { name: "休憩", id: 6 },
      ],
      list2: [
        { name: "終わったものを移動してね", id: 7 },
      ]
    };
  },
  methods: {
    add: function() {
      this.list.push({ name: "Juan" });
    },
    replace: function() {
      this.list = [{ name: "Edgard" }];
    },
    clone: function(el) {
      return {
        name: el.name + " cloned"
      };
    },
    log: function(evt) {
      window.console.log(evt);
    }
  }
};
</script>

ベースとなるvueファイルもカスタマイズしました。
App.vue

<template>
  <div id="app">
    <div class="jumbotron logo">
      <img src="./assets/favicon.png">
    </div>
    <hello></hello>
  </div>
</template>

<script>
import Hello from "./components/Hello";

export default {
  name: "app",
  components: {
    Hello
  }
};
</script>

<style>
#app {
  font-family: "Avenir", Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  color: #2c3e50;
}

#app .logo {
  text-align: center;
  background: #fff;
}
#app .logo img{
  height: 100px;
}
#app .main-container {
  padding-top: 40px;
}

.container{
  margin: 0 auto;
  width: 100%;
  max-width: 980px;
  background: #eee;
}
</style>

publid > index.html
こちらのファイルにhead部分が入っていました。

#タスク管理webアプリ完成
image.png

#buildします

【ctrl + C】でサーバーを終了します。次にbuild

npm run build

docsフォルダの中に全て入っているので、この中の全ファイルをサーバーにアップして完成です。

image.png

私の場合、以下のURLへアップしました。
完成品見てみる?

#まとめ
ここまで完成したら、せっかくなのでLINEにつなげてみようと思ったのですが
LIFFで表示 ⇒ プロフィールを自動出力で躓いてしまいました。。。
残念。

npm なかなか奥が深い!

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?