Completed

Vuejs Training @ Amsteel Mills

Amsteel Mills

Date
4 โ€“ 7 Jul 2022
Organised by
CeDR Consulting Sdn Bhd
Trainer
Azman Zakaria
Attendees
0

Kursus ini berkonsepkan From Zero to Hero . Peserta dianggap telah mempunyai asas yang kukuh dalam pengaturcaraan Javascript, PHP dan Laravel, tetapi pemula kepada VueJs. Peserta seharusnya juga telah mempunyai asas HTML, CSS dan SQL yang baik untuk mendapat hasil sepenuhnya dari kursus ini. 

Masa Kursus:

Mula          : 9.00 AM- 10.30 AM

Rehat        : 10:31 AM - 10.45 AM

Sambung  : 10:46 AM - 1:00 PM

Makan       : 1:01 PM - 2.15 PM

Sambung  : 2.16 PM - 5:00 PM 

Perisian yang berkaitan  yang akan digunakan didalam kelas ini adalah seperti berikut :-

  • VueJs Versi 2 dan 3
  • MySQL 5.7
  • jQuery 3
  • Twitter Bootstrap 5
  • Visual Studio Code
  • SQL Yog
  • Composer
  • Cmder

Dicadangkan PC yang akan digunakan ialah menggunakan Window 10 dengan RAM 8 Gb, dan kapasiti Storage yang Free sebanyak min 2 Gb

Training Materials

Vue Ninja

Gitlab Day 1

Trainer Profile

 Nama : Azman bin Zakaria
 Umur : 52 tahun
 Pengalaman Dalam Bidang IT : 21 Tahun
 Syarikat : Favourite Trainer Sdn Bhd
 Kelulusan :

  • Bachelor IT UiTM
  • Diploma Computer Science UiTM
  • HRDF Certified Instructor

Azman merupakan senior programmer yang passionate dalam bidang pengaturcaraan komputer dari awal mulai beliau bekerja pada tahun 2000 sehingga hari ini. Beliau mempunyai pengalaman bekerja yang luas di agensi kerajaan, swasta dan sebagai freelancer.
Antara pengaturcaraan yang selalu digunakan adalah seperti :

  • PHP (sejak tahun 2000)
  • PHP dan Laravel Framework
  • PHP dan Yii Framework
  • Coldfusion
  • Java 
  • Java dan Spring Boot Framework
  • Javascript
  • jQuery
  • Vuejs
  • Angular
  • Flutter

 

Notes

fetchApi.js

import baseHttp from "./baseFetch";

export const getHttp = async (url, type = "json", options) =>
  (await baseHttp(url, "get", options))(type);

export const postHttp = async (url, body, type = "json", options) =>
  (
    await baseHttp(url, "post", {
      body,
      ...options,
    })
  )(type);

export const putHttp = async (url, body, type = "json", options) =>
  (
    await baseHttp(url, "put", {
      body,
      ...options,
    })
  )(type);

export const patchHttp = async (url, body, type = "json", options) =>
  (
    await baseHttp(url, "patch", {
      body,
      ...options,
    })
  )(type);

export const updateHttp = async (url, body, type = "json", options) =>
  (
    await baseHttp(url, "update", {
      body,
      ...options,
    })
  )(type);

export const deleteHttp = async (url, body, type = "json", options) =>
  (
    await baseHttp(url, "delete", {
      body,
      ...options,
    })
  )(type);

baseFetch.js

export default async (url, method, options = {}) => {
  let httpRequest;
  if (method.toUpperCase() === "GET") {
    httpRequest = await fetch(url, {
      cache: "reload",
      ...options,
    });
  } else {
    httpRequest = fetch(url, {
      method: method.toUpperCase(),
      cache: "reload",
      ...options,
    });
  }
  return (type) => {
    switch (type.toLocaleLowerCase()) {
      case "json":
        return httpRequest.json();
      case "blob":
        return httpRequest.blob();
      case "text":
        return httpRequest.text();
      case "formdata":
        return httpRequest.formData();
      default:
        return httpRequest.arrayBuffer();
    }
  };
};

App.vue

<template>
  <div id="app">
    <random-cat />
  </div>
</template>

<script>
import RandomCat from './components/RandomCat.vue';
export default {
  name: "App",
  components: {
    //RandomCat: () => import("./components/RandomCat"),
    RandomCat
  },
};
</script>

<style></style>

 

Random Cat.vue

<template>
  <MaterialCardBox
    header="Cat as a Service"
    sub-header="Random Cat Image"
    show-media
    show-actions
  >
    <template v-slot:media>
      <img
        v-if="kittyImage"
        alt="Meow!"
        :src="kittyImage"
        style="width: 300px"
      />
      <p v-else style="text-align: center">
        <i class="material-icons"> cached </i>
      </p>
    </template>

    <template v-slot:action>
      <MaterialButton background-color="#4ba3c7" text-color="#fff" @click="newCatImage">
        <i class="material-icons"> pets </i> Cat Image
      </MaterialButton>

      <MaterialButton background-color="#005b9f" text-color="#fff" @click="newCatGif">
        <i class="material-icons"> pets </i> Cat GIF
      </MaterialButton>
    </template>
  </MaterialCardBox>
</template>

<script>
import { getHttp } from "../http/fetchApi";
import MaterialButton from "./MaterialButton.vue";
import MaterialCardBox from "./MaterialCardBox.vue";
export default {
  // lazy loading
  components: {
    MaterialButton, MaterialCardBox
    //MaterialButton: () => import("./MaterialButton.vue"),
    //MaterialCardBox: () => import("./MaterialCardBox.vue"),
  },
  data: () => ({
    kittyImage: "",
  }),
  methods: {
    async getImage(url) {
      return URL.createObjectURL(await getHttp(url, "blob"));
    },
    async newCatImage() {
      this.kittyImage = await this.getImage("https://cataas.com/cat");
    },
    async newCatGif() {
      this.kittyImage = await this.getImage("https://cataas.com/cat/gif");
    },
  },
  async beforeMount() {
    await this.newCatImage();
  },
};
</script>

<style scoped>
body {
 font-size: 14px;
 }
</style>

Content Here

cardStyles.css

h1, h2, h3, h4, h5, h6{
    margin: 0;
}

.cardText{
    -moz-osx-font-smoothing: grayscale;
    -webkit-font-smoothing: antialiased;
    text-decoration: inherit;
    text-transform: inherit;
    font-size: 0.875rem;
    line-height: 1.375rem;
    letter-spacing: 0.0071428571em;
}

h1.cardHeader{
    font-size: 1.25rem;
    line-height: 2rem;
    font-weight: 500;
    letter-spacing: .0125em;
}

h2.cardSubHeader{
    font-size: .875rem;
    line-height: 1.25rem;
    font-weight: 400;
    letter-spacing: .0178571429em;
    opacity: .6;
}
   

App.vue

<template>
  <div id="app">
    <MaterialCardBox>
      <template v-slot:header>
        <strong>Card Title</strong><br />
        <span>Card Sub-Title</span>
      </template>

      <template v-slot:media>
        <img src="https://via.placeholder.com/350x150" />
      </template>

      <p>Main Section</p>

      <template v-slot:action>
        <button>Action Button</button>
        <button>Action Button</button>
      </template>
    </MaterialCardBox>
  </div>
</template>

<script>
import MaterialCardBox from "./components/MaterialCardBox.vue";
export default {
  name: "App",
  components: {
    MaterialCardBox,
  },
};
</script>

<style scoped>
* {
  color: #999;
}
</style>

MaterialCardBox.vue

<template>
    <div class="cardBox elevation_2">
        <div class="header">
            <slot v-if="$slots.header" name="header" />
            <div v-else>
                <h1 class="cardHeader cardText">Card Header</h1>
                <h2 class="cardSubHeader cardText">Card Sub Header</h2>
            </div>
        </div>

        <div class="media">
            <slot v-if="$slots.media" name="media" />
            <img v-else src="https://via.placeholder.com/350x250" />
        </div>

        <div v-if="$slots.default" class="section cardText"
            :class="{
                noBottomPadding: $slots.action,
                halfPaddingTop: $slots.media,
            }">
            <slot />
        </div>
        
        <div v-if="$slots.action" class="action">
            <slot name="action" />
        </div>

    </div>
</template>

<script>
export default {
  name: "MaterialCardBox",
};
</script>

<style scoped>
@import url("https://fonts.googleapis.com/css?family=Roboto:400,500,700&display=swap");
@import "../style/elevation.css";
@import "../style/cardStyles.css";

/* comment css here */
* {
  font-family: "Roboto", sans-serif;
}

.cardBox {
  width: 100%;
  max-width: 300px;
  background-color: #fff;
  position: relative;
  display: inline-block;
  border-radius: 0.25rem;
}

.cardBox > .section {
    padding: 1rem;
    position: relative;
}

.cardBox > .header {
    padding: 1rem;
    position: relative;
    display: block;
}

.cardBox > .media {
    overflow: hidden;
    position: relative;
    display: block;
    max-width: 100%;
}

.cardBox > .section {
    padding: 1rem;
    position: relative;
    margin-bottom: 1.5rem;
    display: block;
}

.cardBox > .action {
    padding: 0.5rem;
    position: relative;
    display: block;
}

.cardBox > .action > *:not(:first-child) {
    margin-left: 0.4rem;
}

.noBottomPadding {
    padding-bottom: 0 !important;
}

.halfPaddingTop {
    padding-top: 0.5rem !important;
}

</style>

 

Borang Penilaian Keberkesanan Latihan

Training evaluation ยท Vuejs Training @ Amsteel Mills

Log in with the account you registered for this training to fill in the survey.

Log in to fill in the survey

Attendance

Registration closed
This training ended on 7 Jul 2022, so new attendance can no longer be registered.

Students (0)

No students have registered yet.