TUGAS AKHIR
OLEH:
Oleh
MUHAMMAD MIFTAH HASIBUAN
1901052043
2022
LEMBAR PENGESAHAN
oleh :
MUHAMMAD MIFTAH HASIBUAN
190504013
Pembimbing I Pembimbing II
LEMBAR PENGESAHAN
PROJECT PEMBUATAN WEBSITE OFFICE BOOKING
i
SYSTEM MENGGUNAKANFRAMEWORK VUE JS
oleh :
MUHAMMAD MIFTAH HASIBUAN
(1901052043)
Tim Penguji
Ketua Sekretaris
Anggota Anggota
Abstrak
Adapun Vue Js merupakan Framework yang akhir-akhir ini banyak dipakai dalam
mengembangkan project website. Vue Js, adapun kata Vue diambil dari kata vju
seperti view yang mana merupakan Framework nan progresif untuk membangun
antarmuka pengguna Tidak seperti beberapa kerangka kerja monolitik yang lain,
Vue dirancang dari dasar sekali agar dapat diadopsi secara bertahap. Pustaka
intinya difokuskan pada layer tampilan saja, dan sangat mudah untuk
diintegrasikan dengan pustaka yang lain atau dengan proyek yang sudah ada. Di
sisi lain, Vue sangat mampu memberikan dan mendukung Single Page
Application yang canggih ketika dikombinasikan dengan perkakas modern dan
dukungan pustaka.
Kata kunci (key words) : Vue Js, Understanding Everything About VUE JS
iii
KATA PENGANTAR
SWT yang telah memberikan Rahmat dan Karunia-Nya sehingga penulis dapat
menyelesaikan tugas akhir ini tepat pada waktunya. Tugas Akhir ini yang berjudul
Vue Js” ini penulis buat sebagai salah satu syarat untuk memperoleh gelar Ahli
Madya dari Politeknik Negeri Padang khususnya Jurusan Teknik Elektro Program
pembuatan tugas akhir ini. Dalam menyelesaikan laporan ini, penulis banyak
mendapat bantuan, bimbingan dan dorongan berbagai pihak lainya. Oleh sebab itu
3. Bapak Moh Aufal Marom Arrozi selaku mentor program MSIB yang
iv
5. Seluruh pihak yang turut membantu dalam menyelesaikan laporan ini.
Penulis menyadari bahwa laporan ini masih jauh dari kata sempurna. Oleh
karena itu saya mengharapkan kritik dan saran untuk membangun laporan ini lebih
baik ke depannya.
Akhir kata semoga laporan ini memberikan banyak manfaat bagi penulis
v
DAFTAR ISI
LEMBAR PENGESAHAN...........................................................................i
LEMBAR PENGESAHAN..........................................................................ii
Abstrak........................................................................................................iii
KATA PENGANTAR.................................................................................iv
DAFTAR ISI...............................................................................................vi
DAFTAR GAMBAR................................................................................viii
DAFTAR LAMPIRAN.............................................................................viii
BAB I PENDAHULUAN.............................................................................1
1.1 LatarBelakang....................................................................................1
1.2 Rumusan Masalah..............................................................................4
1.3 Batasan Masalah.................................................................................4
1.4 Tujuan................................................................................................4
1.5 Manfaat..............................................................................................5
1.6 Sistematika Penulisan Tugas Akhir...................................................5
BAB II LANDASAN TEORI.......................................................................7
2.1. Office Booking System.......................................................................7
2.2. Website...............................................................................................7
2.3. Hypertext Markup Language (HTML)..............................................8
2.4. Cascading Style Sheet (CSS).............................................................9
2.5. Javascript.........................................................................................10
2.6. Framework Vue Js...........................................................................12
BABIII PERANCANGAN DAN PEMBUATAN WEBSITE...................16
3.1 Minimum Viable Product(MVP)......................................................16
3.2 Flowchart.........................................................................................17
3.3 Tools yang digunakan......................................................................18
3.4 Instalasi Framework Vue Js Pada Visual Studio Code....................19
3.5 Instalasi Package Vue Js Pada Visual Studio Code.........................20
3.6 Kode Pemrograman Pembuatan Tampilan Website........................23
vi
BAB IV IMPLEMENTASI DAN PENGUJIAN.......................................53
4.1. Implentasi Website...........................................................................53
4.2. Pengujian Website............................................................................55
BAB V PENUTUP.....................................................................................60
5.1 Kesimpulan......................................................................................60
5.2 Saran.................................................................................................60
DAFTAR PUSTAKA.................................................................................61
LAMPIRAN...............................................................................................62
vii
DAFTAR GAMBAR
DAFTAR TABEL
Tabel 2. 1. Struktur Dasar HTML...............................................................8
Tabel 4. 1. Hasil Pengujian di Admin.......................................................29
DAFTAR LAMPIRAN
ix
BAB I
PENDAHULUAN
1.1 LatarBelakang
Link and Match tidak saja dengan dunia industri dan dunia kerja tetapi juga
dengan masa depan yang berubah dengan cepat. Perguruan tinggi dituntut
tercipta kultur belajar yang inovatif, tidak mengekang, dan sesuai dengan
perguruan tinggi negeri menjadi PTN berbadan hukum, dan hak belajar tiga
SKS di luar program studi, tiga semester yang di maksud berupa 1 semester
1
sebuah platform akselerasi karir di bidang tech yang membantu talent
potensial untuk menjadi versi terbaik dari diri mereka dan membantu
organisasi mereka.
terhadap programmer pada tahun 2019 – 2020 itu sangat tinggi dan
junior software engineer memiliki peluang karir yang tinggi dalam bidang
programmer. Maka dari itu, salah satu program yang diluncurkan dan bekerja
dengan latar belakang jurusan apapun yang bertujuan bukan hanya untuk
bagi mahasiswa untuk dapat menjadi Front-End yang handal yang bisa
JavaScript, Vue Js, Rest API, dan Database GraphQL. Program Understand
Februari dan berakhir pada bulan Juli. Ada beberapa timeline project di
Academy ini yakni Technical Skills Class, Professional Skills Class, Mini
2
Project, dan Capstone Project. Dalam technical skills class, terdapat 27
bulan. Untuk Professional Skills Class, terdapat kelas malam yang selalu
diadakan pada hari selasa dan kamis selama 2 bulan. Untuk Mini Project,
sebuah projek dari apa yang sudah dipelajari selama 2 bulan. Untuk Capstone
untuk membuat projek besar sebuah website yang topiknya telah ditentukan
dan mobile.
role.
merdeka bisa dijadikan Tugas Akhir. Oleh karena itu, Tugas Akhir ini
Adapun yang menjadi di rumusan masalah dalam tugas akhir ini adalah:
System?
Booking System?
kerja admin.
1.4 Tujuan
Office Booking System dari fitur MVP dengan framework Vue Js.
4
pengujian website Office Booking System.
1.5 Manfaat
Dalam penyusunan dan penulisan Tugas Akhir ini, terdapat aturan dan
sistematika penulisan yang disusun dalam beberapa bab. Setiap bab terdiri
dari sub-sub bagian yang secara garis besar dapat dijelaskan sebagai berikut:
BAB I PENDAHULUAN
System.
6
BAB II
LANDASAN TEORI
untuk manajemen reservasi secara online. Sistem ini memungkinkan bisnis untuk
menerima pemesanan dengan cara yang lebih efektif dan efisien (Basir, Kasim,
& Hassan, 2018). Nama website Office Booking System pada capstone project ini
Bersama" yang mana sesuai tujuan website ini untuk menyediakan layanan
menyediakan solusi kantor cabang bagi enterprise yang memiliki rencana jangka
strategis.
2.2. Website
dapat diakses semua pengguna internet dengan cara mengetikan alamatnya. Hal
(Arief, 2011)
7
Hypertext Markup Language (HTML), yang bisa diakses melalui HTTPS,
server website untuk ditampilkan kepada para User atau pemakai melalui web
standar untuk membuat dan menyusun halaman dan aplikasi web, atau sebuah
standar yang digunakan secara luas untuk menampilkan halaman web. HTML
sendiri secara resmi lahir pada tahun 1989 oleh tim Berners Lee dan
bahasa HTML ini. Hingga kini telah mengembangkan HTML5, sebuah versi
terbaru dari HTML yang mendukung tidak hanya gambar dan teks, namun
juga menu interaktif, audio, video, dan lain sebagainya. (J. Enterpise, 2016)
8
<html> Elemen root dari halaman HTML
<head> Berisi informasi meta tentang dokumen
<title> Menentukan judul untuk dokumen
<body> Berisi konten halaman yang terlihat
content. CSS dapat ditulis untuk mendefinisikan ulang tag-tag HTML ataupun
dengan menambahkan atribut id dan class pada tag HTML (J. Enterpise,
2016).
Ada 3 elemen inti dari CSS yaitu Selector, Property, dan Value. Karena
9
kode CSS digunakan untuk mengubah/memanipulasi tampilan dari tag HTML,
kode CSS dengan tag HTML yang sesuai. Inilah yang dimaksud dengan
Selector dalam CSS. Property CSS adalah jenis style,atau elemen apa yang
akan diubah dari sebuah tag HTML. Value CSS adalah nilai dari property.
warna latar belakang dari sebuah selector, value atau nilainya dapat berupa
red,blue, black, atau white. Untuk lebih jelasnya tentang selector, property,
dan value pada CSS, dapat dilihat pada gambar dibawah ini:
2.5. Javascript
prosesnya berjalan pada sisi pengguna bukan server. Javascript diperlukan pada
10
pengembangan website ketika kita membutuhkan suatu interaksi dari pengguna.
dipahami oleh browser untuk membantu website lebih interaktif dan dinamis.
library seperti:
Bahasa pemrograman yang paling populer untuk browser saat ini adalah
framework yang lebih sesuai dengan kebutuhan mereka. Ada beberapa faktor
11
yang dirancang untuk memisahkan aplikasi web ke dalam unit spesifik untuk
Vue Js adalah salah satu framework atau library dari JavaScript yang
digunakan untuk untuk membuat tampilan (interface) pada website agar tampak
lebih interaktif. Fungsi lain dari Vue JS adalah membuat SPA (Single Page
Controller), maka Vue JS menempati pada posisi View yang berjalan di sisi
Jadi tugas utama dari framework ini adalah mengirim dan menerima data,
juga sangat mudah untuk diintegrasikan dengan library yang lain. Jika
12
dari itu, Vue JS pertama kali dikembangkan pada tahun 2013 oleh Evan You
yang sebelumnya bekerja di Google dengan menggunakan Angular JS. Hal itulah
1. Component
HTML secara custom. Elemen custom ini juga dapat digunakan secara
berulang – ulang.
2. Computed Properties
3. Data Binding
4. Directives
13
digunakan adalah v-if, v-else, v-model, dan lainnya.
5. Event Handling
Fitur yang kelima adalah, event handling atau v-on yang berfungsi
6. Light Weight
menjadi lebih sederhana, akan tetapi masih tetap cepat dan powerful.
7. Routing
8. Template
9. Virtual Dom
14
DOM atau kependekan dari Document Object Model merupakan
konten pada suatu dokumen. Fitur dari Virtual DOM berfungsi untuk
10. Watcher
Fitur yang terakhir adalah watchers, dimana memiliki fungsi untuk
15
BABIII
PERANCANGAN DAN PEMBUATAN WEBSITE
simulasi dengan fitur yang ingin dibuat untuk menguji dan memastikan
MVP ini dibuat oleh pihak pengembang agar mengetahui respon dari
1. Fitur Login
2. CRUD Building
building.
3. CRUD Review
4. Konfirmasi Pembayaran
masuk.
5. Fitur Logout
16
3.2 Flowchart
berikut:
a) Admin Login
18
gambar 3.2 berikut:
3. Node.Js
sebagai berikut:
19
1. Membuka visual studio code, kemudian klik menu ‘terminal’,
gambar berikut.
code maka kita perlu menginstal beberapa package Vue Js pada terminal
visual studio code. Adapun package Vue Js yang harus diinstal yaitu:
20
1. Vue Router
2. Vuex
lebih mudah.
3. JSON Server
dari web server sehingga dapat dibaca pengguna dan Untuk testing
21
data dummy sambil menunggu API dari tim Backend.
4. Axios
request data melalui http dan untuk fetch data API. Untuk
5. Vuetify
oleh Vue dimana terdapat banyak CSS bantuan yang dimiliki dan
Setelah semua package Vue Js terinstal, lihat pada file package.json untuk
beberapa bagian, yang mana satu sama lain saling terkait yang nantinya
yaitu:
23
1) Kode Pemrograman Halaman Admin Login
<template>
<v-form
class="pa-10"
@submit.prevent="submit"
>
<v-card class="mx-12 my-16" flat>
<v-card-text class="text-center
heading-1">
Hello Admin
</v-card-text>
<v-row>
<v-col class="text-left py-0">
<v-checkbox
class="my-0 py-0"
color="#121950"
>
24
<template v-slot:label>
<div class="body-
regular-3">
Simpan Kata Sandi
</div>
</template>
</v-checkbox>
</v-col>
<v-col class="text-right py-0">
<a class="body-regular-3 link-
forger-pass text-decoration-none" href="#">Lupa kata sandi ?</a>
</v-col>
</v-row>
<v-row>
<v-col class="text-center">
<v-btn
color="#606FAA"
dark
class="px-10"
type="submit"
>
Masuk
</v-btn>
</v-col>
</v-row>
</v-card>
</v-form>
</template>
</v-col>
</v-row>
</v-app>
</template>
Gambar 3. 15. source code halaman admin login
<script>
import axios from 'axios'
export default {
name: 'LoginAdmin',
data: () => ({
email: '',
password: '',
showPassword: false,
25
showError: false,
}),
methods: {
async submit() {
const response = await
axios.get(`http://34.207.166.213/user/all?role_id=2`)
console.log(response.data.data)
for (let index = 0; index <
response.data.data.length; index++) {
if (response.data.data[index].email ==
this.email) {
if (response.data.data[index].password ==
this.password) {
index = response.data.data.length-1
this.$router.push({name:"Data
Offices"})
}
}else {
this.showError = true
}
}
}
},
}
</script>
Gambar 3. 16. source code javascript admin login
</v-card-title>
</v-card>
<template>
<v-card width="75%" class="ml-auto mr-10 pt-2">
<v-data-table
:headers="headers"
:items="offices"
:search="search"
:footer-props="{
'items-per-page-options': [10, 15, 20]
}"
26
sort-by="id"
class="elevation-0"
>
<template v-slot:top>
<v-toolbar
flat
>
<v-text-field
v-model="search"
append-icon="mdi-magnify"
label="Search Office"
single-line
hide-details
dense
filled
></v-text-field>
<v-spacer></v-spacer>
<v-spacer></v-spacer>
<v-dialog
v-model="dialog"
max-width="700px"
>
<template v-slot:activator="{ on, attrs }">
<v-btn
color="primary"
dark
class="mb-2"
v-bind="attrs"
v-on="on"
large
>
Add Office
</v-btn>
</template>
<v-card class="pa-4">
<v-card-title>
<span class="text-h5 font-weight-
bold">{{ formTitle }}</span>
</v-card-title>
<v-card-text>
<v-container>
<v-row>
<v-col
cols="12"
>
<v-text-field
v-model="editedItem.name"
label="Office name"
type="text"
></v-text-field>
</v-col>
<v-col
cols="6"
27
>
<v-text-field
v-model="editedItem.latitude"
label="Garis Lintang"
type="text"
></v-text-field>
</v-col>
<v-col
cols="6"
>
<v-text-field
v-model="editedItem.longitude"
label="Garis Bujur"
type="text"
></v-text-field>
</v-col>
<v-col
cols="12"
>
<v-text-field
v-model="editedItem.price"
label="Price"
type="number"
></v-text-field>
</v-col>
<v-col
cols="12"
>
<v-text-field
v-model="editedItem.chair_min"
label="Kursi Minimum"
type="number"
></v-text-field>
</v-col>
<v-col
cols="12"
>
<v-text-field
v-model="editedItem.chair_max"
label="Kursi Maximal"
type="number"
></v-text-field>
</v-col>
<v-col
cols="12"
>
<v-textarea
label="Description"
v-model="editedItem.description"
></v-textarea>
</v-col>
28
</v-row>
</v-container>
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn
color="#121950"
outlined
@click="close"
width="150"
class="mr-4"
>
Cancel
</v-btn>
<v-btn
color="#121950"
dark
@click="save"
width="150"
>
Save
</v-btn>
<v-spacer></v-spacer>
</v-card-actions>
</v-card>
</v-dialog>
<v-dialog v-model="dialogDelete" max-
width="500px">
<v-card>
<v-card-title>
Delete Office
</v-card-title>
<v-card-text class="subtitle-2 mt-4">
Are you sure to delete this office?
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="primary darken-4" width="150"
class="mr-4" outlined @click="closeDelete">Cancel</v-btn>
<v-btn color="primary darken-4" width="150"
dark @click="deleteItemConfirm">OK</v-btn>
<v-spacer></v-spacer>
</v-card-actions>
</v-card>
</v-dialog>
<v-card>
<v-carousel
hide-delimiters
height="350"
>
<v-carousel-item
v-for="photo in editedItem.photo_urls"
:key="photo.id"
29
:src="photo.url"
>
</v-carousel-item>
</v-carousel>
<v-card-text>
<v-row
align="center"
class="mx-0"
>
<v-rating
:value="4.5"
color="amber"
dense
half-increments
readonly
size="14"
></v-rating>
</v-card-text>
<v-card-text>{{ editedItem.description }}</v-
card-text>
<v-divider class="mx-4"></v-divider>
<v-card-text>
Capacity : {{ editedItem.chair_min }} -
{{editedItem.chair_max}}
</v-card-text>
<!-- <v-card-text>
Created by: {{ editedItem.created_by }}
</v-card-text> -->
<v-card-actions>
<v-btn
block
color="primary"
@click="closeView"
>
Close
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</v-toolbar>
</template>
30
<template v-slot:[`item.actions`]="{ item }">
<v-icon
@click="viewDetail(item)"
color="#E59B3A"
>
mdi-information
</v-icon>
<v-icon
class="mx-2"
@click="editItem(item)"
color="primary"
>
mdi-pencil-circle
</v-icon>
<v-icon
@click="deleteItem(item)"
color="red"
>
mdi-delete-circle
</v-icon>
</template>
</v-data-table>
<!-- <div class="mx-10 mb-6" v-for="item in
offices" :key="item.id">
{{ item }}
</div> -->
</v-card>
</template>
</v-app>
</template>
Gambar 3. 17. source code halaman manage office
<script>
import Sidebar from "@/components/SideBarAdmin.vue"
import axios from 'axios'
export default {
name: 'DataOffices',
components: {
Sidebar
},
data: () => ({
search: '',
dialog: false,
dialogDelete: false,
dialogView: false,
headers: [
{
text: 'Id',
align: 'start',
sortable: false,
filterable: false,
value: 'id',
},
31
{ text: 'Name', value: 'name' },
{ text: 'Price', value: 'price' },
{ text: 'Kursi Minimum', value: 'chair_min' },
{ text: 'Kursi Maximal', value: 'chair_max' },
{ text: 'Actions', value: 'actions', sortable: false },
],
offices: [],
editedIndex: -1,
editedItem: {
type_id: 1,
name: '',
description: '',
latitude: '',
longitude: '',
price: 0,
chair_min: '',
chair_max: '',
photo_url:
"https://ik.imagekit.io/yudha/practice_admin/pexels-pixabay-
271816_2b2Y2LzQ1.jpg?ik-sdk-version=javascript-
1.4.3&updatedAt=1656304427380",
id_facilitations: 1,
id_tags: 1
},
defaultItem: {
type_id: 1,
name: '',
description: '',
latitude: '',
longitude: '',
price: 0,
chair_min: '',
chair_max: '',
photo_url:
"https://ik.imagekit.io/yudha/practice_admin/pexels-pixabay-
271816_2b2Y2LzQ1.jpg?ik-sdk-version=javascript-
1.4.3&updatedAt=1656304427380",
id_facilitations: 1,
id_tags: 1
},
}),
computed: {
formTitle () {
return this.editedIndex === -1 ? 'Add Office' : 'Edit
Office'
},
},
watch: {
dialog (val) {
val || this.close()
},
dialogDelete (val) {
val || this.closeDelete()
},
dialogView (val) {
val || this.close()
}
},
32
async mounted() {
this.initialize()
},
methods: {
async loadDataOffices() {
const response = await
axios.get(`http://34.207.166.213/office/all`)
this.offices = response.data.data
},
initialize () {
this.loadDataOffices()
},
viewDetail(item) {
this.editedIndex = this.offices.indexOf(item)
this.editedItem = Object.assign({}, item)
this.dialogView = true
},
editItem (item) {
this.editedIndex = this.offices.indexOf(item)
this.editedItem = Object.assign({}, item)
this.dialog = true
},
deleteItem (item) {
this.editedIndex = this.offices.indexOf(item)
this.editedItem = Object.assign({}, item)
this.dialogDelete = true
},
deleteItemConfirm () {
this.offices.splice(this.editedIndex, 1)
axios.delete(`http://34.207.166.213/office/`+this.editedItem.id
).then(response=>{
console.log(response)
})
this.closeDelete()
},
closeView() {
this.dialogView = false
this.$nextTick(() => {
this.editedItem = Object.assign({}, this.defaultItem)
this.editedIndex = -1
})
this.initialize()
},
close () {
this.dialog = false
this.$nextTick(() => {
this.editedItem = Object.assign({}, this.defaultItem)
this.editedIndex = -1
})
this.initialize()
},
closeDelete () {
this.dialogDelete = false
this.$nextTick(() => {
33
this.editedItem = Object.assign({}, this.defaultItem)
this.editedIndex = -1
})
},
save () {
if (this.editedIndex > -1) {
axios.put(`http://34.207.166.213/office/`+this.editedItem.id, {
type_id: Number(this.editedItem.type_id),
name: this.editedItem.name,
description: this.editedItem.description,
latitude: this.editedItem.latitude,
longitude: this.editedItem.longitude,
price: Number(this.editedItem.price),
chair_min: Number(this.editedItem.chair_min),
chair_max: Number(this.editedItem.chair_max),
photo_urls: [{
url: this.editedItem.photo_url,
}],
facilitations: [{
id: Number(this.editedItem.id_facilitations)
}],
tags: [{
id: Number(this.editedItem.id_tags)
}]
}).then(response=>{
console.log(response)
})
Object.assign(this.offices[this.editedIndex],
this.editedItem)
} else {
axios.post(`http://34.207.166.213/office`, {
type_id: Number(this.editedItem.type_id),
name: this.editedItem.name,
description: this.editedItem.description,
latitude: this.editedItem.latitude,
longitude: this.editedItem.longitude,
price: Number(this.editedItem.price),
chair_min: Number(this.editedItem.chair_min),
chair_max: Number(this.editedItem.chair_max),
photo_urls: [
{
url: this.editedItem.photo_url,
}
],
facilitations: [{
id: Number(this.editedItem.id_facilitations)
}],
tags: [{
id: Number(this.editedItem.id_tags)
}]
}).then(response=>{
console.log(response)
})
this.offices.push(this.editedItem)
}
this.close()
},
},
34
}
</script>
Gambar 3. 18. source code javascript manage office
3) Kode Pemrograman Halaman Admin Manage transaction
<template>
<v-app>
<Sidebar/>
</v-card-title>
</v-card>
<template>
<v-card width="75%" class="ml-auto mr-10 pt-2">
<v-data-table
:headers="headers"
:items="transactions"
:search="search"
:footer-props="{
'items-per-page-options': [10, 15, 20]
}"
sort-by="id"
>
<template v-slot:top>
<v-toolbar
flat
>
<v-text-field
v-model="search"
append-icon="mdi-magnify"
label="Search Transaction"
single-line
hide-details
dense
filled
></v-text-field>
<v-spacer></v-spacer>
<v-spacer></v-spacer>
<v-spacer></v-spacer>
<template>
<v-row justify="center">
<v-dialog
v-model="dialogNewTransaction"
35
persistent
max-width="600px"
>
<template v-slot:activator="{ on, attrs }">
<v-btn
color="primary"
dark
v-bind="attrs"
v-on="on"
>
New Transaction
</v-btn>
</template>
<v-card>
<v-card-title>
<span class="text-h5">New Transaction</span>
</v-card-title>
<v-card-text>
<v-container>
<v-row>
<v-col
cols="6"
>
<v-text-field
v-model="user_id"
label="Id User"
required
type="number"
></v-text-field>
</v-col>
<v-col
cols="6"
>
<v-text-field
v-model="office_id"
label="Id Office"
required
type="number"
></v-text-field>
</v-col>
<v-col cols="6">
<v-menu
ref="menuDateStart"
v-model="menuDateStart"
:close-on-content-click="false"
:return-value.sync="start_date"
transition="scale-transition"
offset-y
max-width="290px"
min-width="290px"
>
<template v-slot:activator="{ on,
attrs }">
<v-text-field
v-model="start_date"
label="Pilih Tanggal"
readonly
v-bind="attrs"
v-on="on"
36
solo
dark
background-color="#28304E"
></v-text-field>
</template>
<v-date-picker
v-if="menuDateStart"
v-model="start_date"
>
<v-spacer></v-spacer>
<v-btn
text
color="primary"
@click="menuDateStart = false"
>
Cancel
</v-btn>
<v-btn
text
color="primary"
@click="$refs.menuDateStart.save(start_date)"
>
OK
</v-btn>
</v-date-picker>
</v-menu>
</v-col>
<v-col cols="3">
<v-menu
ref="menuStart"
v-model="menuStart"
:close-on-content-click="false"
:nudge-right="40"
:return-value.sync="start_time"
transition="scale-transition"
offset-y
max-width="290px"
min-width="290px"
>
<template v-slot:activator="{ on,
attrs }">
<v-text-field
v-model="start_time"
label="Start"
readonly
v-bind="attrs"
v-on="on"
solo
dark
background-color="#28304E"
></v-text-field>
</template>
<v-time-picker
v-if="menuStart"
v-model="start_time"
:max="end_time"
37
format="24hr"
use-seconds
full-width
@click:second="$refs.menuStart.save(start_time)"
></v-time-picker>
</v-menu>
</v-col>
<v-col cols="3">
<v-menu
ref="menuEnd"
v-model="menuEnd"
:close-on-content-click="false"
:nudge-right="40"
:return-value.sync="end_time"
transition="scale-transition"
offset-y
max-width="290px"
min-width="290px"
>
<template v-slot:activator="{ on,
attrs }">
<v-text-field
v-model="end_time"
label="End"
readonly
v-bind="attrs"
v-on="on"
solo
dark
background-color="#28304E"
></v-text-field>
</template>
<v-time-picker
v-if="menuEnd"
v-model="end_time"
:min="start_time"
format="24hr"
use-seconds
full-width
@click:second="$refs.menuEnd.save(end_time)"
></v-time-picker>
</v-menu>
</v-col>
</v-row>
</v-container>
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn
color="blue darken-1"
text
@click="dialogNewTransaction = false"
>
38
Close
</v-btn>
<v-btn
color="blue darken-1"
text
@click="updateTransaction()"
>
Save
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</v-row>
</template>
<v-dialog
v-model="dialog"
max-width="600px"
>
<v-card class="pa-4">
<v-card-title>
<span class="headline font-weight-
medium">{{ formTitle }}</span>
</v-card-title>
<v-card-text>
<v-container>
<v-row>
<v-col
cols="12"
>
<v-text-field
v-model="user_name"
label="Customer name"
disabled
></v-text-field>
</v-col>
<v-col
cols="12"
>
<v-text-field
v-model="total_price"
label="Total Price"
disabled
></v-text-field>
</v-col>
<v-col
cols="6"
>
<v-select
v-model="editedItem.status"
:items="itemStatus"
label="Status"
solo
dark
background-color="primary"
39
>
</v-select>
</v-col>
</v-row>
</v-container>
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn
color="#121950"
outlined
@click="close"
width="150"
class="mr-4"
>
Cancel
</v-btn>
<v-btn
color="#121950"
dark
@click="save"
width="150"
>
Save
</v-btn>
<v-spacer></v-spacer>
</v-card-actions>
</v-card>
</v-dialog>
</template>
<v-btn
icon
>
<v-icon
@click="editItem(item)"
color="primary"
>
mdi-pencil-circle
</v-icon>
</v-btn>
<v-btn
icon
>
<v-icon
@click="deleteItem(item)"
color="red"
>
mdi-delete-circle
</v-icon>
</v-btn>
</template>
</v-data-table>
</v-card>
</template>
</v-app>
</template>
Gambar 3. 19. source code halaman manage transaction
<script
>
import Sidebar from "@/components/SideBarAdmin.vue"
import axios from 'axios'
export default {
name: 'DataTransactions',
components: {
Sidebar
},
data() {
return {
user_name: "",
total_price: "",
// Tanggal
date_now: (new Date(Date.now() - (new
Date()).getTimezoneOffset() * 60000)).toISOString().substr(0,
42
10),
menuDateStart: false,
menuStart: false,
menuEnd: false,
menu: false,
// Input new transaction
dialogNewTransaction: false,
user_id: 0,
office_id: 0,
start_date: "",
start_time:"",
end_time:"",
search: '',
dialog: false,
dialogDelete: false,
headers: [
{
text: 'Id',
align: 'start',
filterable: false,
value: 'id',
},
{ text: 'Name', value: 'user.name', sortable:
false },
{ text: 'Price', value: 'total_price',
sortable: false },
// { text: 'Method', value: 'payment_method' },
{ text: 'Nama Gedung', value: 'office.name',
sortable: false },
{ text: 'Date', value: 'start_hour', sortable:
false },
{ text: 'Status', value: 'status_id', sortable:
false },
{ text: 'Actions', value: 'actions', sortable:
false },
],
transactions: [],
itemStatus: ['Pending', 'Success', 'Failed'],
itemMethod: ['BCA', 'BNI', 'BRI', 'CIMB',
'Panin'],
editedIndex: -1,
editedItem: {
id: 0,
status_id: ''
43
},
defaultItem: {
id: 0,
status_id: ''
},
}
},
computed: {
formTitle () {
return this.editedIndex === -1 ? 'New Item' : 'Edit
Transaction'
},
},
watch: {
dialog (val) {
val || this.close()
},
dialogDelete (val) {
val || this.closeDelete()
},
dialogReview (val) {
val || this.close()
},
},
async mounted() {
this.initialize()
},
methods: {
async loadDataTransactions() {
const response = await
axios.get(`http://34.207.166.213/booking/all`)
this.transactions = response.data.data
},
initialize () {
this.loadDataTransactions()
},
editItem (item) {
this.editedIndex = this.transactions.indexOf(item)
this.editedItem = Object.assign({}, item)
this.user_name = item.user.name
this.total_price = item.total_price
this.dialog = true
},
deleteItem (item) {
44
this.editedIndex = this.transactions.indexOf(item)
this.editedItem = Object.assign({}, item)
this.dialogDelete = true
},
deleteItemConfirm () {
this.transactions.splice(this.editedIndex, 1)
axios.delete(`http://34.207.166.213/booking/`+this.editedItem
.id
).then(response=>{
console.log(response)
})
this.closeDelete()
},
close () {
this.dialog = false
this.$nextTick(() => {
this.editedItem = Object.assign({},
this.defaultItem)
this.editedIndex = -1
})
this.initialize()
},
closeDelete () {
this.dialogDelete = false
this.$nextTick(() => {
this.editedItem = Object.assign({},
this.defaultItem)
this.editedIndex = -1
})
this.initialize()
},
updateTransaction() {
axios.post(`http://34.207.166.213/booking`, {
user_id: Number(this.user_id),
office_id: Number(this.office_id),
status_id: 1,
start_date: this.start_date+" 00:00:00 WIB",
end_date: this.start_date+" 00:00:00 WIB",
start_hour: this.start_date+" " +
this.start_time+ " WIB",
end_hour: this.start_date+" " +
this.end_time+ " WIB"
}).then(response=>{
45
console.log(response)
})
this.dialogNewTransaction = false
this.initialize()
},
save () {
if (this.editedIndex > -1) {
if (this.editedItem.status == 'Pending') {
axios.put(`http://34.207.166.213/booking/`+this.editedItem.id
, {
status_id: 1
}).then(response=>{
console.log(response)
})
} if (this.editedItem.status == 'Success') {
axios.put(`http://34.207.166.213/booking/`+this.editedItem.id
, {
status_id: 2
}).then(response=>{
console.log(response)
})
} else {
axios.put(`http://34.207.166.213/booking/`+this.editedItem.id
, {
status_id: 3
}).then(response=>{
console.log(response)
})
}
Object.assign(this.transactions[this.editedIndex],
this.editedItem)
} else {
axios.post(`http://34.207.166.213/booking`, {
}).then(response=>{
console.log(response)
})
this.transactions.push(this.editedItem)
}
this.close()
},
},
46
}
</script>
Gambar 3. 20. source code javascript manage transaction
<template>
<v-app>
<Sidebar/>
<v-card width="75%" class="ml-auto mr-10 mb-4" flat>
<v-card-title class="headline font-weight-bold">
Manage Reviews
<v-spacer></v-spacer>
</v-card-title>
</v-card>
<template>
<v-card width="75%" class="ml-auto mr-10 pt-2">
<v-data-table
:headers="headers"
:items="reviews"
:search="search"
:footer-props="{
'items-per-page-options': [10, 15, 20]
}"
sort-by="id"
>
<template v-slot:top>
<v-toolbar
flat
>
<v-text-field
v-model="search"
append-icon="mdi-magnify"
label="Search Office"
single-line
hide-details
dense
filled
></v-text-field>
<v-spacer></v-spacer>
<v-spacer></v-spacer>
<v-spacer></v-spacer>
</template>
</v-data-table>
</v-card>
</template>
</v-app>
</template>
Gambar 3. 21. source code halaman manage review
<script>
import Sidebar from "@/components/SideBarAdmin.vue"
import axios from 'axios'
export default {
name: 'DataReviews',
components: {
Sidebar
},
data() {
return {
search: '',
dialog: false,
49
dialogDelete: false,
dialogReview: false,
detailText: '',
detailStar: 0,
customerName: '',
officeName: '',
headers: [
{
text: 'Id',
align: 'start',
filterable: false,
value: 'id',
},
{ text: 'Name', value: 'user.name', sortable:
false },
{ text: 'Building', value: 'office.name', sortable:
false },
{ text: 'Rating', value: 'star' },
{ text: 'Review', value: 'text', sortable: false },
{ text: 'Status', value: 'status', sortable:
false },
],
reviews: [],
offices: [],
editedIndex: -1,
editedItem: {
id: 0,
star: 0,
text: '',
},
defaultItem: {
id: 0,
rating: 0,
review: '',
},
}
},
computed: {
formTitle () {
return this.editedIndex === -1 ? 'New Item' : 'Edit
Review'
},
},
watch: {
dialog (val) {
val || this.close()
},
dialogDelete (val) {
val || this.closeDelete()
},
dialogReview (val) {
val || this.close()
},
},
async mounted() {
this.initialize()
},
methods: {
async loadDataReviews() {
50
const response = await
axios.get(`http://34.207.166.213/review/all`)
this.reviews = response.data.data
console.log(response.data.data)
},
initialize () {
this.loadDataReviews()
},
editItem (item) {
this.editedIndex = this.reviews.indexOf(item)
this.editedItem = Object.assign({}, item)
this.customerName = item.user.name
this.officeName = item.office.name
this.dialog = true
},
viewDetailReview (item) {
this.editedIndex = this.reviews.indexOf(item)
this.editedItem = Object.assign({}, item)
this.detailText = item.text
this.detailStar = item.star
this.dialogReview = true
},
changeStatusToHidden(idReview) {
axios.put(`http://34.207.166.213/review/`+idReview, {
hidden: 2
}).then(response=>{
console.log(response)
})
this.initialize()
},
changeStatusToPublish(idReview) {
axios.put(`http://34.207.166.213/review/`+idReview, {
hidden: 1
}).then(response=>{
console.log(response)
})
this.initialize()
},
deleteItem (item) {
this.editedIndex = this.reviews.indexOf(item)
this.editedItem = Object.assign({}, item)
this.dialogDelete = true
},
deleteItemConfirm () {
this.reviews.splice(this.editedIndex, 1)
axios.delete(`http://34.207.166.213/review/`+this.editedItem.id
).then(response=>{
console.log(response)
})
this.closeDelete()
},
close () {
this.dialog = false
this.$nextTick(() => {
this.editedItem = Object.assign({}, this.defaultItem)
this.editedIndex = -1
})
this.initialize()
51
},
closeDelete () {
this.dialogDelete = false
this.$nextTick(() => {
this.editedItem = Object.assign({}, this.defaultItem)
this.editedIndex = -1
})
},
closeDetailReview () {
this.dialogReview = false
this.$nextTick(() => {
this.editedItem = Object.assign({}, this.defaultItem)
this.editedIndex = -1
})
},
save () {
if (this.editedIndex > -1) {
axios.put(`http://34.207.166.213/review/`+this.editedItem.id, {
star: Number(this.editedItem.star),
text: this.editedItem.text
}).then(response=>{
console.log(response)
})
Object.assign(this.reviews[this.editedIndex],
this.editedItem)
} else {
axios.post(`http://34.207.166.213/review`, {
hidden: 1,
office_id: 68,
user_id: 13,
star: Number(this.editedItem.star),
text: this.editedItem.text
}).then(response=>{
console.log(response)
})
this.reviews.push(this.editedItem)
}
this.close()
},
},
}
</script>
Gambar 3. 22. source code javascript manage review
52
BAB IV
pemrograman:
53
Gambar 4. 3. Office Detail
sudah meng-input data email dan password. Hal ini dikarenakan tim
55
2017).Di JWT tersebut data-data dari email dan password berada,
Google pada oktober 2014 silam (Tamplin J, 2018). Oleh karena itu,
gambar 4.8.
56
Gambar 4. 7. Letak Tombol Add Office
Pada halaman manage review, saat ada user yang mengupload review
dari sebuah product akan tampil di halaman manage review. Admin dapat
melakukan CRUD review yaitu view detail dan status. Pada view detail
admin dapat melihat review dari user. Dan pada status, admin dapat
57
Gambar 4. 9. Letak tombol view detail dan status
58
Pada halaman manage transaction, saat user telah mem-booking sebuah
pending, dan fail. Status succeess berarti pembayaran telah selasai dan
59
BAB V
PENUTUP
5.1 Kesimpulan
5.2 Saran
60
DAFTAR PUSTAKA
61
LAMPIRAN
A. LAMPIRAN LOA
62
B. JADWAL PEMBELAJARAN
a. Expert class
Durat Durat
Quant ion ion
ity (minu (minu Time
Activity Activity Detailed (Day) te) te) (WIB)
Reading & Pre- 08.30-
Self-Study Activitias record Video 45 150 6750 11.00
Doing Quiz (multiple 11.00-
Post Learning choice) 45 60 2700 12.00
12.00-
Break 13.00
13.00-
Post Learning Doing Summary 45 60 2700 14.00
Doing homework & 14.00-
Post Learning practices 45 60 2700 15.00
15.00-
Break 15.20
Doing homework & 15.20-
Post Learning practices 45 60 2700 16.30
Coding Competence Flexible
Monthly Test Test 5 480 2400 Time
Flexible
Exploration Mini Project 15 390 5860 Time
18.00-
Break 18.30
Review & QnA
New Task 18.30-
In-Class Activity Explanation 36 150 5400 21.00
Monthly-In-Class Professional Skill 18.30-
Activity Development 24 150 3600 21.00
21.00-
Special Class 1on1 (additional) - 30 - 21.30
Total Duration 34810
63
b. Project class
Durat
Quant Durat ion Time
Activity Activity Detailed ity ion Total (WIB)
Project Team 1260 08.30-
Capstone Project Collaboration 60 210 0 12.00
12.00-
Break 13.00
Project Team 13.00-
Capstone Project Collaboration 60 120 7200 15.00
Project Team
Collaboration (self 09.00-
Capstone Project activities) 24 150 3600 12.00
Review & QnA
New Task 18.30-
In-Class Activity Explanation 36 150 5400 21.00
Total Duration 28800
64
C. LOG ACTIVITY
Minggu/Tanggal Kegiatan / Materi Keterangan
17 Februari Pembekalan untuk mengikuti Sosialisasi
2022 course dan konsolidasi
18 Februari Pembagian kelas dan mentor -
2022
21 Februari Acara Pembukaan dari mitra -
2022 Alterra
Mempelajari tentang git
dan github.com dimana
22 Februari Version Control and Branch
tempat pengumpulan
2022 Management
code-code pemrograman,
tugas-tugas, dan lain-lain
Pengenalan design-design
yang menarik, simple, dan
praktis agar terlihat
menarik oleh user.
23 Februari UX(user experience) ialah
Introduction UI/UX
2022 bagaimana pengalaman
user dalam penggunaanya.
UI(user interface) dimana
user berinteraksi dengan
design-desing website
24 Februari Figma merupakan sebuah
2022 software untuk mendesign
UI website atau mobile
25 Februari
Figma dan alat prototyping.
2022
26 Februari
2022
1 Maret 2022 HTML merupakan
Hypertext Markup Language kerangka dasar atau
2 Maret 2022 (HTML) struktur dasar sebuah
halaman website.
Cascading Style Sheets (CSS) CSS dapat menghias
halaman website, dan
4 Maret 2022
dapat mengatur posisi
pada halaman web.
65
5 Maret 2022 BOOTSTRAP adalah
framework CSS, yang
berfungsi untuk
BOOTSTRAP
8 Maret 2022 mendesain website
responsive dengan cepat
dan mudah.
9 Maret 2022 Javascript adalah Bahasa
pemrograman yang high-
Javascript Refreshment
10 Maret 2022 level , scripting, untyped,
dan interpreted.
Clean code adalah istilah
untuk code yang mudah
11 Maret 2022 Clean Code
dibaca, dipahami, dan
diubah oleh programmer.
12 Maret 2022 Frontend adalah sebuah
bagian dari website yang
membuat tampilan
menarik kepada user.
Dasar dari frontend yaitu
HTML, CSS, dan
Frontend Fundamental Javascript. Kalo kita
15 Maret 2022 samakan dengan anatomi
manusia, HTML itu
kerangka, CSS itu
bagaikan kulit & Pakaian,
dan Javascript itu
bagaikan otak.
16 Maret 2022 Vue adalah framework
dari javascript untuk
mengembangkan
Vue Fundamental
17 Maret 2022 tampilan website yang
lebih interaktif dan
dinamis
18 Maret 2022 Vue CLI (Command Line Vue CLI adalah perkakas
Interface) standar untuk
19 Maret 2022
memudahkan
penyetalan/pembuatan
aplikasi vue baru. Vue
mempunyai struktur
folder yaitu assets,
66
component, router, store,
views, dan test.
22 Maret 2022 Sebuah komponen file
tunggal vue bertujuan
23 Maret 2022
untuk dapat digunakan
lebih dari satu kali
ditempat yang berbeda
Vue Component disebut Komponen Vue
yang dapat digunakan
24 Maret 2022
kembali. Cara kerja
komponen vue yaitu dari
anak(child) ke
induk(parent).
25 Maret 2022 Di vue helpers ada disebut
Navigasi, yatitu kegiatan
berpindah dari satu
halaman ke halaman lain.
Dan ada juga
Vue Helpers penyimpanan global, yaitu
26 Maret 2022 sebuah metode untuk
menyimpan variable yang
dapat diakses dengan
mudah diseluruh bagian
aplikasi.
29 Maret 2022 Data fetching adalah
pengambilan data oleh
perangkat lunak atau
skrip. Dan API singkatan
dari Application
Vue Data Programming Interface
30 Maret 2022 yaitu sebuah protocol
pada dasarnya
menyediakan Bahasa dan
kontran untuk bagaimana
dua system beriteraksi.
31 Maret 2022 Vue Quality Control Debugging adalah proses
mengidentifikasi dan
1 April 2022
menghilangkan kesalahan
dari perangkat lunak
computer. Cara kerja
67
debugging yaitu
identifikasi debugging,
dan identifikasi
kesalahan/error.
2 April 2022 UI framework adalah
kumpulan elemen visual
5 April 2022
(seperti tombol, ikon, dll)
6 April 2022 dan fungsionalitas yang
Vue UI Framework bisa secara instan.
Macam-macam rangka
kerja UI yang tersedia
yaitu Vuetify,
Bootsrtapvue, dll.
7 April 2022 Siapa tim product? Ialah
sekolompok orang yang
mengawasi proses desain
Work Together With Product.
produk baru. Siapa tim
8 April 2022 Backend, And Devops
backend? Ialah yang
mengacu pada
pengembangan sisi server.
9 April 2022 Nuxt adalah kerangka
kerja yang dibangun
12 April 2022
diatas vue yang membuat
Vue With Nuxt
pengembangan web
menjadi sederhana dan
ampuh.
13 April 2022 Algoritma adalah
prosedur komputasi yang
14 April 2022
didefinisikan dengan baik
Introduction Algorithm yang mengambil beberapa
nilai sebagai input dan
menghasilkan beberapa
nilai sebagai output.
16 April 2022 Understanding GraphQL Basic GraphQL adalah bahasa
& Relational Database query untuk API, dan
runtime sisi server untuk
mengeksekusi kueri
dengan menggunakan
sistem tipe yang tetapkan
68
untuk data.
19 April 2022 Relational Database
20 April 2022 Understanding GraphQL
Query
21 April 2022 Understanding GraphQL
22 April 2022 Mutation
69