草庐IT

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

风中凌乱的男子 2023-09-28 原文
  • 这节课来实现新增商品,首先是点击【添加商品】按钮实现跳转页面,在定义点击方法跳转页面之前,要先新建一个页面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插件直传到七牛云图片仓库

接下章

有关蓝桥第四课-新增商品页面开发以及接口调用的更多相关文章

  1. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  2. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  3. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  4. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  5. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

  6. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  7. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  8. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  9. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  10. ruby - 调用其他方法的 TDD 方法的正确方法 - 2

    我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent

随机推荐