后台项目 Express-Mysql-Vue3-TS-Pinia 菜单管理页面搭建

745 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情

菜单管理页面

引言

通过之前一段时间 ExpressMysql 的学习

这里尝试来搭建一个 后台系统 来巩固下学习的技术。

菜单管理

上一节,我们将 菜单表 处理完毕,并且能够通过接口,来获取到所有的菜单

现在我们将前端 菜单管理 的页面 进行搭建

这里先将最终页面展示出来

image.png

新增

首先是上方的 新增 按钮,是我们添加菜单的主要方式

<template>
    <el-tooltip class="item" effect="dark" content="新增" placement="top">
      <el-button size="mini" type="success" @click="addFunc">
        <svg-icon iconName="icon-shizi" color="#fff"></svg-icon>
      </el-button>
    </el-tooltip>
</template>


<script setup lang="ts">
import { onMounted, reactive, ref } from 'vue'

const state = reactive({
  addDialog: false,
})

const addFunc = () => {
  state.addDialog = true
}

</script>

可以看到会有一个点击方法,点击后,会弹出一个 dialog 来进行添加

弹框内容如下:

image.png

注意上级菜单使用的是,ElementPlus 提供的 TreeSelect 树形选择

非常的好用,效果如下

image.png

代码如下

<template>
    <el-dialog destroy-on-close v-model="state.addDialog" title="新增" width="500px">
      <AddDialog @close="closeFunc" />
    </el-dialog>
</template>

<script setup lang="ts">

import AddDialog from './addDialog.vue'

</script>
<template>
  <div>
    <el-form ref="ruleFormRef" :model="ruleForm" :rules="rules" label-width="100px" class="demo-ruleForm" status-icon label-position="left">
      <el-row style="margin-bottom: 30px">
        <el-col :span="24">
          <el-radio-group v-model="ruleForm.type" label="菜单类型">
            <el-radio-button v-for="(item, index) in state.typeName" :key="index" :label="index">{{ item }}</el-radio-button>
          </el-radio-group>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="24">
          <el-form-item label="菜单名称" prop="name">
            <el-input v-model="ruleForm.name" />
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="24">
          <el-form-item label="url 地址" prop="url">
            <el-input v-model="ruleForm.url" />
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="24">
          <el-form-item label="上级菜单" prop="pid">
            <el-tree-select v-model="ruleForm.pid" :data="data" check-strictly :render-after-expand="false" show-checkbox check-on-click-node />
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="24">
          <el-form-item label="菜单图标">
            <el-input v-model="ruleForm.icon" />
          </el-form-item>
        </el-col>
      </el-row>

      <el-row>
        <el-col :span="24">
          <el-form-item label="菜单排序">
            <el-input v-model="ruleForm.sort" />
          </el-form-item>
        </el-col>
      </el-row>
    </el-form>
    <div class="dialog-footer">
      <el-button type="text" @click="cancelFunc">取消</el-button>
      <el-button type="primary" @click="submitFunc(ruleFormRef)">确认</el-button>
    </div>
  </div>
</template>

<script setup lang="ts">
import { onMounted, reactive, ref, defineEmits } from 'vue'

const emits = defineEmits(['close'])

const state = reactive({
  typeName: ['菜单', '按钮']
})

const ruleFormRef = ref(null)
const ruleForm = reactive({
  name: '',
  type: 0,
  icon: '',
  url: '',
  sort: 0,
  pid: null
})

const rules = reactive({
  name: { required: true, message: '不能为空', trigger: 'blur' },
  url: { required: true, message: '不能为空', trigger: 'blur' },
  pid: { required: true, message: '不能为空', trigger: 'blur' }
})


const data = [
]

const cancelFunc = () => {
  emits('close', false)
}
const submitFunc = async (formEl) => {
  await formEl.validate((valid, fields) => {
    if (valid) {
      emits('close', true)
    } else {
      console.log('error')
    }
  })
}
</script>

<style lang="scss" scoped>
.dialog-footer {
  margin-top: 20px;
  display: flex;
  justify-content: end;
  align-items: center;
}
</style>

上面的 data 的代码量太多,这里就不贴了,具体的代码可以查看 TreeSelect 树形选择器 的代码示例

此时我们的新增页面就搭起来了

表格页面

这里先将代码图片进行粘贴

image.png

可以注意到,table 上,有一个关键的属性

就是 :tree-props="{ children: 'children', hasChildren: 'hasChildren' }">

它的一个作用就是,如果我们传入的 table 数据中,行数据中,若存在 children 属性的话,则会添加一个类似于 的展开形式,点击后就会进行展开。

而且也离不开另一个关键 属性 row-key="name"

image.png

image.png

此时我们的 菜单页面 初步搭建完毕

总结

通过 Express-Mysql-Vue3-TS-Pinia 做出一个 后台系统 项目

完成了,菜单管理页面 的一个初步搭建。