在线教育-谷粒学院学习笔记(三)

news2024/12/28 18:44:25

文章目录

    • 1 搭建前端项目环境
    • 2 前端页面框架介绍
    • 3 讲师管理前端开发
    • 4 后台系统登录功能改造到本地
    • 5 前端框架开发过程
    • 6 讲师列表前端实现
    • 7 讲师分页前端实现
    • 8 讲师条件查询前端实现
    • 9 讲师删除功能前端实现
    • 10 讲师添加前端实现
    • 11 讲师修改前端实现
    • 12 前端路由切换问题解决

1 搭建前端项目环境

  • B2C模式

    • 管理员——后台管理系统
      • 后端接口
      • 前端页面
    • 用户——前台用户系统
  • 选取模板 环境搭建 vue-admin-template

    • 使用模板:vue-admin-template-master
    • webstorm打开项目
    • 通过配置文件下载依赖npm install或解压文件中的node_modules并复制到项目中
    • 启动项目:npm run dev

2 前端页面框架介绍

  • 前端框架入口
    • index.html
    • main.js
  • 前端页面环境使用框架(模板)
    • vue-admin-template = vue + element-ui
  • build目录
    • 放项目构建的脚步文件
  • config目录
    • index.js 修改:useEslint: false
    • dev.env.js 修改访问后端接口地址
  • src目录
    • api:定义调用方法
    • assets:静态资源
    • components:组件
    • icons:图标
    • router:路由
    • utils:工具类
    • views:具体页面

3 讲师管理前端开发

  • 讲师列表(分页条件查询)
  • 讲师添加
  • 讲师删除
  • 讲师修改

vue-admin-template模板进行前端开发

首先把后台管理系统登录改造本地(临时),后面再把登录添加权限框架 spring security

4 后台系统登录功能改造到本地

  • 更改系统登录默认地址

    • https://easy-mock.com/mock/5950a2419adc231f356a6636/vue-admin/user/login
      =>http://localhost:8001/user/login
      
  • 修改配置文件请求地址,在config/dev.env.js,修改:BASE_API: '"http://localhost:8001"'

  • 进行登录需要调用两个方法,所以要创建接口两个方法实现登录

    • login:登录操作——返回token
    • info:登录后获取用户信息——返回:roles、name、avatar
  • 开发接口Controller

    @RestController
    @RequestMapping("/eduservice/user")
    public class EduLoginController {
        // login
        @PostMapping("login")
        public R login() {
            return R.ok().data("token", "admin");
        }
    
        // info
        @GetMapping("info")
        public R info() {
            return R.ok().data("roles", "[admin]").data("name", "admin").data("avatar", "https://profile.csdnimg.cn/9/0/4/1_mys_mys");
        }
    }
    
  • 修改api/login.js,改为本地接口路径 url: '/eduservice/user/login'

  • 在这里插入图片描述

    • 跨域问题:协议、IP地址、端口号有一个不一样

    • 解决方式

      • 后端接口controller中加注解

        @CrossOrigin // 跨域访问
        public class EduLoginController {}
        
      • 使用网关解决

5 前端框架开发过程

  • 添加路由 src/router/index.js

  • 点击某个路由,显示路由对应的页面,并在views中创建vue

    component: () => import('@/views/form/index'),
    
  • 在api文件夹创建js文件,定义接口地址和参数

    import request from '@/utils/request'
    export function getList(params) {
      return request({
        url: '/table/list',
        method: 'get',
        params
      })
    }
    
  • 在创建的vue页面引入js文件,调用方法实现功能

    import user from ...
    data: {},
    created: {},
    methods: {}
    
  • 使用element-ui显示数据内容

6 讲师列表前端实现

1 添加路由

src/router/index.js

{
    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: 'save',
        name: '添加讲师',
        component: () => import('@/views/edu/teacher/save'),
        meta: { title: '添加讲师', icon: 'tree' }
      }
    ]
  },

2 创建路由对应的页面

views/edu/teacher/list.vue save.vue

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

3 在api文件夹创建edu/teacher.js定义访问的接口地址

import request from '@/utils/request'

export default {
  // 1 讲师列表
  // current:当前页 limit:每页记录数 teacherQuery:条件对象
  getTeacherListPage(current, limit, teacherQuery) {
    return request({
      url: `/eduservices/teacher/pageTeacherCondition/${current}/${limit}`,
      method: 'post',
      // teacherQuery条件对象,后端使用RequestBody获取数据
      // data表示把对象转换成json进行传递到接口里
      data: teacherQuery
    })
  }
}

4 在讲师列表页面list.vue调用定义的接口方法,得到返回的数据

<script>
// 引入调用teacher.js文件
import teacher from '@/api/edu/teacher'

export default {
  // 核心代码位置
  data() { // 定义变量和初始值
    return {
      list: null, // 查询之后接口返回集合
      page: 1, // 当前页
      limit: 10, // 每页记录数
      total: 0, // 总记录数
      teacherQuery: {} // 条件封装对象
    }
  },
  created() { // 页面渲染之前执行,一般调用methods定义的方法
    // 调用
    this.getList()
  },
  methods: { // 创建具体的方法,调用teacher.js定义的方法
    // 讲师列表的方法
    getList() {
      teacher.getTeacherListPage(this.page, this.limit, this.teacherQuery)
        .then(response => { // 请求成功
          this.list = response.data.rows
          this.total = response.data.total
          console.log(this.list)
        })
        .catch(error => { // 请求失败
          console.log(error)
        })
    }
  }
}
</script>

5 把请求接口获取的数据在页面上显示

使用组件element-ui实现

<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"/>
    </el-table>
  </div>
</template>

7 讲师分页前端实现

1 讲师列表添加分页实现

<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"
    />

2 分页方法的修改,添加页码参数

getList(page = 1) {
  this.page = page
  ......
}  

8 讲师条件查询前端实现

1、使用element-ui组件实现,在列表上添加条件输入表单,使用v-model数据绑定

2、清空功能

  • 清空表单输入条件数据

  • 查询所有的数据

    resetData() {
      // 表单输入项数据清空
      this.teacherQuery = {}
      // 查询所有讲师数据
      this.getList()
    }
    
<!--查询表单-->
<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>

9 讲师删除功能前端实现

1 在每条记录后面添加删除按钮

2 在按钮上绑定事件

@click=“removeDataById”

3 在绑定事件的方法传递删除讲师的id值

scope.row.id

<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>

4 在api/edu/teacher.js定义删除接口的地址

deleteTeacherId(id) {
  return request({
    url: `/eduservice/teacher/${id}`,
    method: 'delete'
  })
}

5 在页面中调用方法,实现删除

removeDataById(id) {
  this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
    confirmButtonText: '确定',
    cancelButtonText: '取消',
    type: 'warning'
  }).then(() => { // 点击确认,执行then方法
    // 调用删除讲师方法
    teacher.deleteTeacherId(id)
      .then((response) => {
        // 提示信息
        this.$message({
          type: 'success',
          message: '删除成功!'
        })
        // 回到列表页面
        this.getList()
      })
  })
}

10 讲师添加前端实现

1 点击添加讲师按钮,进入表单页面,输入讲师信息

<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="讲师排序" prop="sort">
        <el-input-number v-model="teacher.sort" :min="0" controls-position="right" />
      </el-form-item>
      <el-form-item label="讲师头衔">
        <el-select v-model="teacher.level" clearable placeholder="请选择">
          <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>

2 在表单页面点击保存,提交接口,添加数据库

  • api/edu/teacher.js中定义接口

    addTeacher(teacher) {
      return request({
        url: `/eduservice/teacher/addTeacher`,
        method: 'post',
        data: teacher
      })
    }
    
  • 在页面中调用

saveTeacher() {
  teacherApi.addTeacher(this.teacher)
    .then((response) => {
      // 提示信息
      this.$message({
        type: 'success',
        message: '保存成功!'
      })
      // 回到列表页面 路由跳转
      this.$router.push({ path: '/teacher/table' })
    })
}

11 讲师修改前端实现

1 在每条记录后面添加修改按钮

2 点击修改按钮,进入表单页面,进行数据的回显

根据讲师id查询数据显示

3 通过路由跳转进入数据回显页面,在路由index页面添加路由

{
  path: 'edit/:id',
  name: '编辑讲师',
  component: () => import('@/views/edu/teacher/save'),
  meta: { title: '编辑讲师', noCache: 'tree' },
  hidden: true
}
<router-link to="'/teacher/edit' + scope.row.id">
  <el-button type="primary" size="mini" icon="el-icon-edit">修改</el-button>
</router-link>

4 在表单页面中实现数据回显

  • teacher.js中定义,根据id查询数据

    getTeacherInfo(id) {
      return request({
        url: `/eduservice/teacher/getTeacher/${id}`,
        method: 'get'
      })
    }
    
  • 在页面接口实现数据回显

    // 根据讲师id查询
    getInfo(id) {
      teacherApi.getTeacherInfo(id)
        .then((response) => {
          this.teacher = response.data.teacher
        })
    },
    
  • 调用根据id查询的方法

    • 添加和修改都使用save页面,只有在修改时查询数据回显
    • 判断路径中是否有讲师id值,有id值才修改
    created() {
      // 判断路径是否有id值
      if (this.$route.params && this.$route.params.id) {
        // 从路径获取id值
        const id = this.$route.params.id
        // 根虎id查询
        this.getInfo(id)
      }
    },
    

5 修改最终实现

  • 在teacher.js定义修改接口

    updateTeacher(teacher) {
      return request({
        url: `/eduservice/teacher/updateTeacher`,
        method: 'post',
        data: teacher
      })
    }
    
  • 在页面调用修改方法

updateTeacher() {
  teacherApi.updateTeacher(this.teacher)
    .then((response) => {
      // 提示信息
      this.$message({
        type: 'success',
        message: '修改成功!'
      })
      // 回到列表页面 路由跳转
      this.$router.push({ path: '/teacher/table' })
    })
}

12 前端路由切换问题解决

  • 第一次点击修改,进行数据回显,第二次再点击添加讲师,进入表单页面,但是表单页面回显的数据依然存在,正确效果应该是表单数据清空

  • 解决方式:添加讲师时,清空表单

    created() {
      // 判断路径是否有id值,有表示修改
      if (this.$route.params && this.$route.params.id) {
        // 从路径获取id值
        const id = this.$route.params.id
        // 根据id查询
        this.getInfo(id)
      } else {
        // 没有,表示添加,在添加前需要清空表单
        this.teacher = {}
      }
    },
    
  • 但是并没有解决问题,为什么?

  • 清空表单的方法放到created,第二次点击添加讲师时created里的方法并没有执行,created只在渲染之前执行

  • 最终解决:使用vue监听

    watch: { // 监听
      $route(to, from) { // 路由变化的方式,路由发生变化,监听就会执行
        this.init()
      }
    },
    created() {
      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 {
          // 没有,表示添加,在添加前需要清空表单
          this.teacher = {}
        }
      },
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/157530.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux工具学习之【gdb】

✨个人主页&#xff1a; Yohifo &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f38a;每篇一句&#xff1a; 图片来源 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 Whatever is worth doing is worth doing well. 任何值得去做的事情&#xff0…

【HTML】一款可交互的响应式登陆注册表单,你确定不来看看嘛(附源码)

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

2022年五一杯数学建模C题火灾报警系统问题求解全过程论文及程序

2022年五一杯数学建模 C题 火灾报警系统问题 原题再现&#xff1a; 二十世纪90年代以来&#xff0c;我国火灾探测报警产业化发展非常迅猛&#xff0c;从事火灾探测报警产品生产的企业已超过100家&#xff0c;年产值达几十亿元&#xff0c;已经成为我国高新技术产业的一个组成…

Docker之Nginx部署前端项目

目录 创建nginx容器 nginx.conf讲解 ①所有配置必须以“;”结尾 ②nginx发布java项目 nginx发布静态vue项目 nginxtomcat实现反向代理及均衡 nginxhtml静态服务器 创建nginx容器 docker run –name mynginx -d -p 80:80 -v /data/nginx/conf/nginx.conf:/etc/nginx/ngin…

6款强烈推荐的 SD卡/内存卡数据恢复软件

SD卡/内存卡在 21 世纪的作用比以往任何时候都更加重要。众所周知&#xff0c;SD卡/内存卡具有高数据传输率并且是便携式设备&#xff0c;大多数摄影师甚至智能手机用户主要依靠它们来保存所有个人或项目照片和视频。此外&#xff0c;SD 卡还因其与各种设备的兼容性而广受欢迎。…

JUC并发编程学习笔记——AQS个人理解

1. AQS引出 1.1 前置知识&#xff1a; 线程创建的四种方式&#xff1a;Thread、Runnable、callable、线程池 LockSupport的使用&#xff1a;park()和unpark()方法 LockSupport是一个工具类&#xff0c; 提供了基本的线程阻塞和唤醒功能&#xff0c;它是创建锁和其他同步组件的…

使用 NVIDIA NeuralVDB优化大规模稀疏

使用 NVIDIA NeuralVDB优化大规模稀疏 基于 OpenVDB 过去十年的发展&#xff0c;NVIDIA NeuralVDB 的推出对于处理极其庞大和复杂的数据集的开发人员和研究人员来说是一个游戏规则的改变者。 NVIDIA NeuralVDB 的预发布版本为 OpenVDB 带来了 AI 和 GPU 优化&#xff0c;将烟雾…

【OpenCV】:OpenCV人脸识别项目杂记

项目目标&#xff1a; 1.图片人脸识别 2.视频人脸识别 3.ESP32Cam摄像头网页视频人脸识别 项目效果视频&#xff1a; ESP32Cam摄像头人脸识别OpenCV本地视频人脸识别ESP32Cam摄像头人脸检测项目基础代码内容&#xff1a; 一、读取图片 # 导入cv模块 import cv2 as cv# 读取图…

如何设置Excel表格以“只读模式“打开

设置Excel表格以“只读模式”打开&#xff0c;可以防止意外修改表格内容&#xff0c;因为“只读模式”下的Excel无法直接保存&#xff0c;这样就不用担心表格意外修改&#xff0c;关闭时又不小心保存了。 这个模式我们可以通过“另存为”的方法来设置。 打开Excel表格后&…

【学习笔记之Linux】工具之gcc/g++

背景知识&#xff1a; gcc/g是一个编译器&#xff0c;注意区分编译器和编辑器&#xff0c;vim是是编辑器。简单的说&#xff0c;编辑器是我们敲代码的工具&#xff0c;我们在编辑器上写出我们需要实现的功能&#xff1b;编译器负责实现功能&#xff0c;把我们写的高级语言编译成…

马蹄集 古人的剩余定理

古人的剩余定理 难度&#xff1a;白银 ©时间限制&#xff1a;1秒 巴占用内存&#xff1a;64M 今有物不知其数&#xff0c; 三三数之剩二&#xff0c; 五五数之剩三&#xff0c; 七七数之剩二。 问物最少几何&#xff1f; #include <bits/stdc.h> using nam…

使用Paddle飞桨重写波士顿房价预测案例

1.Paddle飞桨设计之“道” 当读者使用飞桨框架编写多个深度学习模型后&#xff0c;会发现程序呈现出“八股文”的形态。即不同的程序员、使用不同模型、解决不同任务的时候&#xff0c;他们编写的建模程序是极其相似的。虽然这些设计在某些“极客”的眼里缺乏精彩&#xff0c;…

XJar加密工具java打的包jar包加密运行,防止反编译

XJar功能特性 基于对JAR包内资源的加密以及拓展ClassLoader来构建的一套程序加密启动&#xff0c;动态解密运行的方案&#xff0c;避免源码泄露以及反编译。支持Maven插件加密过程需要Go环境&#xff1b;加密后生成Go启动器&#xff0c;保护密码不泄露GitHub: GitHub - core-l…

JSP SSM网上预约挂号系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 JSPSSM网上预约挂号系统 是一套完善的系统源码&#xff0c;对理解JSP java SrpingMVC mybiats 框架 MVC编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;以及相应配套的设计文档 &#xff0c;系统主要采用B/S模式开发。研究的基本内容…

马蹄集 非常大的N

非常大的N 难度&#xff1a;白银 时间限制&#xff1a;1秒 巴占用内存&#xff1a;64M 编写程序求11/2-21/231/2-41/251/2..N1/2。 格式 输入格式&#xff1a;输入为正整数 输出格式&#xff1a;输出为浮点型&#xff08;保留六位小数&#xff09;。 #include <bits/stdc.h…

系统排障掉坑背锅?亚马逊云科技要为开发者研发提效了

出品 | CSDN 云计算任何中大型企业里的 IT 系统&#xff0c;都会有多个业务应用、多种开发语言、技术栈并存。尤其要进入云上现代化应用开发的企业和开发者&#xff0c;将面对云原生庞杂的技术分支。开发者的苦与痛&#xff1a;非功能性研发、故障排查被甩锅然而&#xff0c;IT…

深夜修复Linux桌面无法启动

玩了很久了&#xff0c;突然想学习一下&#xff0c;想做一个KDE任务栏的网速插件。 Netspeed Widget - KDE Store GitHub - dfaust/plasma-applet-netspeed-widget: Plasma 5 widget that displays the currently used network bandwidth deepin15 注销切换到 KDE Ctrl Alt …

Idea同步失败Unresolved dependency的解决办法

下载一些开源的库&#xff0c;经常会碰到一些同步问题&#xff0c;本文就该系列问题单独开一篇文章&#xff0c;和大家缕一缕这样的问题怎么解决。文章在实践过程中会保持同步更新&#xff0c;大家可以点击收藏以便于下次遇到类似问题可以快速找到解决办法。 IDEA的同步问题多…

Dbeaver连接TDengine时序数据库

前言 还是结合上一阶段的工作&#xff0c;为TPS满足合同里的要求&#xff0c;预研数据库切换为TDengine。所以查看数据的工具我得能连上去看&#xff0c;习惯了Dbeaver&#xff0c;所以先把Dbeaver整的能连接使用。 一、Dbeaver对TDengine支持情况 这个数据库是国产开源的时序数…

温酒读Qt:QObject 序篇

一、醉言醉语话夏娃 跟Qt框架打了这么久交道&#xff0c;Qt貌似对我的半斤八两知根知底&#xff0c;我对Qt的认知却还不到半斤八两。o(╥﹏╥)o 或许你知道Qt的meta-object和属性系统&#xff0c;或许你在写代码时无数次显示或者隐示的继承了QObject&#xff0c;不管人家是否乐…