快盘下载:好资源、好软件、快快下载吧!

快盘排行|快盘最新

当前位置:首页软件教程电脑软件教程 → 【Vue实战】使用vue-admin-template模板开发后台管理

【Vue实战】使用vue-admin-template模板开发后台管理

时间:2022-10-08 10:28:12人气:作者:快盘下载我要评论

文章目录

一、搭建项目前端环境1、vue-admin-template模板2、搭建环境3、修改登录功能3.1、创建登录接口3.2、修改登录前端;1;修改接口路径;2;修改js文件 二、跨域问题1、什么是跨域2、配置 三、设置自定义路由1、修改路由2、创建vue组件3、form.vue4、list.vue 四、讲师分页列表1、定义api2、初始化vue组件3、定义data4、定义methods5、表格渲染6、分页组件7、顶部查询表单 五、讲师删除1、定义api2、定义methods 六、讲师新增1、定义api2、初始化组件3、实现新增功能 七、讲师修改-数据回显1、定义api2、组件中调用api3、页面渲染前调用fetchDataById 八、讲师修改-更新1、定义api2、组件中调用api3、完善saveOrUpdate方法 九、讲师批量删除1、定义api2、初始化组件3、实现功能 十、讲师模块接口1、讲师模块

一、搭建项目前端环境

1、vue-admin-template模板

vue-admin-template是基于vue-element-admin的一套后台管理系统基础模板;最少精简版;;可作为模板进行二次开发。

【Vue实战】使用vue-admin-template模板开发后台管理

GitHub地址;https://github.com/PanJiaChen/vue-admin-template

2、搭建环境

# 解压压缩包
# 进入目录
cd vue-admin-template-master

# 安装依赖
npm install

# 启动。执行后;浏览器自动弹出并访问http://localhost:9528/
npm run dev

3、修改登录功能

3.1、创建登录接口

创建LoginController

;RestController
;RequestMapping(;/admin/vod/user;)
;CrossOrigin
public class LoginController {
    /**
     * 登录
     * ;return
     */
    ;PostMapping(;login;)
    public Result login() {
        Map<String, Object> map = new HashMap<>();
        map.put(;token;,;admin;);
        return Result.ok(map);
    }
    /**
     * 获取用户信息
     * ;return
     */
    ;GetMapping(;info;)
    public Result info() {
        Map<String, Object> map = new HashMap<>();
        map.put(;roles;,;[admin];);
        map.put(;name;,;admin;);
        map.put(;avatar;,;https://oss.aliyuncs.com/aliyun_id_photo_bucket/default_handsome.jpg;);
        return Result.ok(map);
    }
    /** 		
     * 退出
     * ;return
     */
    ;PostMapping(;logout;)
    public Result logout(){
        return Result.ok();
    }
}
3.2、修改登录前端
;1;修改接口路径

;2;修改js文件

【Vue实战】使用vue-admin-template模板开发后台管理

import request from ;;/utils/request;

export function login(data) {
  return request({
    url: ;/admin/vod/user/login;,
    method: ;post;,
    data
  })
}

export function getInfo(token) {
  return request({
    url: ;/admin/vod/user/info;,
    method: ;get;,
    params: { token }
  })
}

export function logout() {
  return request({
    url: ;/admin/vod/user/logout;,
    method: ;post;
  })
}

二、跨域问题

1、什么是跨域

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

;2;跨域的本质;浏览器对Ajax请求的一种限制

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

2、配置

在Controller类上添加注解

;CrossOrigin //跨域

三、设置自定义路由

1、修改路由

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

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

 export const constantRouterMap = [
  { path: ;/login;, component: () => import(;;/views/login/index;), hidden: true },
  { path: ;/404;, component: () => import(;;/views/404;), hidden: true },
  // 首页
  {
    path: ;/;,
    component: Layout,
    redirect: ;/dashboard;,
    name: ;Dashboard;,
    children: [{
      path: ;dashboard;,
      component: () => import(;;/views/dashboard/index;),
      meta: { title: ;硅谷课堂后台管理系统;, icon: ;dashboard; }
    }]
  },
    // 讲师管理
    {
      path: ;/vod;,
      component: Layout,
      redirect: ;/vod/course/list;,
      name: ;Vod;,
      meta: {
        title: ;点播管理;,
        icon: ;el-icon-bank-card;
      },
      alwaysShow: true,
      children: [
        {
          path: ;teacher/list;,
          name: ;TeacherList;,
          component: () => import(;;/views/vod/teacher/list;),
          meta: { title: ;讲师列表; }
        },
        {
          path: ;teacher/create;,
          name: ;TeacherCreate;,
          component: () => import(;;/views/vod/teacher/form;),
          meta: { title: ;添加讲师; },
          hidden: true
        },
        {
          path: ;teacher/edit/:id;,
          name: ;TeacherEdit;,
          component: () => import(;;/views/vod/teacher/form;),
          meta: { title: ;编辑讲师; },
          hidden: true
        }
      ]
    },
  { path: ;*;, redirect: ;/404;, hidden: true }
]

2、创建vue组件

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

【Vue实战】使用vue-admin-template模板开发后台管理

3、form.vue

<template>
  <div class=;app-container;>
    讲师表单
  </div>
</template>

4、list.vue

<template>
  <div class=;app-container;>
    讲师列表
  </div>
</template>

四、讲师分页列表

1、定义api

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

import request from ;;/utils/request;

const api_name = ;/admin/vod/teacher;

export default {
	//讲师列表
    pageList(page, limit, searchObj) {
        return request({
            url: ;${api_name}/${page}/${limit};,
            method: ;post;,
            data: searchObj
        })
    }
}

2、初始化vue组件

src/views/vod/teacher/list.vue

<template>
  <div class=;app-container;>
    jiang;shi列表
  </div>
</template>
<script>
import teacherApi from ;;/api/vod/teacher;
export default {
  // 定义数据模型
  data() {
    return {
    }
  },
  // 页面渲染成功后获取数据
  created() {
    this.fetchData()
  },
  // 定义方法
  methods: {
    fetchData() {
    }
  }
}
</script>

3、定义data

  // 定义数据模型
  data() {
    return {
      list: [], // 讲师列表
      total: 0, // 总记录数
      page: 1, // 页码
      limit: 10, // 每页记录数
      searchObj: {}, // 查询条件
      multipleSelection: []// 批量删除选中的记录列表
    }
  },

4、定义methods

  methods: {
    fetchData() {
      // 调用api
      teacherApi.pageList(this.page, this.limit, this.searchObj).then(response => {
        debugger
        this.list = response.data.records
        this.total = response.data.total
      })
    },
  }

5、表格渲染

<!-- 表格 -->
<el-table
  :data=;list;
  border
  stripe
  ;selection-change=;handleSelectionChange;>
  <el-table-column type=;selection;/>
  <el-table-column
    label=;#;
    width=;50;>
    <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=;90;>
    <template slot-scope=;scope;>
      <el-tag v-if=;scope.row.level === 1; type=;success; size=;mini;>高级讲师</el-tag>
      <el-tag v-if=;scope.row.level === 0; size=;mini;>首席讲师</el-tag>
    </template>
  </el-table-column>
  <el-table-column prop=;intro; label=;简介; />
  <el-table-column prop=;sort; label=;排序; width=;60; />
  <el-table-column prop=;joinDate; label=;入驻时间; width=;160; />
  <el-table-column label=;操作; width=;200; align=;center;>
    <template slot-scope=;scope;>
      <el-button type=;text; size=;mini; ;click=;removeById(scope.row.id);>删除</el-button>
      <router-link :to=;;/vod/teacher/edit/;;scope.row.id;>
        <el-button type=;text; size=;mini;>修改</el-button>
      </router-link>
    </template>
  </el-table-column>
</el-table>

6、分页组件

  <!-- 分页组件 -->
  <el-pagination
    :current-page=;page;
    :total=;total;
    :page-size=;limit;
    :page-sizes=;[5, 10, 20, 30, 40, 50, 100];
    style=;padding: 30px 0; text-align: center;;
    layout=;total, sizes, prev, pager, next, jumper;
    ;size-change=;changePageSize;
    ;current-change=;changeCurrentPage;
  />

7、顶部查询表单

<!--查询表单-->
<el-card class=;operate-container; shadow=;never;>
  <el-form :inline=;true; class=;demo-form-inline;>
  <el-form-item label=;名称;>
    <el-input v-model=;searchObj.name; placeholder=;讲师名; /> 
  </el-form-item>

  <el-form-item label=;头衔;>
    <el-select v-model=;searchObj.level; clearable placeholder=;头衔;>
      <el-option value=;1; label=;高级讲师;/>
      <el-option value=;0; label=;首席讲师;/>
    </el-select>
  </el-form-item>

  <el-form-item label=;入驻时间;>
    <el-date-picker
      v-model=;searchObj.joinDateBegin;
      placeholder=;开始时间;
      value-format=;yyyy-MM-dd; />
  </el-form-item>
  <el-form-item label=;-;>
    <el-date-picker
      v-model=;searchObj.joinDateEnd;
      placeholder=;结束时间;
      value-format=;yyyy-MM-dd; />
  </el-form-item>

    <el-button type=;primary; icon=;el-icon-search; ;click=;fetchData();>查询</el-button>
    <el-button type=;default; ;click=;resetData();>清空</el-button>
</el-form>
</el-card>

分页和清空方法

    // 每页记录数改变;size;回调参数;表示当前选中的“每页条数”
    changePageSize(size) {
      this.limit = size
      this.fetchData()
    },

    // 改变页码;page;回调参数;表示当前选中的“页码”
    changeCurrentPage(page) {
      this.page = page
      this.fetchData()
    },

    // 重置表单
    resetData() {
      this.searchObj = {}
      this.fetchData()
    },

五、讲师删除

1、定义api

src/api/vod/teacher.js

  removeById(id) {
    return request({
      url: ;${api_name}/remove/${id};,
      method: ;delete;
    })
  },

2、定义methods

src/views/vod/teacher/list.vue

使用MessageBox 弹框组件

// 根据id删除数据
removeById(id) {
  this.$confirm(;此操作将永久删除该记录, 是否继续?;, ;提示;, {
    confirmButtonText: ;确定;,
    cancelButtonText: ;取消;,
    type: ;warning;
  }).then(() => {
    return teacherApi.removeById(id)
  }).then((response) => {
    this.fetchData()
    this.$message.success(response.message)
  })
},

六、讲师新增

1、定义api

src/api/vod/teacher.js

save(teacher) {
  return request({
    url: ;${api_name}/save;,
    method: ;post;,
    data: teacher
  })
},

2、初始化组件

src/views/vod/teacher/form.vue

<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-date-picker v-model=;teacher.joinDate; value-format=;yyyy-MM-dd; />
      </el-form-item>
      <el-form-item label=;讲师排序;>
        <el-input-number v-model=;teacher.sort; :min=;0;/>
      </el-form-item>
      <el-form-item label=;讲师头衔;>
        <el-select v-model=;teacher.level;>
          <!--
            数据类型一定要和取出的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.intro;/>
      </el-form-item>
      <el-form-item label=;讲师资历;>
        <el-input v-model=;teacher.career; :rows=;10; type=;textarea;/>
      </el-form-item>

      <!-- 讲师头像 -->
      <el-form-item label=;讲师头像;>
      </el-form-item>

      <el-form-item>
        <el-button type=;primary; ;click=;saveOrUpdate();>保存</el-button>
      </el-form-item>
    </el-form>
  </div>
</template>

3、实现新增功能

<script>
import teacherApi from ;;/api/vod/teacher;
export default {
  data() {
    return {
      BASE_API: ;http://localhost:8301;,
      // 初始化讲师默认数据
      teacher: {
        sort: 0,
        level: 1
      },
      saveBtnDisabled: false // 保存按钮是否禁用;防止表单重复提交
    }
  },
  // 页面渲染成功
  created() {
 
  },
  methods: {
    saveOrUpdate() {
    // 禁用保存按钮
      this.saveBtnDisabled = true
      if (!this.teacher.id) {
        this.saveData()
      } else {
        this.updateData()
      }
    },
    // 新增讲师
    saveData() {
    // debugger
      teacherApi.save(this.teacher).then(response => {
        this.$message({
          type: ;success;,
          message: response.message
        })
        this.$router.push({ path: ;/vod/teacher/list; })
      })
    },
    // 根据id更新记录
    updateData() {
      
    }
  }
}
</script>

<style scoped>
  .avatar-uploader .avatar-uploader-icon {
    border: 1px dashed #d9d9d9;
    border-radius: 6px;
    cursor: pointer;
    position: relative;
    Overflow: hidden;

    font-size: 28px;
    color: #8c939d;
    width: 178px;
    height: 178px;
    line-height: 178px;
    text-align: center;
  }
  .avatar-uploader .avatar-uploader-icon:hover {
    border-color: #409EFF;
  }
  .avatar-uploader img {
    width: 178px;
    height: 178px;
    display: block;
  }
</style>

七、讲师修改-数据回显

1、定义api

src/api/vod/teacher.js

getById(id) {
	return request({
		url: ;${api_name}/get/${id};,
		method: ;get;
	})
},

2、组件中调用api

methods中定义fetchDataById

// 根据id查询记录
fetchDataById(id) {
	teacherApi.getById(id).then(response => {
		this.teacher = response.data
	})
},

3、页面渲染前调用fetchDataById

  // 页面渲染成功
  created() {
    if (this.$route.params.id) {
      this.fetchDataById(this.$route.params.id)
    }
  },

八、讲师修改-更新

1、定义api

  updateById(teacher) {
    return request({
      url: ;${api_name}/update;,
      method: ;put;,
      data: teacher
    })
  },

2、组件中调用api

methods中定义updateData

// 根据id更新记录
updateData() {
  // teacher数据的获取
  teacherApi.updateById(this.teacher).then(response => {
    this.$message({
      type: ;success;,
      message: response.message
    })
    this.$router.push({ path: ;/vod/teacher/list; })
  })
},

3、完善saveOrUpdate方法

saveOrUpdate() {
	// 禁用保存按钮
  	this.saveBtnDisabled = true
  	if (!this.teacher.id) {
    	this.saveData()
  	} else {
    	this.updateData()
  	}
},

九、讲师批量删除

1、定义api

src/api/vod/teacher.js

batchRemove(idList) {
  return request({
    url: ;${api_name}/batch-remove;,
    method: ;delete;,
    data: idList
  })
},

2、初始化组件

src/views/vod/teacher/list.vue

在table组件上添加 批量删除 按钮

<!-- 工具按钮 -->
<el-card class=;operate-container; shadow=;never;>
  <i class=;el-icon-tickets; style=;margin-top: 5px;></i>
  <span style=;margin-top: 5px;>数据列表</span>
  <el-button class=;btn-add; ;click=;add(); style=;margin-left: 10px;;>添加</el-button>
  <el-button class=;btn-add; ;click=;batchRemove(); >批量删除</el-button>
</el-card>

在table组件上添加复选框

<!-- 表格 -->
<el-table
  :data=;list;
  border
  stripe
  ;selection-change=;handleSelectionChange;>
  <el-table-column type=;selection;/>

3、实现功能

data定义数据

multipleSelection: []// 批量删除选中的记录列表

完善方法

// 批量删除
batchRemove() {
  if (this.multipleSelection.length === 0) {
    this.$message.warning(;请选择要删除的记录;;)
    return
  }
  this.$confirm(;此操作将永久删除该记录, 是否继续?;, ;提示;, {
    confirmButtonText: ;确定;,
    cancelButtonText: ;取消;,
    type: ;warning;
  }).then(() => {
    // 点击确定;远程调用ajax
    // 遍历selection;将id取出放入id列表
    var idList = []
    this.multipleSelection.forEach(item => {
      idList.push(item.id)
    })
    // 调用api
    return teacherApi.batchRemove(idList)
  }).then((response) => {
    this.fetchData()
    this.$message.success(response.message)
  }).catch(error => {
    if (error === ;cancel;) {
      this.$message.info(;取消删除;)
    }
  })
},
// 当多选选项发生变化的时候调用
handleSelectionChange(selection) {
  console.log(selection)
  this.multipleSelection = selection
},

十、讲师模块接口

1、讲师模块

;Api(tags = ;讲师管理;)
;RestController
;RequestMapping(value=;/admin/vod/teacher;)
;CrossOrigin
public class TeacherController {

    ;Autowired
    private TeacherService teacherService;

    //查询所有讲师列表
    ;ApiOperation(;查询所有讲师;)
    ;GetMapping(;findAll;)
    public Result findAll(){
        /*try {
            int i = 10/0;
        } catch (Exception e) {
            throw new GgktException(201,;出现自定义异常;);
        }*/
        List<Teacher> list = teacherService.list();
        return Result.ok(list);
    }

    ;DeleteMapping(;remove/{id};)
    public Result remove(;PathVariable Long id){
        boolean flag = teacherService.removeById(id);
        if(flag){
            return Result.ok(null);

        }else {
            return Result.fail(null);
        }
    }

    //条件查询分页列表
    ;ApiOperation(value = ;获取分页列表;)
    ;PostMapping(;findQueryPage/{page}/{limit};)
    public Result index(
            ;ApiParam(name = ;page;, value = ;当前页码;, required = true)
            ;PathVariable Long page,
            ;ApiParam(name = ;limit;, value = ;每页记录数;, required = true)
            ;PathVariable Long limit,
            ;ApiParam(name = ;teacherVo;, value = ;查询对象;, required = false)
            ;RequestBody(required = false) TeacherQueryVo teacherQueryVo) {
        //创建page对象;传递当前页和每页记录数
        Page<Teacher> pageParam = new Page<>(page, limit);
        //获取条件值
        String name = teacherQueryVo.getName();//讲师名称
        Integer level = teacherQueryVo.getLevel();//讲师级别
        String joinDateBegin = teacherQueryVo.getJoinDateBegin();//开始时间
        String joinDateEnd = teacherQueryVo.getJoinDateEnd();//结束时间
        //封装条件
        QueryWrapper<Teacher> wrapper = new QueryWrapper<>();
        if(!StringUtils.isEmpty(name)) {
            wrapper.like(;name;,name);
        }
        if(!StringUtils.isEmpty(level)) {
            wrapper.eq(;level;,level);
        }
        if(!StringUtils.isEmpty(joinDateBegin)) {
            wrapper.ge(;join_date;,joinDateBegin);
        }
        if(!StringUtils.isEmpty(joinDateEnd)) {
            wrapper.le(;join_date;,joinDateEnd);
        }
        //调用方法得到分页查询结果
        IPage<Teacher> pageModel = teacherService.page(pageParam, wrapper);
        return Result.ok(pageModel);
    }

    ;ApiOperation(value = ;新增;)
    ;PostMapping(;save;)
    public Result save(;RequestBody Teacher teacher) {
        teacherService.save(teacher);
        return Result.ok(null);
    }

    ;ApiOperation(value = ;获取;)
    ;GetMapping(;get/{id};)
    public Result get(;PathVariable Long id) {
        Teacher teacher = teacherService.getById(id);
        return Result.ok(teacher);
    }

    ;ApiOperation(value = ;修改;)
    ;PutMapping(;update;)
    public Result updateById(;RequestBody Teacher teacher) {
        teacherService.updateById(teacher);
        return Result.ok(null);
    }

    ;ApiOperation(value = ;根据id列表删除;)
    ;DeleteMapping(;batchRemove;)
    public Result batchRemove(;RequestBody List<Long> idList) {
        teacherService.removeByIds(idList);
        return Result.ok(null);
    }
}

网友评论

快盘下载暂未开通留言功能。

关于我们| 广告联络| 联系我们| 网站帮助| 免责声明| 软件发布

Copyright 2019-2029 【快快下载吧】 版权所有 快快下载吧 | 豫ICP备10006759号公安备案:41010502004165

声明: 快快下载吧上的所有软件和资料来源于互联网,仅供学习和研究使用,请测试后自行销毁,如有侵犯你版权的,请来信指出,本站将立即改正。