20 changed files with 20936 additions and 1 deletions
@ -1,2 +1,24 @@
@@ -1,2 +1,24 @@
|
||||
# loveLetterFrontend |
||||
# frontend |
||||
|
||||
## Project setup |
||||
``` |
||||
npm install |
||||
``` |
||||
|
||||
### Compiles and hot-reloads for development |
||||
``` |
||||
npm run serve |
||||
``` |
||||
|
||||
### Compiles and minifies for production |
||||
``` |
||||
npm run build |
||||
``` |
||||
|
||||
### Lints and fixes files |
||||
``` |
||||
npm run lint |
||||
``` |
||||
|
||||
### Customize configuration |
||||
See [Configuration Reference](https://cli.vuejs.org/config/). |
||||
|
||||
@ -0,0 +1,5 @@
@@ -0,0 +1,5 @@
|
||||
module.exports = { |
||||
presets: [ |
||||
'@vue/cli-plugin-babel/preset' |
||||
] |
||||
} |
||||
@ -0,0 +1,19 @@
@@ -0,0 +1,19 @@
|
||||
{ |
||||
"compilerOptions": { |
||||
"target": "es5", |
||||
"module": "esnext", |
||||
"baseUrl": "./", |
||||
"moduleResolution": "node", |
||||
"paths": { |
||||
"@/*": [ |
||||
"src/*" |
||||
] |
||||
}, |
||||
"lib": [ |
||||
"esnext", |
||||
"dom", |
||||
"dom.iterable", |
||||
"scripthost" |
||||
] |
||||
} |
||||
} |
||||
@ -0,0 +1,46 @@
@@ -0,0 +1,46 @@
|
||||
{ |
||||
"name": "frontend", |
||||
"version": "0.1.0", |
||||
"private": true, |
||||
"scripts": { |
||||
"serve": "vue-cli-service serve", |
||||
"build": "vue-cli-service build", |
||||
"lint": "vue-cli-service lint" |
||||
}, |
||||
"dependencies": { |
||||
"core-js": "^3.8.3", |
||||
"socket.io": "^4.4.1", |
||||
"socket.io-client": "^4.4.1", |
||||
"vue": "^3.2.13", |
||||
"vue-router": "^4.0.13" |
||||
}, |
||||
"devDependencies": { |
||||
"@babel/core": "^7.12.16", |
||||
"@babel/eslint-parser": "^7.12.16", |
||||
"@vue/cli-plugin-babel": "~5.0.0", |
||||
"@vue/cli-plugin-eslint": "~5.0.0", |
||||
"@vue/cli-service": "~5.0.0", |
||||
"eslint": "^7.32.0", |
||||
"eslint-plugin-vue": "^8.0.3" |
||||
}, |
||||
"eslintConfig": { |
||||
"root": true, |
||||
"env": { |
||||
"node": true |
||||
}, |
||||
"extends": [ |
||||
"plugin:vue/vue3-essential", |
||||
"eslint:recommended" |
||||
], |
||||
"parserOptions": { |
||||
"parser": "@babel/eslint-parser" |
||||
}, |
||||
"rules": {} |
||||
}, |
||||
"browserslist": [ |
||||
"> 1%", |
||||
"last 2 versions", |
||||
"not dead", |
||||
"not ie 11" |
||||
] |
||||
} |
||||
|
After Width: | Height: | Size: 4.2 KiB |
@ -0,0 +1,20 @@
@@ -0,0 +1,20 @@
|
||||
<!DOCTYPE html> |
||||
<html lang=""> |
||||
<head> |
||||
<meta charset="utf-8"> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0"> |
||||
<link rel="icon" href="<%= BASE_URL %>favicon.ico"> |
||||
<!-- <link rel="stylesheet" href="https://unpkg.com/primitive-ui/dist/css/main.css" /> --> |
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet"> |
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script> |
||||
<title><%= htmlWebpackPlugin.options.title %></title> |
||||
</head> |
||||
<body> |
||||
<noscript> |
||||
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong> |
||||
</noscript> |
||||
<div id="app"></div> |
||||
<!-- built files will be auto injected --> |
||||
</body> |
||||
</html> |
||||
@ -0,0 +1,12 @@
@@ -0,0 +1,12 @@
|
||||
VUEjs with socket.io |
||||
https://www.digitalocean.com/community/tutorials/vuejs-vue-socketio |
||||
|
||||
Setting Vue to run over https |
||||
https://stackoverflow.com/questions/45807049/how-to-run-vue-js-dev-serve-with-https |
||||
|
||||
Using socket.io with vue |
||||
https://lukashermann.dev/writing/socketio-with-vue-and-vuex/ |
||||
|
||||
#Guide to do multiplayer game with Vue and Socket.io |
||||
https://blog.logrocket.com/how-to-create-a-2d-multiplayer-game-with-vue-js-and-socket-io-174ef2818e65/ |
||||
|
||||
@ -0,0 +1,48 @@
@@ -0,0 +1,48 @@
|
||||
<template> |
||||
<div id="app"> |
||||
<game-lobby v-bind:players="players"/> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
import io from "socket.io-client" |
||||
import GameLobby from '@/components/GameLobby.vue' |
||||
import { socketUrl } from './config/appConfig' |
||||
|
||||
export default { |
||||
name: 'app', |
||||
components: { |
||||
GameLobby |
||||
}, |
||||
data() { |
||||
return { |
||||
socket: {}, |
||||
players: [] |
||||
} |
||||
}, |
||||
created() { |
||||
// this.socket = io("wss://localhost:9000") |
||||
// this.socket = io("https://localhost:9000") |
||||
// this.socket = io("https://192.168.50.149:9000") |
||||
// this.socket = io("wss://192.168.50.149:9000") |
||||
this.socket = io(socketUrl) |
||||
}, |
||||
mounted () { |
||||
this.socket.on("connect", () => { |
||||
console.log(`app.socket.id: ${this.socket.id}`) |
||||
}) |
||||
this.socket.on("msg", (data) => { |
||||
console.log(data) |
||||
}) |
||||
this.socket.on('playersUpdate', (data) => { |
||||
// console.log(`playersUpdate:`) |
||||
let playersUpdate = data |
||||
// console.log(playersUpdate) |
||||
this.players = playersUpdate |
||||
}) |
||||
} |
||||
} |
||||
</script> |
||||
|
||||
<style> |
||||
</style> |
||||
|
After Width: | Height: | Size: 6.7 KiB |
@ -0,0 +1,80 @@
@@ -0,0 +1,80 @@
|
||||
<template> |
||||
<div id="game-lobby"> |
||||
<p>Love Letter</p> |
||||
<form> |
||||
<label>pick a username</label> |
||||
<input type="text"> |
||||
</form> |
||||
<table-selection v-bind:tables="tables" /> |
||||
<players-list v-bind:players="players"/> |
||||
<lobby-admin v-if="showLobbyAdmin" /> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
import TableSelection from '@/components/TableSelection.vue' |
||||
import LobbyAdmin from '@/components/LobbyAdmin.vue' |
||||
import PlayersList from '@/components/PlayersList.vue' |
||||
export default { |
||||
name: 'game-lobby', |
||||
components: { |
||||
TableSelection, |
||||
PlayersList, |
||||
LobbyAdmin, |
||||
}, |
||||
data () { |
||||
return { |
||||
showLobbyAdmin: true, |
||||
tables: [ |
||||
{ |
||||
number: 1, |
||||
playerCount: "3/4", |
||||
playerListString: "Bob, Joe, Fred", |
||||
inviteCode: "http://banana.com", |
||||
gameId: "AAAAA11111" |
||||
}, |
||||
{ |
||||
number: 2, |
||||
playerCount: "3/4", |
||||
playerListString: "Jon, Jim, Bill", |
||||
inviteCode: "http://banana.com", |
||||
gameId: "BBBBB22222" |
||||
}, |
||||
{ |
||||
number: 3, |
||||
playerCount: "1/4", |
||||
playerListString: "Tim", |
||||
inviteCode: "http://banana.com", |
||||
gameId: "CCCCC33333" |
||||
} |
||||
], |
||||
// players: [ |
||||
// { |
||||
// id: 1, |
||||
// username: 'username1' |
||||
// }, |
||||
// { |
||||
// id: 2, |
||||
// username: 'username2' |
||||
// } |
||||
// ] |
||||
} |
||||
}, |
||||
methods: {}, |
||||
computed: {}, |
||||
props: { |
||||
players: Array |
||||
} |
||||
} |
||||
</script> |
||||
|
||||
<style scoped> |
||||
#game-lobby { |
||||
background-color: rgb(255, 203, 92); |
||||
width: 100vw; |
||||
height: 100vh; |
||||
} |
||||
.input { |
||||
background: white; |
||||
} |
||||
</style> |
||||
@ -0,0 +1,45 @@
@@ -0,0 +1,45 @@
|
||||
<template> |
||||
<div id="employee-form"> |
||||
<form @submit.prevent="handleSubmit"> |
||||
<label>Employee name</label> |
||||
<input v-model="employee.name" type="text" /> |
||||
<label>Employee email</label> |
||||
<input v-model="employee.email" type="text" /> |
||||
<button>Add Employee</button> |
||||
</form> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
export default { |
||||
name: 'employee-form', |
||||
data() { |
||||
return { |
||||
employee: { |
||||
name: '', |
||||
email: '' |
||||
} |
||||
} |
||||
}, |
||||
methods: { |
||||
handleSubmit() { |
||||
console.log('testing handleSubmit') |
||||
this.$emit('add:employee', this.employee) |
||||
} |
||||
}, |
||||
computed: { |
||||
invalidName() { |
||||
return this.employee.name === '' |
||||
}, |
||||
invalidEmail() { |
||||
return this.employee.email === '' |
||||
} |
||||
} |
||||
} |
||||
</script> |
||||
|
||||
<style scoped> |
||||
form { |
||||
margin-bottom: 2rem; |
||||
} |
||||
</style> |
||||
@ -0,0 +1,29 @@
@@ -0,0 +1,29 @@
|
||||
<template> |
||||
<div id="employee-table"> |
||||
<table> |
||||
<thead> |
||||
<tr> |
||||
<th>Employee name</th> |
||||
<th>Employee email</th> |
||||
</tr> |
||||
</thead> |
||||
<tbody> |
||||
<tr v-for="employee in employees" :key="employee.id"> |
||||
<td>{{ employee.name }}</td> |
||||
<td>{{ employee.email }}</td> |
||||
</tr> |
||||
</tbody> |
||||
</table> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
export default { |
||||
name: 'employee-table', |
||||
props: { |
||||
employees: Array |
||||
} |
||||
} |
||||
</script> |
||||
|
||||
<style scoped></style> |
||||
@ -0,0 +1,58 @@
@@ -0,0 +1,58 @@
|
||||
<template> |
||||
<div class="hello"> |
||||
<h1>{{ msg }}</h1> |
||||
<p> |
||||
For a guide and recipes on how to configure / customize this project,<br> |
||||
check out the |
||||
<a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>. |
||||
</p> |
||||
<h3>Installed CLI Plugins</h3> |
||||
<ul> |
||||
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li> |
||||
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint" target="_blank" rel="noopener">eslint</a></li> |
||||
</ul> |
||||
<h3>Essential Links</h3> |
||||
<ul> |
||||
<li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li> |
||||
<li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li> |
||||
<li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li> |
||||
<li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li> |
||||
<li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li> |
||||
</ul> |
||||
<h3>Ecosystem</h3> |
||||
<ul> |
||||
<li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li> |
||||
<li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li> |
||||
<li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a></li> |
||||
<li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li> |
||||
<li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li> |
||||
</ul> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
export default { |
||||
name: 'HelloWorld', |
||||
props: { |
||||
msg: String |
||||
} |
||||
} |
||||
</script> |
||||
|
||||
<!-- Add "scoped" attribute to limit CSS to this component only --> |
||||
<style scoped> |
||||
h3 { |
||||
margin: 40px 0 0; |
||||
} |
||||
ul { |
||||
list-style-type: none; |
||||
padding: 0; |
||||
} |
||||
li { |
||||
display: inline-block; |
||||
margin: 0 10px; |
||||
} |
||||
a { |
||||
color: #42b983; |
||||
} |
||||
</style> |
||||
@ -0,0 +1,25 @@
@@ -0,0 +1,25 @@
|
||||
<template> |
||||
<div id="lobby-admin"> |
||||
<table> |
||||
|
||||
</table> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
export default { |
||||
name: 'lobby-admin', |
||||
} |
||||
</script> |
||||
|
||||
<style scoped> |
||||
#lobby-admin { |
||||
border: 4px solid rgb(0, 255, 221); |
||||
height: 300px; |
||||
width: 100vw; |
||||
background-color: black; |
||||
color: white; |
||||
position: absolute; |
||||
bottom: 0; |
||||
} |
||||
</style> |
||||
@ -0,0 +1,34 @@
@@ -0,0 +1,34 @@
|
||||
<template> |
||||
<div id="players-List"> |
||||
<p>Love Letter</p> |
||||
<table> |
||||
<thead> |
||||
<tr> |
||||
<th>Online Players</th> |
||||
<th>Connected</th> |
||||
</tr> |
||||
</thead> |
||||
<tbody> |
||||
<tr v-for="player in players" :key="player.id"> |
||||
<td>{{ player.username }}</td> |
||||
<td>{{ player.connected }}</td> |
||||
</tr> |
||||
</tbody> |
||||
</table> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
export default { |
||||
name: 'players-List', |
||||
props: { |
||||
players: Array |
||||
} |
||||
} |
||||
</script> |
||||
|
||||
<style scoped> |
||||
table, th, td { |
||||
border: 1px solid black; |
||||
} |
||||
</style> |
||||
@ -0,0 +1,41 @@
@@ -0,0 +1,41 @@
|
||||
<template> |
||||
<div id="table-selection"> |
||||
<table> |
||||
<thead> |
||||
<tr> |
||||
<th>#</th> |
||||
<th>playerCount</th> |
||||
<th>players</th> |
||||
<th>inviteCode</th> |
||||
<th>gameId</th> |
||||
</tr> |
||||
</thead> |
||||
<tbody> |
||||
<tr v-for="table in tables" :key="table.number"> |
||||
<td>{{ table.number }}</td> |
||||
<td>{{ table.playerCount }}</td> |
||||
<td>{{ table.playerListString }}</td> |
||||
<td>{{ table.inviteCode }}</td> |
||||
<td>{{ table.gameId }}</td> |
||||
</tr> |
||||
</tbody> |
||||
</table> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
export default { |
||||
name: 'table-selection', |
||||
props: { |
||||
tables: Array |
||||
} |
||||
} |
||||
</script> |
||||
|
||||
<style scoped> |
||||
table, th, td { |
||||
border: 1px solid black; |
||||
background-color: gray; |
||||
color: white; |
||||
} |
||||
</style> |
||||
@ -0,0 +1,4 @@
@@ -0,0 +1,4 @@
|
||||
const socketUrl = "wss://localhost:9000" |
||||
module.exports = { |
||||
socketUrl: socketUrl |
||||
} |
||||
@ -0,0 +1,9 @@
@@ -0,0 +1,9 @@
|
||||
// main.js
|
||||
import { createApp } from 'vue' |
||||
import App from './App.vue' |
||||
|
||||
createApp(App).mount('#app') |
||||
|
||||
// socketio
|
||||
// import socket from './socket'
|
||||
// App.prototype.$socket = socket
|
||||
Loading…
Reference in new issue