蓝桥第四课-新增商品页面开发以及接口调用

  • 这节课来实现新增商品,首先是点击【添加商品】按钮实现跳转页面,在定义点击方法跳转页面之前,要先新建一个页面addShop
  • 在【src/views/shopModel】文件夹下,新建一个【addShop】文件夹,在文件夹内新建【index.vue
  • 在【index.vue】内敲快捷键vbase(前提是你的vscode已经安装了Vue VSCode Snippets插件),快速生成vue组件基础结构
  • 然后就是新建页面路由
  • 打开【src/router/index.js】,在【商品列表】路由下面,和其同级,新建一个【新增商品】的页面路由
children: [
      {
        path: '/shopModel/shopList',
        name: 'ShopList',
        component: () => import('@/views/shopModel/shopList/index'),//引入的是页面的路径,这是一种懒加载形式
        meta: { title: '商品列表', icon: 'table' }
      },
      {
        path: '/shopModel/addShop',
        name: 'AddShop',
        hidden: true,//在左侧隐藏,不会显示在左侧
        component: () => import('@/views/shopModel/addShop/index'),//引入的是页面的路径,这是一种懒加载形式
        meta: { title: '新增商品', icon: 'table' }
      },
    ]
  • 然后找到【添加商品】按钮,定义一个点击事件@click="handleAdd"
  • 在然后在methods里映射这个方法,然后跳转到新增商品的页面
handleAdd(){
      this.$router.push("/shopModel/addShop")
},
  • 下面根据设计图开发页面
image.png
  • 首先是该页面也是基于在el-card卡片上开发的,最外层先包裹一层el-card
<template>
  <div class="addShop">
    <el-card>
      新增商品  
    </el-card>
  </div>
</template>

<script>
export default {};
</script>

<style lang="scss" scoped>
.addShop {
  margin: 12px;
}
</style>
  • 首先开发 折叠面板
<!-- 折叠面板 -->
<el-collapse v-model="activeNames">
     <el-collapse-item title="添加商品" name="1">
         <div class="tip">操作提示</div>
         <div>
            1. 该页面展示了商城所有的商品信息,可对商品进行编辑修改操作。
         </div>
         <div>2. 商品下架后将无法在前台展示,请慎重操作。</div>
     </el-collapse-item>
</el-collapse>
  • css
// 推荐::v-deep 叫样式穿透  /deep/ 这种也许会不生效
  ::v-deep .el-collapse-item__header {
    color: #55ca7d;
    font-size: 14px;
  }
  ::v-deep .el-collapse-item__wrap {
    border: 1px dashed #55ca7d;
    background-color: #f0fdf5;
  }
  ::v-deep .el-collapse-item__content {
    padding: 10px;
  }
  • 下面开发form表单
<div class="from">
        <el-form
          :model="ruleForm"
          :rules="rules"
          ref="ruleForm"
          label-width="100px"
          class="demo-ruleForm"
        >
          <el-form-item label="商品类型" prop="region">
            <el-select
              v-model="ruleForm.type"
              placeholder="请选择商品类型"
            >
              <el-option
                v-for="(item, index) in typeArr"
                :key="index"
                :label="item.name"
                :value="item.id"
              ></el-option>
            </el-select>
          </el-form-item>
          <el-form-item label="商品名称">
            <el-input
              v-model="ruleForm.name"
              placeholder="请输入商品名称"
            ></el-input>
          </el-form-item>
          <el-form-item label="价格">
            <el-input
              v-model="ruleForm.price"
              type="number"
              placeholder="请输入商品名称"
            ></el-input>
          </el-form-item>
          <el-form-item label="库存">
            <el-input-number
              v-model="ruleForm.stock"
              placeholder="请输入商品名称"
            ></el-input-number>
          </el-form-item>
          <el-form-item label="编号">
            <el-input-number
              v-model="ruleForm.number"
              placeholder="请输入商品名称"
            ></el-input-number>
          </el-form-item>
          <el-form-item label="排序">
            <el-input-number
              v-model="ruleForm.sort"
              placeholder="请输入商品名称"
            ></el-input-number>
          </el-form-item>
          <el-form-item label="是否上架">
            <el-switch
              v-model="ruleForm.status"
              :active-value="1"
              :inactive-value="2"
            ></el-switch>
          </el-form-item>
          <el-form-item label="商品描述">
            <el-input
              v-model="ruleForm.desc"
              type="textarea"
              placeholder="请输入商品名称"
            ></el-input>
          </el-form-item>
          <el-form-item>
            <el-button type="primary" @click="onSubmit">立即创建</el-button>
            <el-button>取消</el-button>
          </el-form-item>
        </el-form>
</div>
  • data中的代码
data() {
    return {
      ruleForm: {
        type: "",
        name: "",
        price: "",
        stock: "",
        number: "",
        sort: "",
        status: 1,
      },
      rules: {},
      typeArr: [
        {
          name: "儿童用品",
          id: 1,
        },
        {
          name: "厨房用品",
          id: 2,
        },
        {
          name: "生活用品",
          id: 3,
        },
      ],
    };
  },
  • mehods 中的方法
methods: {
    onSubmit() {
      
    }
  },
  • 下面实现表单校验,Form 组件提供了表单验证的功能,只需要通过 rules 属性传入约定的验证规则,并将 Form-Item 的 prop 属性设置为需校验的字段名即可
  • 给每个form-item都加一个prop属性
 <el-form-item label="商品类型" prop="type">
            <el-select
              v-model="ruleForm.type"
              placeholder="请选择商品类型"
            >
              <el-option
                v-for="(item, index) in typeArr"
                :key="index"
                :label="item.name"
                :value="item.id"
              ></el-option>
            </el-select>
          </el-form-item>
          <el-form-item label="商品名称" prop="name">
            <el-input
              v-model="ruleForm.name"
              placeholder="请输入商品名称"
            ></el-input>
          </el-form-item>
          <el-form-item label="价格" prop="price">
            <el-input
              v-model="ruleForm.price"
              type="number"
              placeholder="请输入商品名称"
            ></el-input>
          </el-form-item>
          <el-form-item label="库存" prop="stock">
            <el-input-number
              v-model="ruleForm.stock"
              placeholder="请输入商品名称"
            ></el-input-number>
          </el-form-item>
          <el-form-item label="编号" prop="number">
            <el-input-number
              v-model="ruleForm.number"
              placeholder="请输入商品名称"
            ></el-input-number>
          </el-form-item>
          <el-form-item label="排序" prop="sort">
            <el-input-number
              v-model="ruleForm.sort"
              placeholder="请输入商品名称"
            ></el-input-number>
          </el-form-item>
          <el-form-item label="是否上架" prop="status">
            <el-switch
              v-model="ruleForm.status"
              :active-value="1"
              :inactive-value="2"
            ></el-switch>
          </el-form-item>
          <el-form-item label="商品描述" prop="desc">
            <el-input
              v-model="ruleForm.desc"
              type="textarea"
              placeholder="请输入商品名称"
            ></el-input>
          </el-form-item>
  • 然后在data中的rules里写入这样的校验规则
 rules: {
        type: [
          { required: true, message: "请选择商品分类", trigger: "change" },
        ],
        name: [
          { required: true, message: "请输入商品名称", trigger: "blur" },
        ],
        price: [
          { required: true, message: "请输入商品价格", trigger: "blur" },
        ],
        stock: [
          { required: true, message: "请输入商品库存", trigger: "blur" },
        ],
        sort: [
          { required: true, message: "请输入商品排序", trigger: "blur" },
        ],
        number: [
          { required: true, message: "请输入商品编号", trigger: "blur" },
        ],
        status: [
          { required: true, message: "请选择是否上下架", trigger: "change" },
        ],
        desc: [
          { required: true, message: "请输入商品简介", trigger: "blur" },
        ],
      },
  • onSubmit方法改成这样
onSubmit(formName) {
        this.$refs[formName].validate((valid) => {
          if (valid) {
            alert('submit!');
          } else {
            console.log('error submit!!');
            return false;
          }
        });
      },
  • 下面开始调用新增商品的接口
  • 先定义api方法
  • 在【src/api/user.js】内新建api方法
/**
 * 新增商品 
 */
 export function addShop(data,id) {
  return request({
    url: '/api/add/goods',
    method: 'post',
    data
    // get 传参数   使用  params
    // put  post  delete  传参 使用 data
  })
}
  • 在addShop页面引入这个方法
import {addShop} from '@/api/user';
  • 在调用新增方法之前,要先完善下【商品分类】,要从后端接口获取真的分类信息
  • 先定义api方法,获取分类列表
  • 在【src/api/user.js】内新建api方法
/**
 * 获取商品分类 /api/query/menu
 */
 export function getShopMenu(data) {
  return request({
    url: '/api/query/menu',
    method: 'get',
    data
    // get 传参数   使用  params
    // put  post  delete  传参 使用 data
  })
}
  • 在addShop页面引入这个方法
import {getShopMenu} from '@/api/user';
  • 在methods新建一个方法,来获取商品分类列表
methods:{
 /**获取商品分类 */
    getShopMenuFun(){
      getShopMenu().then(res=>{
        this.typeArr = res.data
      })
    }
}
  • 然后调用这个方法在mounted生命周期内调用
 mounted () {
    this.getShopMenuFun();
  },
  • 然后根据接口的返回值 修改select下拉框的属性参数, label对应的是展示文字,valye对应的是绑定的id
<el-select v-model="ruleForm.type" placeholder="请选择商品类型">
              <el-option
                v-for="(item, index) in typeArr"
                :key="index"
                :label="item.name"
                :value="item._id"
              ></el-option>
</el-select>
  • select下拉框绑定的值是type,为了方便传参,我们把 type 改成 category_id
<el-form-item label="商品类型" prop="category_id">
            <el-select v-model="ruleForm.category_id" placeholder="请选择商品类型">
              <el-option
                v-for="(item, index) in typeArr"
                :key="index"
                :label="item.name"
                :value="item._id"
              ></el-option>
            </el-select>
          </el-form-item>
ruleForm: {
        category_id: "",//改这个
        name: "",
        price: "",
        stock: "",
        number: "",
        sort: "",
        status: 1,
      },
rules: {
        category_id: [ //改这个
          { required: true, message: "请选择商品分类", trigger: "change" },
        ],
        name: [{ required: true, message: "请输入商品名称", trigger: "blur" }],
        price: [{ required: true, message: "请输入商品价格", trigger: "blur" }],
        stock: [{ required: true, message: "请输入商品库存", trigger: "blur" }],
        sort: [{ required: true, message: "请输入商品排序", trigger: "blur" }],
        number: [
          { required: true, message: "请输入商品编号", trigger: "blur" },
        ],
        status: [
          { required: true, message: "请选择是否上下架", trigger: "change" },
        ],
        desc: [{ required: true, message: "请输入商品简介", trigger: "blur" }],
      },
  • 现在可以先调用下 我们的 新增商品 接口
onSubmit(formName) {
      this.$refs[formName].validate((valid) => {
        if (valid) {
          addShop(this.ruleForm).then((res) => {
            console.log(res);
          });
        } else {
          console.log("error submit!!");
          return false;
        }
      });
    },
  • 触发提交按钮会提示 图片不能为空
image.png
  • 是因为少传了cover字段,下面来学习下如何封装一个图片上传的组件,使用七牛云js插件直传到七牛云图片仓库

接下章

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容