电商后台管理项目d02

Posted 李耀书

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了电商后台管理项目d02相关的知识,希望对你有一定的参考价值。

商品管理

在做商品管理之前,首先我们要进行分析,三个组件页面的顺序,

商品管理模块的顺序就是,先对商品进行添加分类后才有参数,所以三个模块的顺序是

1、商品分类。

2、分类参数。

3、商品列表。

1、商品分类

第一步:

首先创建对应路由

注意:依旧是子级路由

    {
        path: '/categories',
        name: "categories",
        component: () => import( /* webpackChunkName:"commodity" */ './components/commodity/categories.vue'),
        meta: {
          bread: ['用户管理', '用户列表']
        }
      },

第二步:

设置对应的API

import Serve from '../../util/index'
export default {
    // 数据列表
    list(page) {
        return Serve.get("categories", page);
    },
    // 删除
    remove(id) {
        return Serve.delete(`categories/${id}`);
    },
    // 编辑
    editID(id) {
        return Serve.get(`categories/${id}`);
    },
    editPut(id, list) {
        return Serve.put(`categories/${id}`, list);
    },
    // 添加分类
    add(Form) {
        return Serve.post(`categories`, Form);
    }
}

第三部:

页面逻辑

注意:

下载第三方插件vue-table-with-tree-grid分类表格,来展示数据

main.js中导入

import TreeTable from 'vue-table-with-tree-grid'
Vue.component('tree-table', TreeTable)

关于这个第三方插件的简单介绍:

  <!-- 
        分类表格:data(设置数据源) :columns(设置表格中列配置信息) :selection-type(是否有复选框):exndpa-type(是否展开数据) 
        show-index(是否设置索引列) index-text(设置索引列头)border(是否添加纵向边框) :show-row-hover(是否鼠标悬停高亮) 
       -->
<template>
  <div class="categories">
    <!-- 导入面包屑导航  -->
    <Bread />
    <!-- 卡片视图区域 -->
    <el-card>
      <!-- 添加区域 -->
      <el-row>
        <el-col>
          <el-button type="primary" @click="add">添加分类</el-button></el-col>
      </el-row>
      <!-- 表格区域 -->
      <tree-table
        :data="list"
        :columns="columns"
        :selection-type="false"
        :expand-type="false"
        show-index
        index-text="#"
        border
        show-row-hover >
        <!-- 是否有效 -->
        <template slot="isok" slot-scope="scope">
          <i
            class="el-icon-success"
            v-if="scope.row.cat_deleted == false"
            style="color: #39ce39"></i>
        </template>
        <!-- 排序 -->
        <template slot="sorting" slot-scope="scope">
          <el-tag
            type="primary"
            size="mini"
            effect="dark"
            v-if="scope.row.cat_level == 0"> 一级 </el-tag>
          <el-tag type="success" size="mini" effect="dark"  v-else-if="scope.row.cat_level == 1" >二级</el-tag>
     <el-tag type="warning" size="mini" effect="dark" v-else>三级 </el-tag>
        </template>
        <!-- 操作区域 -->
        <template slot="opera" slot-scope="scope">
          <el-button
            class="el-icon-edit"
            size="mini"
            type="primary"
            @click="edit(scope.row)"
            >编辑</el-button
          >
          <el-button
            class="el-icon-delete"
            size="mini"
            type="danger"
            @click="del(scope.row)">删除</el-button>
        </template>
      </tree-table>
      <!-- 分页区域 -->
      <el-pagination
        @size-change="handleSizeChange"
        @current-change="handleCurrentChange"
        :current-page="queryInfo.pagenum"
        :page-sizes="[1, 3, 6, 9]"
        :page-size="queryInfo.pagesize"
        layout="total, sizes, prev, pager, next, jumper"
        :total="total" >
      </el-pagination>
    </el-card>
    <!-- 添加商品分类对话框 -->
    <el-dialog
      title="添加商品分类"
      :visible.sync="addDialogVisible"
      width="40%"
      @close="adddialog">
      <el-form :model="addForm" :rules="addRules" ref="addRef">
        <el-form-item label="分类名称" label-width="80px" prop="cat_name">
          <el-input v-model="addForm.cat_name"></el-input>
        </el-form-item>
        <el-form-item label="父级分类" prop="cat_pid" label-width="80px">
          <el-cascader
            v-model="value"
            :options="list"
            :props="addProp"
            @change="handleChange"
            expandTrigger="hover"
            clearable
            change-on-select ></el-cascader>
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="addDialogVisible = false">取 消</el-button>
        <el-button type="primary" @click="addCate">确 定</el-button>
      </span>
    </el-dialog>
    <!-- 编辑商品分类对话框 -->
    <el-dialog title="提示" :visible.sync="editdialogVisible" width="40%">
      <el-form :model="editList" :rules="addRules" ref="editRef">
        <el-form-item label="分类名称" label-width="80px" prop="cat_name">
          <el-input v-model="editList.cat_name"></el-input>
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="editdialogVisible = false">取 消</el-button>
        <el-button type="primary" @click="editAdd">确 定</el-button>
      </span>
    </el-dialog>
  </div>
</template>
<script>
<script>
// 导入面包屑导航
import Bread from "@/bread/bread";
import CateApi from "@/api/commodity/categories";
export default {
  data() {
    return {
      value: "", //用来绑定级联选择器中的分类的id值
      addProp: {
        value: "cat_id",
        label: "cat_name",
        children: "children",
      },
      columns: [
        { label: "商品名称", prop: "cat_name" },
        { label: "是否有效", type: "template", template: "isok" },
        { label: "排序", type: "template", template: "sorting" },
        { label: "操作", type: "template", template: "opera" },
      ],
      // 添加商品分类校验
      addRules: {
        cat_name: {
          required: true,
          message: "分类名称不能为空",
          trigger: "blur",
        },
      },
      // 添加商品表单数据
      addForm: {
        cat_name: "",
        cat_level: 0, //层级
        cat_pid: 0, //父类的id
      },
      addDialogVisible: false, //添加数据对话框初始状态
      list: [], //所有数据信息

      // 分页数据
      queryInfo: {
        pagenum: 1,
        pagesize: 3,
      },
      total: 0,
      editList: {},
      editdialogVisible: false, //编辑商品对话框初始状态
    };
  },
  created() {
    this.getList();
  },
  methods: {
    // 添加商品分类
    add() {
      this.addDialogVisible = true;
    },

    /*
      在级联选择器的中,当选中节点变化时触发	选中节点的值发生变化
      当选择其中的值的长度大于0的时候,说明用户进行了选择,
      那么就根据下标将最后一项的赋给定义的添加数据中的响应属性
      如果用户没有进行选择,就对this.addFrom中的属性赋值为0,表示没有选中项,从而层级没有发生变化
    */

    /*
     value表示被选中上传的id
   */
    handleChange(value) {
      /*
        cat_pid:父类的id
        cat_level:所有的层级
      */
      if (this.value.length > 0) {
        this.addForm.cat_pid = this.value[this.value.length - 1];
        this.addForm.cat_level = this.value.length;
      } else {
        this.addForm.cat_pid = 0;
        this.addForm.cat_level = 0;
      }
    },

    // 关闭添加对话框时,清空内容
    adddialog() {
      this.$refs.addRef.resetFields();
      this.value = [];
      this.addForm.cat_pid = 0;
      this.addForm.cat_level = 0;
    },

    // 在添加分类对话框中点击添加按钮
    addCate() {
      this.$refs.addRef.validate(async (valid) => {
        if (!valid) return;
        const { data: res } = await CateApi.add(this.addForm);
        if (res.meta.status !== 201) {
          this.$message.error(res.meta.msg);
        }
        this.addForm.cat_id = 0;
        this.addForm.cat_name = 0;
        this.addForm.cat_level = 0;
        this.getList();
      });
      this.addDialogVisible = false;
    },

    // 点击编辑按钮
    async edit(item) {
      const { data: res } = await CateApi.editID(item.cat_id);
      if (res.meta.status !== 200) {
        this.$message.error(res.meta.msg);
      }
      this.editList = res.data;
      this.editdialogVisible = true;
    },
    // 点击编辑对话框确认按钮
    editAdd() {
      this.$refs.editRef.validate(async (valid) => {
        if (!valid) return;
        const { data: res } = await CateApi.editPut(
          this.editList.cat_id,
          this.editList
        );
        if (res.meta.status !== 200) {
          this.$message.error(res.meta.msg);
        }
        this.editdialogVisible = false;
        this.getList();
      });
    },

    // 点击删除按钮
    async del(item) {
      const confirText = await this.$confirm(
        "此操作将永久删除该文件, 是否继续?",
        "提示",
        {
          confirmButtonText: "确定",
          cancelButtonText: "取消",
          type: "warning",
        }
      ).catch((err) => err);
      if (confirText !== "confirm") {
        return;
      }
      const { data: res } = await CateApi.remove(item.cat_id);
      if (res.meta.status !== 200) {
        this.$message.error(res.meta.msg);
      }
      this.$message.success("删除分类成功!");
      this.getList();
    },
    // 获取所有数据
    async getList() {
      const { data: res } = await CateApi.list({ params: this.queryInfo });
      if (res.meta.status !== 200) {
        this.$message.error(res.meta.msg);
      }
      this.list = res.data.result;
      this.total = res.data.total;
    },

    // 分页操作
    handleSizeChange(val) {
      this.queryInfo.pagesize = val;
      console.log(this.queryInfo.pagesize);
      this.getList();
    },
    handleCurrentChange(val) {
      this.queyrInfo.pagenum = val;
      this.getList();
    },
  },
  components: {
    Bread,
  },
};
</script>

具体逻辑上述代码中都有注释…就不再赘述…

2、分类参数:

同样:建立路由,

    {
        path: '/params',
        name: "params",
        component: () => import( /* webpackChunkName: "commodity" */ './components/commodity/params.vue'),
        meta: {
          bread: ['商品分类', '分类参数']
        }
      },  
以上是关于电商后台管理项目d02的主要内容,如果未能解决你的问题,请参考以下文章

分布式电商项目(03)--后台管理系统整合测试

项目分享期末大作业——电商后台管理系统

项目分享期末大作业——电商后台管理系统

项目分享期末大作业——电商后台管理系统

电商后台管理项目d01

电商后台管理项目d01