Implementing Course Management Front - TheOpenCloudEngine/uEngine-cloud GitHub Wiki
μ΄λ²μκ°μ VueJS λ₯Ό μ¬μ©νμ¬ MSA μμ μμ μ¬μ©νμλ Course μλΉμ€λ₯Ό UI λ‘ κ΅¬μ±νλ€.
λ¨μν microservice μ ν΄λΉνλ UI λ₯Ό ꡬμ±νλ κ²μ κΈ°μ‘΄μ jqueryμ HTMLλ§ κ°μ§κ³
μΆ©λΆν ꡬμ±μ΄ κ°λ₯ ν κ²μ΄λ€. νμ§λ§ μ¬κΈ°μλ MVVM (Model-View-ViewModel ν¨ν΄) μ μ¬μ©νμ¬,
hybind
λΌλ ajax program μ μ¬μ©νμ¬ back-end μ κ°μ²΄κ° 곧λ°λ‘ νλ©΄κ³Ό 맀νμ΄ λλλ‘ κ΅¬μ±μ ν κ²μ΄λ€.
μ΄λ κ² κ΅¬μ±νμμλ λνλλ ν¨κ³Όλ νλ©΄μμ Course λΌλ back-end κ°μ²΄λ₯Ό loading νμ¬ νλ©΄μ λνλ΄κ³ ,
Course μ λ°μ΄ν°λ₯Ό μ§μ°κ±°λ μ λ ₯νλ λ²νΌμ HTMLμ λ§λ€κ³ νΈμΆνμμλ, λ³λ€λ₯Έ μ½λ©μμ΄
λ°μ΄ν° μμ λ μ λ ₯μ΄ μ±κ³΅νλ©΄ νλ©΄μ λ°λ‘ μμ λκ±°λ νμλλλ‘ κ΅¬μ± ν μμλ€.
μμνκΈ°μ μ λ§λ€λ €λ λΌλ 컀μ€ν νκ·Έμ κ²°κ³Όλ¬Όμ 보μ.
<course v-model="courses[index]" v-for='(course, index) in courses'
@change="updateCourse"
@remove="removeCourse"
@classes="jumpToClasses">
</course>
<script>
var courses= [];
var me = this;
backend.$bind("courses", courses);
courses.$load().then(function(courses){
me.courses = courses; // set the view's data with the loaded data obtained from backend.
});
</script>
μ²μλΆν° νμΌμ μμ±νμ¬ λ§λ€μλ μμ§λ§, template νλ‘μ νΈλ₯Ό λ€μ΄λ°μ ν μ‘°κΈμ© λ³ννλ©΄μ
μ½λλ₯Ό μ΄ν΄λ³΄λλ‘ νκ² λ€.
$ git clone https://github.com/uengine-oss/msa-tutorial-class-management-frontend.git
$ cd msa-tutorial-class-management-frontend
$ npm install
$ npm run dev
> Listening at http://localhost:8082
λΈλΌμ°μ λ₯Ό μ΄μ΄μ http://localhost:8082 λ‘ μ κ·Όμ νλ©΄ iam λ‘κ·ΈμΈ νλ©΄μ΄ λμ¨λ€.
test κ³μ μΈ [email protected] / test1234 λ‘ λ‘κ·ΈμΈμ νλ€.
λ§μ΄ν¬λ‘ μλΉμ€λ€κ³Όμ μ°κ²°νμΈμ μνμ¬ clazz, coures, zuul, eureka μλΉμ€λ€μ λμ΄λ€.
port μΆ©λμ΄ μλλλ‘ μλ‘ λ€λ₯Έ portλ‘ κΈ°λνλ€.
## κ° μλΉμ€ κ²½λ‘λ‘ μ΄λ
## clazz μλΉμ€
$ mvn spring-boot:run -Dserver.port=8088
## course μλΉμ€
$ mvn spring-boot:run -Dserver.port=8081
## zuul μλΉμ€ 8080 port
$ mvn spring-boot:run
## eureka μλΉμ€ 8761 port
$ mvn spring-boot:run
λΈλΌμ°μ μ http://localhost:8761/ λ‘ μ κ·Όμ νμ¬ 3κ°μ μλΉμ€κ° μ μμ μΌλ‘ registered λμλμ§ νμΈνλ€.
λΈλΌμ°μ μ http://localhost:8082 μ κ·Όνμ¬ νλ©΄μμ add , update , remove λ±μ ν΅νμ¬
λ°μ΄ν°λ₯Ό λ£κ³ λΊΌ μ μλ κ²μ νμΈ ν μ μλ€.
μ΄μ template νλ‘μ νΈμ μ€ν ꡬ쑰λ₯Ό νμ
ν΄ λ³΄κ² λ€.
νμΌμ κ΅¬μ‘°κ° λ³΅μ‘νλ€κ³ μκ°λμ§λ§, μ€μ λ‘ VueJS project setting μμ μμ±ν νλ‘μ νΈμ,
src ν΄λμ μ½κ°μ μ½λλ§ λ£μμλΏ λλ¨Έμ§ κ΅¬μ‘°λ λκ°λ€.
-
μμμ νλ‘μ νΈλ₯Ό μ€νν μ μ
npm run dev
λΌλ CLIλͺ λ Ήμ΄λ₯Ό λ£μλ€.
μ΄κ²μ ν΄μνμλ©΄,package.json
νμΌμ dev λΌλ scriptλ₯Ό μ€νμν€λΌλ λ§μ΄λ€.
package.json
μ dev script λnode build/dev-server.js
λ₯Ό μ€ννλ λͺ λ Ήμ΄ μ΄λ€. -
build/dev-server.js
νμΌμ 보면require('./webpack.prod.conf')
λΆλΆμμ μ€μ νμΌμ κ°μ Έμ€κ³ ,
webpack.prod.conf
νμΌμwebpack.base.conf
νμΌμ merge νλλ‘ λμ΄μλ€.
webpack.base.conf
μμλ./src/main.js
λ₯Ό entry μμμ μΌλ‘ λ°λΌλ³΄κ³ μλ€. -
./src/main.js
νμΌμ΄ ν΄λΉ νλ‘μ νΈμ μ΅μ΄ μ§μ μ μ΄κ³ μλ μ½λ μ²λΌ id κ° appμΈ elementλ₯Ό μ°Ύμμ Vueλ‘ λ§€νμ νκ³ μλ€.
κ·Έλ¦¬κ³ App μ΄λΌλ components λ₯Ό μ°Ύμκ°λΌ λΌκ³ λͺ μνκ³ μλ€.
import App from './App'
μ²λΌ μ°μΈ κ²μ App.vue νμΌμ μλκ²½λ‘λ‘ μ°Ύμμ App μ΄λΌλ μ΄λ¦μΌλ‘
μ¬μ© νκ² λ€λ μλ―Έμ΄λ€.
import App from './App'
new Vue({
el: '#app',
template: '<App/>',
components: {App},
- μ΄μ
src/App.vue
νμΌμ μ΄ν΄λ³΄μ. template μΌλ‘ μμμ νμ¬ componentλΌκ³ λͺ μνλ€.
<router-view></router-view>
λ μ¬κΈ°μ routeμμ λμ€λ urlλ‘ λ§€νμ μμΌ
page λ€μ μ€μ νκ² λ€λ μλ―Έμ΄λ€. route λΆλΆμrouter/index.js
νμΌμ μλ€.
<template>
<div>
<router-view></router-view>
- Vueλ₯Ό μμν λ new Vue νμμΌλ‘ μμμ νλμ€ μμμ§λ§, <script> μ½λ μμͺ½μ
export default
λΌκ³ μ€μ λΆλΆμ΄ μλ€.
μ΄λ default moduleμ μμ±νμ¬ node μ export λ₯Ό νλ κ²μ΄λ€.
μ΄λ κ² νμμλ ν΄λΉ νμΌλͺ μΌλ‘import App from './App'
μ΄ μ¬μ©μ΄ κ°λ₯νμ¬ μ§λ€.
λ§μ½ default κ° μλκ³ named λ‘ μ€μ μ νκ² λλ€λ©΄, μλμ κ°μ΄ μ¬μ©κ°λ₯νλ€.
//------ lib.js ------
export function diag(x, y)'
//------ main.js ------
import { diag } from 'lib';
console.log(diag(4, 3));
// or
import * as lib from 'lib';
console.log(lib.diag(4, 3));
μ΄μ μ΄λ²μκ°μ μ£Όμ μΈ course λ§μ΄ν¬λ‘ μλΉμ€μ UIλ₯Ό μ°κ²°ν΄ 보μ.
export default new Router({
//mode: 'history',
routes: [
{
children: [
{
path: 'courses',
name: 'courses',
component: CourseManagement,
beforeEnter: RouterGuard.requireUser,
meta: {
breadcrumb: 'Courses'
}
},
<course v-model="courses[index]" v-for='(course, index) in courses' @change="updateCourse" @remove="removeCourse" @classes="jumpToClasses"></course>
<script>
export default {
props: {},
data() {},
created() {
var me = this;
$.ajax(
{
url: 'http://localhost:8080/courses',
success: function(result){
me.courses = result._embedded.courses;
}
}
)
},
watch: {},
methods: {
updateCourse(course){
// do something
}
}
}
</script>
-
μ°μ index.js μμ routeλ₯Ό μ€μ νκ³ μλ€.
/courses λΌλ path λ‘ νλ©΄μ΄ νΈμΆλμμμ CourseManagement.vue μ»΄ν¬λνΈλ₯Ό νΈμΆνκ³ ,
νλ©΄μ λ€μ΄κ°κΈ° μ μ RouterGuard μμ user 체ν¬λ₯Ό νλΌλ μλ―Έμ΄λ€.
meta μ 보μ breadcrumb μ΄λΌλ λ€λΉκ²μ΄μ μ»΄ν¬λνΈμ Courses λΌλ λͺ μΉμ λ£μ΄μ£Όμλ€. -
CourseManagement.vue μμλ
<course>
컀μ€ν μ»΄ν¬λνΈ νκ·Έλ₯Ό μ¬μ©νμλ€.
컀μ€ν μ»΄ν¬λνΈλ₯Ό λ§λλ λ°©λ²μ μλμ κ°μ΄ λκ°μ§ λ°©λ²μ΄ μμ§λ§,
μ¬κΈ° μμ μμλ export default λ₯Ό μ¬μ©νμ¬ Course.vue νμΌμ λ°λ‘ μ»΄ν¬λνΈλ‘ λ±λ‘νμλ€.
// 1λ² λ°©λ²
// Vue μΈμ€ν΄μ€ μμ±
new Vue({
el: '#some-element',
// μ΅μ
})
// μ»΄ν¬λνΈ λ±λ‘
Vue.component('my-component', {
// μ΅μ
})
// 2λ²λ°©λ²
// my-component.vue νμΌ
<template>
<!-- html code -->
</template>
<script>
export default {
// μ΅μ
}
</script>
-
props , data() , created() , watch λ± νλͺ©μ λ§€μ° μ€μν μ»΄ν¬λνΈμ μ΅μ λ€μ΄λ€.
μμΈν μ€λͺ μ vue kr guide λ₯Ό κΌ λ³΄κΈΈ λ°λλ€.
μμ μ½λμμλ jquery λ‘ $.ajax( μurl: 'http://localhost:8080/courses'
λ₯Ό μ¬μ©νμλλ°,
μ΄λ λ§€μ° μμ’μ μ½λμ΄λ€.
νΉνλ μ½λμμμ url μ μ§μ μ μΌλ‘ ip μ port λ₯Ό 맀νμν€λ©΄ μλλ€.
properties νμΌλ‘ urlμ κ΄λ¦¬νλ λ°©λ²λ μ’μ λ°©λ²μ΄μ§λ§, hybind λ₯Ό μ¬μ©νλ©΄ κ°μ²΄λ₯Ό λ°λ‘ 맀νμν¬ μ μλ€. -
<course>
λ₯Ό νΈμΆν λ @change="updateCourse" @remove="removeCourse" λ±μΌλ‘ νμ¬ λ©μλμ child μμ μ¬μ©ν λ©μλλ₯Ό v-on μμΌ λμλ€.
μ΄ λ§μ μλ―Έλ child μΈ Course.vue μμ change , remove μ΄λ²€νΈλ₯Ό λ°ν ($emit) νκ²λλ©΄,
parent μΈ CourseManagement.vue μ updateCourse, removeCourse λ©μλκ° μ€νλλ€. -
v-model μ΄λΌλ 문ꡬλ vueμ μ½μμ΄ μ΄λ€. course μ λ°μ΄ν°λ₯Ό μ£Όμ νκ³ μΆμμ μ
v-model="courses[index]" λ‘ μ λ¬μ νκ² λλ©΄
Course.vue μμprops: {value: Object}
λ‘ λ°μ΄ν°λ₯Ό λ°μ μκ° μλ€.
v-model μ μ¬μ©νμ§ μκ³ , μ§μ μ μΌλ‘ propsλ₯Ό μ§μ μ ν μκ° μλ€.
μ΄λλ<course :datas="courses[index]" >
νμμΌλ‘ λ°μ΄ν°λ₯Ό λ겨주κ³
Course.vue μμprops: {datas: Object}
λ‘ λ°μ΄ν°λ₯Ό λ°μ μκ° μλ€.
κ·Έλ¬λ :datas μ²λΌ μ¬μ©μ νκ² λλ©΄ νλ©΄λ¨μμ μμΌλ‘ μ΄μ κ°μ μ¬μ©λ°©λ²μ μμ μν¬ μμ μ΄κ³ ,
μμΉ μμ κ²°κ³Όκ° λμ¬μ μλ€κ³ νλ warning μ΄ κ³μ λ¨μ΄μ§λ€.