【Vue + Koa 前后端分离项目实战7】使用开源框架==>快速搭建后台管理系统 -- part7 前端实现最新期刊管理【增删查改】

人生没有白走的路,每一步都作数。

对应后端部分章节回顾:

【Vue + Koa 前后端分离项目实战5】使用开源框架==>快速搭建后台管理系统 -- part5 后端实现最新期刊列表管理【增删查改】_小白Rachel的博客-CSDN博客


效果展示:

 


目录

一、路由创建

 二、最新期刊列表

1.编写静态页面效果

2.模型层定义方法获取接口数据 

3.效果展示

三、最新期刊新增

        1.前端页面代码

2.(关键)级联选择器options格式化处理

3.添加页面逻辑

4.模型层定义方法获取接口数据 

5.效果展示

四、最新期刊编辑

1.编写页面逻辑

2.模型层定义方法获取接口数据

3.效果展示

 五、最新期刊删除 

1.前端页面逻辑

2.模型层定义方法获取接口数据

3.效果展示

本篇核心新学内容

往期回顾


一、路由创建

打开路由配置文件 src-->config-->stage-->content.js 添加新页面路由。并创建页面文件flow.js

{
      title: '最新期刊',
      type: 'view',
      name: 'flow',
      route: '/content/flow',
      filePath: 'views/content/Flow.vue',
      inNav: true,
      icon: 'iconfont icon-tushuguanli',
    },

 

 二、最新期刊列表

1.编写静态页面效果

在views目录下的content文件夹添加Flow.vue文件。并添加如下代码(对于前端开发,这些很简单,么有什么要讲的)

Flow.vue
<template>
  <div class="container">
    <div class="title">最新期刊列表</div>
    <div class="add-button">
      <el-button type="primary" @click="handleAdd()" v-permission="'新增最新期刊'">关联期刊</el-button>
    </div>
    <div class="table-container">
      <el-table :data="tableData" border highlight-current-row :cell-style="{ 'text-align': 'center' }">
        <el-table-column label="序号" width="60" type="index"></el-table-column>
        <el-table-column label="内容标题" prop="detail.title"></el-table-column>
        <el-table-column label="内容类型" prop="type">
          <template slot-scope="scope">
            {
   
   { type[scope.row.type] }}
          </template>
        </el-table-column>
        <el-table-column label="内容介绍" prop="detail.content"></el-table-column>
        <el-table-column label="排序" prop="index"></el-table-column>
        <el-table-column label="是否展示" >
          <templete slot-scope="scope">
            <el-tag v-if="scope.row.status === 1" type="success">展示中</el-tag>
            <el-tag v-else type="info">未展示</el-tag>
          </templete>
        </el-table-column>
        <el-table-column label="操作" >
          <template slot-scope="scope">
            <el-button @click="handleEdit(scope.row)" v-permission="'编辑最新期刊列表'">编辑</el-button>
            <el-button @click="handleDelete(scope.row)" v-permission="'删除最新期刊列表内容'" type="danger">删除</el-button>
          </template>
        </el-table-column>
      </el-table>
    </div>
  </div>
</template>

<script>
export default {
  name: 'Flow',
  data() {
    return {
      tableData: [],
      type: {
        100: '电影',
        200: '音乐',
        300: '句子'
      }
    }
  },
  methods: {
    handleAdd() {},
    handleEdit() {},
    handleDelete() {}
  }
}
</script>

<style scoped lang="scss">
.container {
  .title {
    height: 59px;
    line-height: 59px;
    color: $parent-title-color;
    font-size: 16px;
    font-weight: 500;
    text-indent: 40px;
    border-bottom: 1px solid #dae1ec;
  }
  .add-button {
    padding: 20px 40px;
  }
  .table-container {
    padding: 0 40px 20px 40px;
  }
}
</style>

2.模型层定义方法获取接口数据 

(1)在models的content.js文件下编写调用接口的函数

import { get, post, put, _delete } from '@/lin/plugins/axios'

class Flow {
  // 列表数据
  static async getFlowList() {
    const res = await get('v1/flow')
    return res
  }
}

export { Flow as FLowModel }

(2)在前端页面使用该方法。实现列表效果

created() {
    this.getFlowList()
  },
  methods: {
    async getFlowList() {
      this.tableData = await FLowModel.getFlowList()
    },
}

3.效果展示

三、最新期刊新增

说明:最新期刊的新增并不涉及到真实的添加,在数据库总主要是进行【关联】操作。针对期刊列表选中期刊【关联】到最新期刊。因此这里的新增需要注意。对应的后端逻辑方面请参考对应章节。

1.前端页面代码

(1)在页面添加dialog对话框

添加的对话框部分代码如下,还需要添加对应的属性值。

<el-dialog
        :title="dialogTitle"
        width="800px"
        :visible.sync="showDialog"
        :close-on-click-modal="false"
        :close-on-press-escape="false"
        @close="resetForm"
    >
      <el-form ref="form" :model="temp" label-width="90px" :rules="rules">
        <el-form-item label="排序" prop="index">
          <el-input-number v-model="temp.index" :min="1"></el-input-number>
        </el-form-item>
        <el-form-item label="期刊内容" prop="art">
          <el-cascader v-model="temp.art" :options="options"></el-cascader>
        </el-form-item>
        <el-form-item label="是否展示" prop="status">
          <el-switch v-model="temp.status" :active-value="1" :inactive-value="0"></el-switch>
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="showDialog = false">取 消</el-button>
        <el-button type="primary" @click="dialogTitle == '关联期刊' ? confirmAdd() : confirmEdit()">保 存</el-button>
      </span>
    </el-dialog>

(2)定义表单和表单校验规则

在期刊内容部分使用到了【级联选择器】这里是重点内容,需要满足固定的options格式

rules: {
        art: [{
          required: true, message: '期刊内容不能为空', trigger: 'blur'
        }]
      },

2.(关键)级联选择器options格式化处理

定义函数getContentOptions() 

函数实现思路:1.获取所有期刊内容  2.数据格式化_generateOptionsData()

并最终吧数据绑定在this.options上

async getContentOptions() {
      // 获取所有期刊内容
      const contentList = await ContentModel.getContentList()
      // 数据格式化
      this.options = this._generateOptionsData(contentList)
      console.log(this.options, '=========')
    },
    _generateOptionsData(data) {
      // 筛选出分类
      let types = []
      data.forEach(d => types.push(d.type))
      // 去重
      types = Array.from(new Set(types))
      // 构建一级分类选项
      const options = types.map(t => ({
        value: t,
        label: this.type[t],
        children: []
      }))
      // 往分类里添加子内容
      options.forEach((o, index) => {
        const children = []
        data.forEach(d => {
          if (d.type === o.value) {
            children.push({
              value: d.id,
              label: d.title,
              disabled: !d.status,
            })
          }
        })
        options[index].children = children
      })
      return options
    },

3.添加页面逻辑

(1)点击‘添加期刊’按钮,弹出对话框,并调用函数初始化options

handleAdd() {
      this.dialogTitle = '关联期刊'
      this.showDialog = true
      this.getContentOptions()
    },

(2)数据提交操作

调用表单校验函数===>传参 调用模型层方法 ==>处理返回结果并处理提示 ===>更新列表

confirmAdd() {
      this.$refs.form.validate(async valid => {
        if (valid) {
          const res = await FLowModel.addContentToFlow(this.temp.index, this.temp.art[0], this.temp.art[1], this.temp.status)
          this.$message.success(res.message)
          this.showDialog = false
          await this.getFlowList()
        }
      })
    },

4.模型层定义方法获取接口数据 

models/flow.js
// 新增
  static async addContentToFlow(index, type, art_id, status) {
    const res = await post('v1/flow', { index, type, art_id, status })
    return res
  }

5.效果展示

四、最新期刊编辑

1.编写页面逻辑

复用新建页面逻辑

(1)点击“编辑”按钮逻辑

回显数据(需要注意处理级联选择器的对象格式)==>记录当前修改id ==>显示弹框==>获取options数据

handleEdit(row) {
      this.id = row.id
      this.showDialog = true
      this.temp.index = row.index
      this.temp.art = [row.detail.type, row.detail.id]
      this.temp.status = row.status
      this.dialogTitle = '编辑期刊'
      this.showDialog = true
      this.getContentOptions()
    },

(2) 提交编辑操作

类比新建操作即可。需要传递id

confirmEdit() {
      this.$refs.form.validate(async valid => {
        if (valid) {
          const res = await FLowModel.editFlow(this.id, this.temp.index, this.temp.art[0], this.temp.art[1], this.temp.status)
          this.$message.success(res.message)
          this.showDialog = false
          await this.getFlowList()
        }
      })
    },

2.模型层定义方法获取接口数据

// 编辑
  static async editFlow(id, index, type, art_id, status) {
    const res = await put(`v1/flow/${id}`, { id, index, type, art_id, status })
    return res
  }

3.效果展示

 五、最新期刊删除 

1.前端页面逻辑

(1)添加删除对话框

<el-dialog title="提示" :visible.sync="showDeleteDialog" width="400px">
      <span>确认删除内容</span>
      <span slot="footer" class="dialog-footer">
        <el-button @click="showDeleteDialog = false">取 消</el-button>
        <el-button type="danger" @click="confirmDelete()">删 除</el-button>
      </span>
    </el-dialog>

(2)删除逻辑 

async confirmDelete() {
      const res = await FLowModel.deleteFlow(this.id)
      this.$message.success(res.message)
      this.showDeleteDialog = false
      await this.getFlowList()
    }

2.模型层定义方法获取接口数据

// 删除
  static async deleteFlow(id) {
    console.log(id)
    // debugger
    const res = await _delete(`v1/flow/${id}`)
    return res
  }

3.效果展示


 本篇核心新学内容

使用【级联选择器】需要对应拼凑级联选择器的options的数据格式。====新增和编辑操作


往期回顾

第一节:简单介绍了林间有风框架

【Vue + Koa 前后端分离项目实战】使用开源框架==>快速搭建后台管理系统 -- part1 项目搭建_小白Rachel的博客-CSDN博客_vue快速搭建管理系统

第二到第五节:展开讲解后端部分【期刊列表】【最新期刊】的增删查改功能

【Vue + Koa 前后端分离项目实战2】使用开源框架==>快速搭建后台管理系统 -- part2 后端新增期刊功能实现_小白Rachel的博客-CSDN博客_vue+koa

【Vue + Koa 前后端分离项目实战3】使用开源框架==>快速搭建后台管理系统 -- part3 权限控制+行为日志_小白Rachel的博客-CSDN博客_koa权限管理 【Vue + Koa 前后端分离项目实战4】使用开源框架==>快速搭建后台管理系统 -- part4 后端实现【增删改查】功能_小白Rachel的博客-CSDN博客_利用koa搭后台管理系统

【Vue + Koa 前后端分离项目实战5】使用开源框架==>快速搭建后台管理系统 -- part5 后端实现最新期刊列表管理【增删查改】_小白Rachel的博客-CSDN博客

第六到第七节:展开讲解前端功能实现

【Vue + Koa 前后端分离项目实战6】使用开源框架==>快速搭建后台管理系统 -- part6 前端实现期刊列表管理【增删查改】_小白Rachel的博客-CSDN博客

猜你喜欢

转载自blog.csdn.net/Sabrina_cc/article/details/128446459
今日推荐