決算パーティーで盛り上げるため、社員の1人をランダムに選ぶルーレットがほしいと言われ、
このようなものを作りました。
http://animated-random-user-picker.s3-website-ap-northeast-1.amazonaws.com/
レポジトリはhttps://github.com/umihico/animated-random-user-pickerです。
以下の仕様をこちらで決め、2時間で制作しました。
- Slackプロフィールアイコンを全てダウンロードして活用する (40分)
- 即デプロイしたいのS3でホスト、HTTPS無しOK (10分)
- 最小限のhtmlファイル1つにし、vueをCDNから使わせてもらう (10分)
- vuetifyとlodashも使いたくなったのでCDNから取る (10分)
- ルーレット実装 (50分)
S3でのホストはこちらを参考にさせて頂きました。
vueをhtmlファイル単体で動かすのはこちらを参考にさせて頂きました。
デモ用の画像はイラストやからお借りしています。
皆様ありがとうございます。
Slackから全員のプロフィール画像をとるのは別記事にしました。
CDNからlodash, vue, vuetifyを使っています。
index.html
<html>
<head>
<link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/@mdi/font@5.x/css/materialdesignicons.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.min.css" rel="stylesheet">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, minimal-ui">
<meta charset="UTF-8">
</head>
<body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.14.1/lodash.min.js"></script>
<div id="app">
<v-container>
<p><a target="_blank" href="https://github.com/umihico/animated-random-user-picker">Github</a></p>
<p><a target="_blank" href="https://qiita.com/umihico/items/7878dbaca57b21d2bfc0">Qiita</a></p>
<v-btn @click="shuffle">シャッフル!</v-btn>
<v-btn @click="run">
<template v-if="moving">ストップ</template>
<template v-else>スタート</template>
!
</v-btn>
<v-row>
<v-col xl="3" lg="3" md="4" sm="3" cols="12">
<v-img max-height="200" contain v-if="picked" :src="picked"></v-img>
</v-col>
<v-col xl="9" lg="9" md="8" sm="9" cols="12">
<v-row>
<v-col xl="1" lg="1" md="2" sm="2" cols="2" v-for="path in paths" v-bind:key="path">
<v-img contain :src="path" max-height="50"
:gradient="(picked==path) ? 'to top right, rgba(100,115,201,.60), rgba(100,115,201,.60)' : ''"
>
<div class="fill-height bottom-gradient"></div>
</v-img>
</v-col>
</v-row>
</v-col>
</v-row>
<div style="max-width:500px">
</div>
</v-container>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.js"></script>
<script>
new Vue({
el: "#app",
data: {
pos: 0,
picked: null,
moving: false,
paths: ["img/nigaoe_adam_smith.png",
"img/nigaoe_amakusa_shirou.png",
// 省略
"img/nigaoe_yamaoka_tessyuu.png",
]
},
methods: {
shuffle() {
this.paths = _.shuffle(this.paths)
},
run() {
this.moving = !this.moving
}
},
mounted() {
setInterval(function () {
if (this.moving) {
this.pos += 1;
if (!this.paths[this.pos]) {
this.pos = 0
}
this.picked = this.paths[this.pos]
}
}.bind(this), 3)
}
})
</script>
</body>
</html>
S3ホストのためにファイルを公開しないといけないので、ポリシーファイルを作成します。
policy.json
{
"Version": "2012-10-17",
"Id": "PublicRead",
"Statement": [
{
"Sid": "ReadAccess",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::animated-random-user-picker/*"
}
]
}
ファイルの用意ができれば、以下のコマンドでデプロイできます。
$ aws s3 mb s3://animated-random-user-picker # バケット作成
$ aws s3 website s3://animated-random-user-picker --index-document index.html # 静的ウェブサイトとしてホスト
$ aws s3api put-bucket-policy --bucket animated-random-user-picker --policy file://policy.json # only once # ポリシーファイル適用
$ aws s3 sync . s3://animated-random-user-picker --exclude=.git/* # バケットにカレントディレクトリと同期させる
その他参考