美文网首页
day05项目【讲师管理模块前端开发】

day05项目【讲师管理模块前端开发】

作者: 刊ing | 来源:发表于2020-07-04 08:50 被阅读0次

改造登录到本地接口

一、跨域配置

1、什么是跨域

浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域 。前后端分离开发中,需要考虑ajax跨域的问题。

这里我们可以从服务端解决这个问题

2、配置

在Controller类上添加注解

@CrossOrigin//跨域


01-项目中的路由

一、后台系统路由实现分析

1、入口文件中调用路由

src/main.js

......

import router from './router'//引入路由模块

......

newVue({

    el:'#app',

    router,//挂载路由

    store,

    render:h=>h(App)

})

2、路由模块中定义路由

src/router/index.js

......

export const constantRouterMap=[

    ......

]

export default new Router({

    ......

    routes:constantRouterMap

})

二、路由定义

1、复制icon图标

将vue-element-admin/src/icons/svg 中的图标复制到 guli-admin项目中

2、修改路由

修改 src/router/index.js 文件,重新定义constantRouterMap

注意:每个路由的name不能相同

{

    path: '/teacher',

    component: Layout,

    redirect: '/teacher/table',

    name: '讲师管理',

    meta: { title: '讲师管理', icon: 'example' },

    children: [

      {

        path: 'table',

        name: '讲师列表',

        component: () => import('@/views/edu/teacher/list'),

        meta: { title: '讲师列表', icon: 'table' }

      },

      {

        path: 'tree',

        name: '添加讲师',

        component: () => import('@/views/edu/teacher/save'),

        meta: { title: '添加讲师', icon: 'tree' }

      }

    ]

  },

3、创建vue组件

在src/views文件夹下创建以下文件夹和文件

list.vue

<template>

    <div class="app-container">

        讲师列表

    </div>

</template>

save.vue

<template>

    <div class="app-container">

        讲师添加

    </div>

</template>


02-使用nginx配置后台多服务器api

一、项目中的Easy Mock

config/dev.env.js 中BASE_API 为项目的easymock地址,目前具有模拟登录、登出、获取用户信息的功能

BASE_API:'"https://easy-mock.com/mock/5950a2419adc231f356a6636/vue-admin"',

登录:/user/login

获取用户信息:/user/info?token=admin

登出:/user/logout

config/dev.env.js,只有一个api地址的配置位置,而我们实际的后端有很多微服务,所以接口地址有很多,

我们可以使用nginx反向代理让不同的api路径分发到不同的api服务器中

二、配置nginx反向代理

1、安装window版的nginx

将nginx-1.12.0.zip解压到开发目录中

如:E:\development\nginx-1.12.0-guli-api

双击nginx.exe运行nginx

访问:localhost

2、配置nginx代理

在Nginx中配置对应的微服务服务器地址即可

注意:最好修改默认的 80端口到81

3、重启nginx

nginx -s reload

4、测试

http://localhost:9001/eduservice/teacher/pageTeacherCondition/1/10

三、配置开发环境

1、修改config/dev.env.js

BASE_API:'"http://127.0.0.1:9001"'

2、重启前端程序

修改配置文件后,需要手动重启前端程序


03-讲师管理列表组件

一、分页列表

1、定义api

创建文件 src/api/edu/teacher.js

import request from '@/utils/request'

export default{

    //1 讲师列表(条件查询分页)

    //current当前页,limit每页记录数,teacherQuery条件对象

    getTeacherPageList(current,limit,teacherQuery){

        return request({

            // url:'/eduservice/teacher/pageTeacherCondition/'+current+'/'+limit,

            url:`/eduservice/teacher/pageTeacherCondition/${current}/${limit}`,

            method:'post',

            //data表示把对象转换为json进行传递到接口里面

            //data表示把对象转换json进行传递到接口里面

            data:teacherQuery

        })

    }

}

2、初始化vue组件

src/views/edu/teacher/list.vue

<template>

    <div class="app-container">

        讲师列表

    </div>

</template>

<script>

    // 引入调用teacher.js文件

    import teacher from '@/api/edu/teacher'

    export default {

        //写核心代码位置

        // data:{

        // },

        data(){ //定义变量和初始值

            return {}

        },

        created(){ //页面渲染之前执行,一般调用method定义的方法

            this.getList()

        },

        methods:{ //创建具体的方法,调用teacher.js定义的方法

            //讲师列表的方法

            getList(){

            }

        }

    }

</script>

3、定义data

  data(){ //定义变量和初始值

            return {

                list:null,//查询之后接口返回集合

                page:1,//当前页

                limit:10,//每页记录数

                total:0,//总记录数

                teacherQuery:{}//条件封装对象

            }

        },

4、定义methods

methods:{ //创建具体的方法,调用teacher.js定义的方法

            //讲师列表的方法

            getList(){

                teacher.getTeacherPageList(this.page,this.limit,this.teacherQuery)

                    .then(response => {//请求成功

                        //response接口返回数据

                        // console.log(response)

                        this.list = response.data.rows

                        this.total = response.data.total

                        console.log(this.list)

                        console.log(this.total)

                    })

                    .catch(error =>{//请求失败

                        console.log(error)

                    })

            }

        }

5、表格渲染

<template>

    <div class="app-container">

        讲师列表

        <!-- 表格 -->

        <el-table

            :data="list"

            border

            fit

            highlight-current-row>

            <el-table-column

                label="序号"

                width="70"

                align="center">

                <template slot-scope="scope">

                {{ (page - 1) * limit + scope.$index + 1 }}

                </template>

            </el-table-column>

            <el-table-column prop="name" label="名称" width="80" />

            <el-table-column label="头衔" width="80">

                <template slot-scope="scope">

                {{ scope.row.level===1?'高级讲师':'首席讲师' }}

                </template>

            </el-table-column>

            <el-table-column prop="intro" label="资历" />

            <el-table-column prop="gmtCreate" label="添加时间" width="160"/>

            <el-table-column prop="sort" label="排序" width="60" />

            <el-table-column label="操作" width="200" align="center">

                <template slot-scope="scope">

                <router-link :to="'/edu/teacher/edit/'+scope.row.id">

                    <el-button type="primary" size="mini" icon="el-icon-edit">修改</el-button>

                </router-link>

                <el-button type="danger" size="mini" icon="el-icon-delete" @click="removeDataById(scope.row.id)">删除</el-button>

                </template>

            </el-table-column>

        </el-table>

    </div>

</template>

6、分页组件

<!-- 分页 -->

        <el-pagination

        :current-page="page"

        :page-size="limit"

        :total="total"

        style="padding: 30px 0; text-align: center;"

        layout="total, prev, pager, next, jumper"

        @current-change="getList"

        />

7、顶部查询表单

注意:

element-ui的 date-picker组件默认绑定的时间值是默认世界标准时间,和中国时间差8小时

设置value-format="yyyy-MM-dd HH:mm:ss" 改变绑定的值

     <!-- :inline="true"表示在一行显示 -->

        <!--查询表单-->

        <el-form :inline="true" class="demo-form-inline">

            <el-form-item>

                <el-input v-model="teacherQuery.name" placeholder="讲师名"/>

            </el-form-item>

            <el-form-item>

                <el-select v-model="teacherQuery.level" clearable placeholder="讲师头衔">

                <el-option :value="1" label="高级讲师"/>

                <el-option :value="2" label="首席讲师"/>

                </el-select>

            </el-form-item>

            <el-form-item label="添加时间">

                <el-date-picker

                v-model="teacherQuery.begin"

                type="datetime"

                placeholder="选择开始时间"

                value-format="yyyy-MM-dd HH:mm:ss"

                default-time="00:00:00"

                />

            </el-form-item>

            <el-form-item>

                <el-date-picker

                v-model="teacherQuery.end"

                type="datetime"

                placeholder="选择截止时间"

                value-format="yyyy-MM-dd HH:mm:ss"

                default-time="00:00:00"

                />

            </el-form-item>

            <el-button type="primary" icon="el-icon-search" @click="getList()">查询</el-button>

            <el-button type="default" @click="resetData()">清空</el-button>

        </el-form>

清空方法:

 resetData(){//清空方法

                //表单输入项数据清空

                this.teacherQuery = {}

                //查询所有讲师数据

                this.getList()

            }

8、测试

二、删除

1、定义api

src/api/edu/teacher.js

    removeById(id){

        return request({

            url:`/eduservice/teacher/${id}`,

            method:'delete'

        })

    }

2、定义methods

src/views/edu/teacher/list.vue

使用MessageBox 弹框组件

        removeDataById(id){

                // debugger

                // console.log(memberId)

                this.$confirm('此操作将永久删除该记录, 是否继续?', '提示', {

                    confirmButtonText: '确定',

                    cancelButtonText: '取消',

                    type: 'warning'

                }).then(() => {//点击确定,执行then方法

                    //调用删除的方法

                    teacher.removeById(id)

                        .then( response => {//删除成功            

                        //提示信息

                        this.$message({

                            type: 'success',

                            message: '删除成功!'

                        })

                        //回到列表页面

                        this.getList()                    

                    })

                })//点击取消,执行catch方法

            }


04-讲师管理表单组件

一、新增

1、定义api

 src/api/edu/teacher.js

      //添加讲师

    addTeacher(teacher){

        return request({

            url:`/eduservice/teacher/addTeacher`,

            method:'post',

            data:teacher

        })

    }

2、初始化组件

src/views/edu/teacher/save.vue

html

<template>

    <div class="app-container">

        <el-form label-width="120px">

            <el-form-item label="讲师名称">

                <el-input v-model="teacher.name"/>

            </el-form-item>

            <el-form-item label="讲师排序">

                <el-input-number v-model="teacher.sort" controls-position="right" min="0"/>

            </el-form-item>

            <el-form-item label="讲师头衔">

                <el-select v-model="teacher.level" clearable placeholder="请选择">

                <!--

                    数据类型一定要和取出的json中的一致,否则没法回填

                    因此,这里value使用动态绑定的值,保证其数据类型是number

                -->

                <el-option :value="1" label="高级讲师"/>

                <el-option :value="2" label="首席讲师"/>

                </el-select>

            </el-form-item>

            <el-form-item label="讲师资历">

                <el-input v-model="teacher.career"/>

            </el-form-item>

            <el-form-item label="讲师简介">

                <el-input v-model="teacher.intro" :rows="10" type="textarea"/>

            </el-form-item>

            <!-- 讲师头像:TODO -->

            <el-form-item>

                <el-button :disabled="saveBtnDisabled" type="primary" @click="saveOrUpdate">保存</el-button>

            </el-form-item>

        </el-form>

    </div>

</template>

js

<script>

export default {

    data(){

        return {

            teacher:{

                name: '',

                sort: 0,

                level: 1,

                career: '',

                intro: '',

                avatar: ''

            },

            saveBtnDisabled: false // 保存按钮是否禁用,

        }

    },

    created(){

    },

    methods:{

        saveOrUpdate(){

            //添加

            this.saveTeacher()

        },

        //添加讲师的方法

        saveTeacher(){

        }

    }

}

</script>

3、实现新增功能

引入teacher api模块

import teacherApi from '@/api/edu/teacher'

完善save方法

         //添加讲师的方法

        saveTeacher(){

            teacherApi.addTeacher(this.teacher)

                .then(response =>{

                    //提示信息

                    this.$message({

                        type:'success',

                        message:'添加成功!'

                    });

                    //回到列表页面 路由跳转

                    this.$router.push({path:'/teacher/table'})

                })

        }

修改讲师信息:通过隐藏路由传递讲师id

index.js

    {

        path: 'edit/:id',

        name: 'EduTeacherEdit',

        component: () => import('@/views/edu/teacher/save'),

        meta: { title: '编辑讲师', noCache:true },

        hidden:true

      }

二、回显

1、定义api 

 src/api/edu/teacher.js

getTeacherInfo(id){

        return request({

            url:`/eduservice/teacher/getTeacher/${id}`,

            method:'get'

        })

    }

2、组件中调用api

save.vue中的methods中定义getInfo

        //根据讲师id查询的方法

        getInfo(id){

            teacherApi.getTeacherInfo(id)

                .then(response => {

                    this.teacher = response.data.teacher

                })

        },

3、页面渲染前调用fetchDataById

save.vue

created(){//页面渲染之前执行

        //判断路径是否有id值

        if (this.$route.params && this.$route.params.id) {

            //从路径获取id值

            const id = this.$route.params.id

            //调用根据id查询的方法

            this.getInfo(id)

        }

    },

三、更新

1、定义api

teacher.js

    //修改讲师

    updateById(teacher){

        return request({

            url:`/eduservice/teacher/updateTeacher`,

            method:'post',

            data:teacher

        })

    }

2、组件中调用api

methods中定义updateData

    //修改讲师的方法

        updateData(){

            this.saveBtnDisabled = true

            teacherApi.updateById(this.teacher)

                .then(response => {

                    //提示信息

                    this.$message({

                        type:'success',

                        message:'修改成功!'

                    });

                    //回到列表页面 路由跳转

                    this.$router.push({path:'/teacher/table'})

                })

        }

3、完善saveOrUpdate方法

    saveOrUpdate(){

            this.saveBtnDisabled = true

            //判断修改还是添加

            //根据teacher是否有id

            if(!this.teacher.id){

                //添加

                this.saveTeacher()

            }else{

                //修改

                this.updateData()

            }

        },

四、存在问题

vue-router导航切换 时,如果两个路由都渲染同个组件,组件会重(chong)用,

组件的生命周期钩子(created)不会再被调用, 使得组件的一些数据无法根据 path的改变得到更新

因此:

1、我们可以在watch中监听路由的变化,当路由变化时,重新调用created中的内容

2、在init方法中我们判断路由的变化,如果是修改路由,则从api获取表单数据,

      如果是新增路由,则重新初始化表单数据

<script>

import teacherApi from '@/api/edu/teacher'

export default {

    data(){

        return {

            teacher:{

                name: '',

                sort: 0,

                level: 1,

                career: '',

                intro: '',

                avatar: ''

            },

            saveBtnDisabled: false // 保存按钮是否禁用,

        }

    },

    created(){//页面渲染之前执行

        this.init()

    },

    watch: {//监听

        $route(to,from) { //路由变化方式,路由发生变化,方法就会执行

        this.init()

       }

    },

    methods:{

        init(){

            //判断路径是否有id值

            if (this.$route.params && this.$route.params.id) {

                //从路径获取id值

                const id = this.$route.params.id

                //调用根据id查询的方法

                this.getInfo(id)

            }else{//路径中没有id值,做添加

                //清空表单

                this.teacher = {}

            }

        },

.......

}

</script>


05-后端业务的灵活优化

相关文章

  • day05项目【讲师管理模块前端开发】

    改造登录到本地接口 一、跨域配置 1、什么是跨域 浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议...

  • 前端模块化历史演进

    模块化开发是当下最重要的前端开发规范之一,随着前端项目日益复杂,项目代码已经膨胀到需要花费大量时间去管理的程度,模...

  • webpack执行方式

    最近在学习webpack,他是一个模块打包工具,用来构建前端开发项目,方便前端开发中的文件管理与打包,感兴趣的朋友...

  • package-lock.json的作用

    前言 模块化开发在前端越来越流行,使用 node 和 npm 可以很方便的下载管理项目所需的依赖模块。packag...

  • vue 开发工具安装介绍

    vue 开发工具安装介绍 npm(node包管理工具) 前端项目框架和模块的下载管理工具,类似后台maven工具,...

  • vue后台管理系统实践方案总结

    这个是一个电商管理系统的前端项目的笔记,这个项目主要包括登录/退出功能、主页布局、用户管理模块、权限管理模块、分类...

  • webpack与模块化开发

    现代化项目 要求前端有独立的项目 采用数据驱动开发的方式增强可维护性 复杂项目结构必须进行模块化管理 重复规律性工...

  • 模块化的演进过程

    现代化项目 要求前端有独立的项目 采用数据驱动开发的方式增强可维护性 复杂项目结构必须进行模块化管理 重复规律性工...

  • 关于后台管理系统前端项目的思考

    关于后台管理系统前端项目的思考 开发后台管理系统是大部分前端开发人员接触过的项目,如何更好的进行项目的搭建、组件的...

  • 初探Electron,从入门到实践

    讲师简介: 刘涛 —— GrapeCity SpreadJS 项目组资深开发工程师,在前端开发领域耕耘多年,热衷于...

网友评论

      本文标题:day05项目【讲师管理模块前端开发】

      本文链接:https://www.haomeiwen.com/subject/jafsqktx.html