Răsfoiți Sursa

Merge branch 'test' into 'master'

Test

See merge request quanshu/mp-ui-pc!128
zhong chunping 3 ani în urmă
părinte
comite
e48eadea06

+ 47 - 0
src/api/business/banner.js

@@ -0,0 +1,47 @@
+import request from '@/utils/request'
+
+// 查询banner列表
+export function goodsBannerList(urlParams, data) {
+  return request({
+    url: '/api/v1/mp/admin/goods/banner/list',
+    method: 'post',
+    data,
+    urlParams
+  })
+}
+
+// 查询banner详情
+export function goodsBannerDetail(data) {
+  return request({
+    url: '/api/v1/mp/admin/goods/banner/detail',
+    method: 'post',
+    data
+  })
+}
+
+// 修改banner信息
+export function goodsBannerUpdate(data) {
+  return request({
+    url: '/api/v1/mp/admin/goods/banner/update',
+    method: 'post',
+    data
+  })
+}
+
+// 新增banner信息
+export function goodsBannerCreate(data) {
+  return request({
+    url: '/api/v1/mp/admin/goods/banner/create',
+    method: 'post',
+    data
+  })
+}
+
+// 删除banner信息
+export function goodsBannerRemove(data) {
+  return request({
+    url: '/api/v1/mp/admin/goods/banner/remove',
+    method: 'post',
+    data
+  })
+}

+ 56 - 0
src/api/business/category.js

@@ -0,0 +1,56 @@
+import request from '@/utils/request'
+
+// 查询分类列表, 支持翻页
+export function goodsCategoryList(urlParams, data) {
+  return request({
+    url: '/api/v1/mp/admin/goods/category/list',
+    method: 'post',
+    data,
+    urlParams
+  })
+}
+
+// 查询分类下拉列表, 不分页
+export function goodsCategoryItems(data) {
+  return request({
+    url: '/api/v1/mp/admin/goods/category/items',
+    method: 'post',
+    data
+  })
+}
+
+// 查询分类详情
+export function goodsCategoryDetail(data) {
+  return request({
+    url: '/api/v1/mp/admin/goods/category/detail',
+    method: 'post',
+    data
+  })
+}
+
+// 修改分类信息
+export function goodsCategoryUpdate(data) {
+  return request({
+    url: '/api/v1/mp/admin/goods/category/update',
+    method: 'post',
+    data
+  })
+}
+
+// 新增分类信息
+export function goodsCategoryCreate(data) {
+  return request({
+    url: '/api/v1/mp/admin/goods/category/create',
+    method: 'post',
+    data
+  })
+}
+
+// 删除分类信息
+export function goodsCategoryRemove(data) {
+  return request({
+    url: '/api/v1/mp/admin/goods/category/remove',
+    method: 'post',
+    data
+  })
+}

+ 56 - 0
src/api/business/tag.js

@@ -0,0 +1,56 @@
+import request from '@/utils/request'
+
+// 查询标签列表, 支持翻页
+export function goodsTagList(urlParams, data) {
+  return request({
+    url: '/api/v1/mp/admin/goods/tag/list',
+    method: 'post',
+    data,
+    urlParams
+  })
+}
+
+// 查询标签下拉列表,不分页
+export function goodsTagItems(data) {
+  return request({
+    url: '/api/v1/mp/admin/goods/tag/items',
+    method: 'post',
+    data
+  })
+}
+
+//查询标签详情
+export function goodsTagDetail(data) {
+  return request({
+    url: '/api/v1/mp/admin/goods/tag/detail',
+    method: 'post',
+    data
+  })
+}
+
+// 修改标签信息
+export function goodsTagUpdate(data) {
+  return request({
+    url: '/api/v1/mp/admin/goods/tag/update',
+    method: 'post',
+    data
+  })
+}
+
+// 新增标签信息
+export function goodsTagCreate(data) {
+  return request({
+    url: '/api/v1/mp/admin/goods/tag/create',
+    method: 'post',
+    data
+  })
+}
+
+// 删除标签信息
+export function goodsTagRemove(data) {
+  return request({
+    url: '/api/v1/mp/admin/goods/tag/remove',
+    method: 'post',
+    data
+  })
+}

+ 225 - 0
src/views/business/banner/components/BannerCreate.vue

@@ -0,0 +1,225 @@
+<template>
+  <div>
+    <el-dialog
+      title="添加banner"
+      :visible.sync="dialogShow"
+      width="800px"
+      :before-close="close"
+    >
+      <el-form :model="form" ref="form" :rules="rules" label-width="100px">
+        <el-form-item label="banner名称" prop="name">
+          <el-input
+            v-model="form.name"
+            style="width: 300px"
+            size="small"
+            placeholder="请输入banner名称"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="位置" prop="location">
+          <el-select
+            v-model="form.location"
+            placeholder="请选择位置"
+            clearable
+            style="width: 300px"
+          >
+            <el-option
+              :label="item.dictLabel"
+              :value="item.dictValue"
+              v-for="(item, index) in bannerLocationList"
+              :key="index"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="排序" prop="sort">
+          <el-input
+            v-model.number="form.sort"
+            style="width: 300px"
+            size="small"
+            placeholder="请输入排序"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="图片" prop="picUrl">
+          <image-upload
+            :limit="1"
+            :value="form.picUrl"
+            :file-size="50"
+            :is-public="true"
+            @input="pictureSelect"
+          />
+        </el-form-item>
+        <el-form-item label="类型" prop="type">
+          <el-radio-group v-model="form.type" size="small" @change="changeType">
+            <el-radio label="link">自定义链接</el-radio>
+            <el-radio label="tag">商品标签</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="链接地址" prop="linkUrl" v-if="form.type == 'link'">
+          <el-input
+            v-model="form.linkUrl"
+            style="width: 300px"
+            size="small"
+            placeholder="请输入链接地址"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="商品标签" prop="goodsTags" v-if="form.type == 'tag'">
+          <el-select
+            v-model="form.goodsTags"
+            placeholder="请选择商品标签"
+            multiple
+            clearable
+            style="width: 300px"
+          >
+            <el-option
+              :label="item.name"
+              :value="item.tagId"
+              v-for="(item, index) in goodsTagItemsList"
+              :key="index"
+            />
+          </el-select>
+        </el-form-item>
+      </el-form>
+
+      <!-- 按钮 -->
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="close">取 消</el-button>
+        <el-button type="primary" :disabled="loading" @click="saveClick"
+          >确 定</el-button
+        >
+      </div>
+    </el-dialog>
+  </div>
+</template>
+<script>
+import CustomFieldsMixin from "@/mixins/CustomFields";
+import { goodsBannerCreate } from "@/api/business/banner";
+import { goodsTagItems } from "@/api/business/tag";
+export default {
+  mixins: [CustomFieldsMixin],
+  props: {
+    // 弹框显示
+    dialogShow: {
+      type: Boolean,
+      default: false,
+    },
+  },
+  created() {
+    this.getBannerLocation();
+    this.getGoodsTagItems();
+  },
+  data() {
+    return {
+      loading: false,
+      form: {
+        picUrl: [],
+        type: 'link',
+        sort: 0
+      },
+      bannerLocationList: [],
+      goodsTagItemsList: [],
+      rules: {
+        name: [
+          { required: true, message: "请输入banner名称", trigger: "blur" },
+        ],
+        location: [
+          { required: true, message: "请选择位置", trigger: "change" },
+        ],
+        sort: [
+          { required: true, message: "请输入排序", trigger: "blur" },
+          {
+            pattern: /^([0-9]\d*)$/,
+            message: "请输入合法的数字",
+            trigger: ["blur", "change"],
+          },
+        ],
+        picUrl: [
+          {
+            type: "array",
+            required: true,
+            message: "请上传banner图片",
+            trigger: "change",
+          },
+        ],
+        type:  [
+          { required: true, message: "请选择类型", trigger: "change" },
+        ],
+        linkUrl: [
+          { required: true, message: "请输入链接地址", trigger: "blur" },
+        ],
+        goodsTags: [
+          { required: true, message: "请选择商品标签", trigger: "change" },
+        ],
+      },
+    };
+  },
+  methods: {
+    getBannerLocation() {
+      this.getDicts("banner_location").then((res) => {
+        this.bannerLocationList = res && res.data;
+      });
+    },
+    getGoodsTagItems() {
+      goodsTagItems({}).then((res) => {
+        this.goodsTagItemsList = res && res.data;
+      });
+    },
+
+    changeType(){
+      this.$refs["form"].clearValidate();
+    },
+
+    // 添加图片
+    pictureSelect(data) {
+      this.form.picUrl = data;
+    },
+
+    // 关闭弹框
+    close() {
+      this.$emit("close");
+      this.loading = false;
+      this.$refs["form"].resetFields();
+    },
+
+    // 确认
+    saveClick() {
+      this.loading = true;
+      const subForm = this.$refs["form"];
+      subForm.validate((valid) => {
+        if (valid) {
+          this.submitForm(this.form);
+        } else {
+          this.loading = false;
+          // 提示第一个error
+          this.getFormErrorMessage(subForm);
+          return false;
+        }
+      });
+    },
+
+    // 提交
+    submitForm(form) {
+      let data = {
+        ... form,
+        picUrl: this.form.picUrl[0].fileName,
+        goodsTags: form.goodsTags ? form.goodsTags.join(',') : ''
+      };
+      goodsBannerCreate(data)
+        .then((res) => {
+          if (res.code == 0) {
+            this.msgSuccess("添加成功");
+            this.close();
+          }
+        })
+        .catch(() => {
+          this.loading = false;
+        });
+    },
+  },
+};
+</script>
+<style scoped>
+.channel {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+</style>

+ 203 - 0
src/views/business/banner/index.vue

@@ -0,0 +1,203 @@
+<template>
+  <div class="app-container">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      :inline="true"
+      v-show="showSearch"
+      label-width="90px"
+    >
+      <el-form-item label="位置">
+        <el-select
+          v-model="queryParams.location"
+          placeholder="请选择位置"
+          clearable
+          @change="
+            queryParams.pageNum = 1;
+            getList();
+          "
+        >
+          <el-option
+            :label="item.dictLabel"
+            :value="item.dictValue"
+            v-for="(item, index) in bannerLocationList"
+            :key="index"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button
+          type="primary"
+          icon="el-icon-search"
+          size="mini"
+          @click="getList()"
+          >搜索</el-button
+        >
+        <el-button icon="el-icon-refresh" size="mini" @click="getList(true)"
+          >重置</el-button
+        >
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['business:ticket:add']"
+          >添加banner</el-button
+        >
+      </el-col>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList()"
+      ></right-toolbar>
+    </el-row>
+    <!-- 列表 -->
+    <el-table ref="table" v-loading="loading" :data="list">
+      <el-table-column label="banner名称" prop="name" />
+      <el-table-column label="位置" min-width="100">
+        <template slot-scope="{ row }">
+          <div>
+            {{ row.location.desc }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="banner图片">
+        <div slot-scope="{ row }">
+          <el-image
+            style="width: 250px; height: 100px"
+            :src="row.picUrl"
+            :preview-src-list="[row.picUrl]"
+          />
+        </div>
+      </el-table-column>
+      <el-table-column label="排序" align="center">
+        <template slot-scope="{ row }">
+          <div>{{ row.sort }}</div>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center">
+        <template slot-scope="{ row }">
+          <div>
+            <el-button
+              v-hasPermi="['business:banner:edit']"
+              type="text"
+              disabled
+              >编辑</el-button
+            >
+            <el-button
+              v-hasPermi="['business:banner:remove']"
+              type="text"
+              class="del"
+              @click="del(row)"
+              >删除</el-button
+            >
+          </div>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <!-- 分页 -->
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="pageParams.pageNum"
+      :limit.sync="pageParams.pageSize"
+      @pagination="getList"
+    />
+
+    <banner-create v-if="createShow" :dialog-show="createShow" @close="close" />
+  </div>
+</template>
+<script>
+import { publicFileGetUrl } from "@/api/common";
+import { goodsBannerList, goodsBannerRemove } from "@/api/business/banner";
+import BannerCreate from "./components/BannerCreate";
+export default {
+  name: "ListBanner",
+  components: {
+    BannerCreate,
+  },
+  data() {
+    return {
+      loading: false,
+      showSearch: true,
+      queryParams: {},
+      pageParams: {
+        pageNum: 1,
+        pageSize: 10,
+      },
+      // 总条数
+      total: 0,
+      list: [],
+      bannerLocationList: [],
+      createShow: false,
+    };
+  },
+  created() {
+    this.getBannerLocation();
+    this.getList();
+  },
+  methods: {
+    getBannerLocation() {
+      this.getDicts("banner_location").then((res) => {
+        this.bannerLocationList = res && res.data;
+      });
+    },
+    getList() {
+      this.loading = true;
+      goodsBannerList(
+        "pageNum=" +
+          this.pageParams.pageNum +
+          "&pageSize=" +
+          this.pageParams.pageSize +
+          "&",
+        this.queryParams
+      )
+        .then((res) => {
+          this.loading = false;
+          if (res.code == 0) {
+            res.rows.forEach((item) => {
+              item.picUrl = publicFileGetUrl + item.picUrl.split(",")[0];
+              item.location = JSON.parse(item.location);
+            });
+            this.total = res.total;
+            this.list = res.rows;
+          }
+        })
+        .catch(() => {
+          this.loading = false;
+        });
+    },
+
+    del(item) {
+      this.$confirm(`确认删除banner “${item.name}” 吗?`, "删除banner", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      }).then(() => {
+        goodsBannerRemove({ bannerId: item.bannerId }).then((res) => {
+          if (res.code === 0) {
+            this.$message.success("操作已完成!");
+            this.getList();
+          }
+        });
+      });
+    },
+
+    handleAdd() {
+      this.createShow = true;
+    },
+
+    // 关闭发货弹框
+    close() {
+      this.createShow = false;
+      this.getList();
+    },
+  },
+};
+</script>
+<style>
+</style>

+ 153 - 0
src/views/business/category/components/CategoryCreate.vue

@@ -0,0 +1,153 @@
+<template>
+  <div>
+    <el-dialog
+      title="添加分类"
+      :visible.sync="dialogShow"
+      width="800px"
+      :before-close="close"
+    >
+      <el-form :model="form" ref="form" :rules="rules" label-width="100px">
+        <el-form-item label="分类名称" prop="name">
+          <el-input
+            v-model="form.name"
+            style="width: 300px"
+            size="small"
+            placeholder="请输入分类名称"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="排序">
+          <el-input
+            v-model.number="form.sort"
+            style="width: 300px"
+            size="small"
+            placeholder="请输入排序"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="分类图片" prop="picUrl">
+          <image-upload
+            :limit="1"
+            :value="form.picUrl"
+            :file-size="50"
+            :is-public="true"
+            @input="pictureSelect"
+          />
+        </el-form-item>
+        <el-form-item label="是否显示" prop="isShow">
+          <el-radio-group v-model="form.isShow" size="small">
+            <el-radio :label="1">是</el-radio>
+            <el-radio :label="2">否</el-radio>
+          </el-radio-group>
+        </el-form-item>
+      </el-form>
+
+      <!-- 按钮 -->
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="close">取 消</el-button>
+        <el-button type="primary" :disabled="loading" @click="saveClick"
+          >确 定</el-button
+        >
+      </div>
+    </el-dialog>
+  </div>
+</template>
+<script>
+import CustomFieldsMixin from "@/mixins/CustomFields";
+import { goodsCategoryCreate } from "@/api/business/category";
+export default {
+  mixins: [CustomFieldsMixin],
+  props: {
+    // 弹框显示
+    dialogShow: {
+      type: Boolean,
+      default: false,
+    },
+  },
+  created() {
+
+  },
+  data() {
+    return {
+      loading: false,
+      form: {
+        picUrl: [],
+        isShow: 1,
+      },
+      rules: {
+        name: [
+          { required: true, message: "请输入分类名称", trigger: "blur" },
+        ],
+        picUrl: [
+          {
+            type: "array",
+            required: true,
+            message: "请上传分类图片",
+            trigger: "change",
+          },
+        ],
+        isShow:  [
+          { required: true, message: "请选择", trigger: "change" },
+        ],
+      },
+    };
+  },
+  methods: {
+
+    changeType(){
+      this.$refs["form"].clearValidate();
+    },
+
+    // 添加图片
+    pictureSelect(data) {
+      this.form.picUrl = data;
+    },
+
+    // 关闭弹框
+    close() {
+      this.$emit("close");
+      this.loading = false;
+      this.$refs["form"].resetFields();
+    },
+
+    // 确认
+    saveClick() {
+      this.loading = true;
+      const subForm = this.$refs["form"];
+      subForm.validate((valid) => {
+        if (valid) {
+          this.submitForm(this.form);
+        } else {
+          this.loading = false;
+          // 提示第一个error
+          this.getFormErrorMessage(subForm);
+          return false;
+        }
+      });
+    },
+
+    // 提交
+    submitForm(form) {
+      let data = {
+        ... form,
+        picUrl: this.form.picUrl[0].fileName,
+      };
+      goodsCategoryCreate(data)
+        .then((res) => {
+          if (res.code == 0) {
+            this.msgSuccess("添加成功");
+            this.close();
+          }
+        })
+        .catch(() => {
+          this.loading = false;
+        });
+    },
+  },
+};
+</script>
+<style scoped>
+.channel {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+</style>

+ 172 - 0
src/views/business/category/index.vue

@@ -0,0 +1,172 @@
+<template>
+  <div class="app-container">
+    <!-- <el-form
+      :model="queryParams"
+      ref="queryForm"
+      :inline="true"
+      v-show="showSearch"
+      label-width="90px"
+    >
+      <el-form-item label="位置">
+        <el-select
+          v-model="queryParams.location"
+          placeholder="请选择位置"
+          clearable
+          @change="queryParams.pageNum = 1;getList()"
+        >
+          <el-option
+            :label="item.dictLabel"
+            :value="item.dictValue"
+            v-for="(item, index) in bannerLocationList"
+            :key="index"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button
+          type="primary"
+          icon="el-icon-search"
+          size="mini"
+          @click="handleQuery"
+          >搜索</el-button
+        >
+        <el-button icon="el-icon-refresh" size="mini" @click="getList(true)"
+          >重置</el-button
+        >
+      </el-form-item>
+    </el-form> -->
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['business:ticket:add']"
+          >添加分类</el-button
+        >
+      </el-col>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList()"
+      ></right-toolbar>
+    </el-row>
+    <!-- 列表 -->
+    <el-table ref="table" v-loading="loading" :data="list">
+      <el-table-column label="分类名称" prop="name" />
+      <el-table-column label="分类图片">
+        <div slot-scope="{ row }">
+          <el-image
+            style="width: 100px; height: 100px"
+            :src="row.picUrl"
+            :preview-src-list="[row.picUrl]"
+          />
+        </div>
+      </el-table-column>
+      <el-table-column label="排序" align="center">
+        <template slot-scope="{ row }">
+          <div>{{ row.sort }}</div>
+        </template>
+      </el-table-column>
+      <el-table-column label="状态" prop="status"  align="center">
+        <template slot-scope="{ row }">
+          <el-tag :type="row.isShow === 1 ? 'success' : 'info'">{{
+            row.isShow === 1 ? "显示" : "不显示"
+          }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center">
+        <template>
+          <div>
+            <el-button v-hasPermi="['order:deliver:query']" type="text" disabled
+              >编辑</el-button
+            >
+            <el-button v-hasPermi="['order:deliver:ship']" type="text" disabled
+              >删除</el-button
+            >
+          </div>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <!-- 分页 -->
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="pageParams.pageNum"
+      :limit.sync="pageParams.pageSize"
+      @pagination="getList"
+    />
+
+    <category-create v-if="createShow" :dialog-show="createShow" @close="close" />
+  </div>
+</template>
+<script>
+import { publicFileGetUrl } from "@/api/common";
+import {
+  goodsCategoryList,
+  goodsCategoryRemove,
+} from "@/api/business/category";
+import CategoryCreate from "./components/CategoryCreate";
+export default {
+  name: "ListCate",
+  components: {
+    CategoryCreate,
+  },
+  data() {
+    return {
+      loading: false,
+      showSearch: true,
+      queryParams: {},
+      pageParams: {
+        pageNum: 1,
+        pageSize: 10,
+      },
+      // 总条数
+      total: 0,
+      list: [],
+      createShow: false,
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    getList() {
+      this.loading = true;
+      goodsCategoryList(
+        "pageNum=" +
+          this.pageParams.pageNum +
+          "&pageSize=" +
+          this.pageParams.pageSize +
+          "&",
+        this.queryParams
+      )
+        .then((res) => {
+          this.loading = false;
+          if (res.code == 0) {
+            res.rows.forEach((item) => {
+              item.picUrl = publicFileGetUrl + item.picUrl.split(",")[0];
+            });
+            this.total = res.total;
+            this.list = res.rows;
+          }
+        })
+        .catch(() => {
+          this.loading = false;
+        });
+    },
+    handleQuery() {},
+    handleAdd() {
+      this.createShow = true;
+    },
+    // 关闭发货弹框
+    close() {
+      this.createShow = false;
+      this.getList();
+    },
+  },
+};
+</script>
+<style>
+</style>

+ 46 - 2
src/views/business/goods/add.vue

@@ -28,6 +28,33 @@
           </el-form-item>
         </el-col>
       </el-row>
+      <el-row :gutter="40" style="width: 500px">
+        <el-col :span="23">
+          <el-form-item label="商品分类" prop="categoryId">
+            <el-select
+              v-model="addData.categoryId"
+              placeholder="请选择商品分类"
+              clearable
+            >
+              <el-option :label="item.name" :value="item.categoryId" v-for="(item, index) in goodsCategoryItemsList" :key="index" />
+            </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
+       <el-row :gutter="40" style="width: 500px">
+        <el-col :span="23">
+          <el-form-item label="商品标签">
+            <el-select
+              v-model="addData.tagIds"
+              placeholder="请选择商品标签"
+              multiple 
+              clearable
+            >
+              <el-option :label="item.name" :value="item.tagId" v-for="(item, index) in goodsTagItemsList" :key="index" />
+            </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
       <el-divider content-position="left">价格库存</el-divider>
       <el-row>
         <el-col :span="23">
@@ -101,6 +128,8 @@ import Upload from '@/components/DragImageUpload'
 import Spec from './components/spec'
 import TinyEditor from '@/components/TinyEditor'
 import { getGoodsDetail, addGoods } from '@/api/business/goods'
+import { goodsCategoryItems } from '@/api/business/category'
+import { goodsTagItems } from '@/api/business/tag'
 import { publicFileGetUrl } from "@/api/common"
 import { accDiv, accMul } from '@/utils/util'
 export default {
@@ -113,6 +142,8 @@ export default {
     return {
       IMG_URL: publicFileGetUrl,
       id: this.$route.query.id,
+      goodsCategoryItemsList: [],
+      goodsTagItemsList: [],
       addData: {
         multiSku: 0,
         description: ''
@@ -120,6 +151,7 @@ export default {
       rules: {
         title: [{ required: true, message: '请输入商品名称', trigger: 'blur' }],
         picUrl: [{ required: true, message: '请上传商品图片', trigger: 'change' }],
+        categoryId: [{ required: true, message: '请选择商品分类', trigger: 'change' }],
         exchangeShow: [{ required: true, message: '请选择是否支持盲豆兑换', trigger: 'change' }],
         multiSku: [{ required: true, message: '请选择SKU类型', trigger: 'change' }],
         value: [
@@ -157,13 +189,15 @@ export default {
     }
   },
   created() {
+    this.getGoodsCategoryItems()
+    this.getGoodsTagItems()
     if (this.id) {
       getGoodsDetail(this.id).then(res => {
-        const { goodsId, title, picUrl, exchangeShow, multiSku, value, exchangePrice, cost, quantity, description, skuList } = res.data
+        const { goodsId, title, picUrl, exchangeShow, multiSku, value, exchangePrice, cost, quantity, description, skuList, categoryId, tagIds } = res.data
         this.addData = {
           value: accDiv(value, 100),
           cost: cost == '' || cost == null ? '' : accDiv(cost, 100),
-          goodsId, title, picUrl, exchangeShow, multiSku, exchangePrice, quantity, description, skuList
+          goodsId, title, picUrl, exchangeShow, multiSku, exchangePrice, quantity, description, skuList, categoryId, tagIds
         }
         if (multiSku && skuList instanceof Array && skuList.length > 0) {
           this.$nextTick(() => {
@@ -174,6 +208,16 @@ export default {
     }
   },
   methods: {
+    getGoodsCategoryItems(){
+      goodsCategoryItems({}).then(res => {
+        this.goodsCategoryItemsList = res && res.data
+      })
+    },
+    getGoodsTagItems(){
+      goodsTagItems({}).then(res => {
+        this.goodsTagItemsList = res && res.data
+      })
+    },
     updateItem() {
       if (this.addData.multiSku == 1) {
         this.$refs.spec.getSkuList()

+ 40 - 2
src/views/business/goods/index.vue

@@ -12,11 +12,31 @@
       <el-form-item label="商品ID">
         <el-input
           v-model="queryParams.goodsId"
-          placeholder="请输入商品名称"
+          placeholder="请输入商品ID"
           clearable
           @keyup.enter.native="queryParams.pageNum = 1;getList()"
         />
       </el-form-item>
+      <el-form-item label="商品分类">
+       <el-select
+          v-model="queryParams.categoryId"
+          placeholder="请选择商品分类"
+          clearable
+          @change="queryParams.pageNum = 1;getList()"
+        >
+          <el-option :label="item.name" :value="item.categoryId" v-for="(item, index) in goodsCategoryItemsList" :key="index" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="商品标签">
+        <el-select
+          v-model="queryParams.tagId"
+          placeholder="请选择商品标签"
+          clearable
+          @change="queryParams.pageNum = 1;getList()"
+        >
+          <el-option :label="item.name" :value="item.tagId" v-for="(item, index) in goodsTagItemsList" :key="index" />
+        </el-select>
+      </el-form-item>
       <el-form-item label="上架状态">
         <el-select v-model="queryParams.status" placeholder="请选择商品状态" clearable @change="queryParams.pageNum = 1;getList()">
           <el-option label="全部" value="" />
@@ -114,6 +134,8 @@
 <script>
 import { publicFileGetUrl } from "@/api/common"
 import { getGoodsList, delGoods, setGoodsStatus } from '@/api/business/goods'
+import { goodsCategoryItems } from '@/api/business/category'
+import { goodsTagItems } from '@/api/business/tag'
 import { accMul } from '@/utils/util'
 export default {
   name: 'List',
@@ -124,13 +146,27 @@ export default {
       showSearch: true,
       queryParams: {},
       tableData: [],
-      total: 0
+      total: 0,
+      goodsCategoryItemsList: [],
+      goodsTagItemsList: [],
     }
   },
   created() {
     this.getList(true)
+    this.getGoodsCategoryItems()
+    this.getGoodsTagItems()
   },
   methods: {
+    getGoodsCategoryItems(){
+      goodsCategoryItems({}).then(res => {
+        this.goodsCategoryItemsList = res && res.data
+      })
+    },
+    getGoodsTagItems(){
+      goodsTagItems({}).then(res => {
+        this.goodsTagItemsList = res && res.data
+      })
+    },
     getList(reset) {
       if (this.loading) {
         return
@@ -142,6 +178,8 @@ export default {
       getGoodsList('pageNum='+this.queryParams.pageNum + '&pageSize='+this.queryParams.pageSize+'&', {
         title: this.queryParams.title,
         goodsId: this.queryParams.goodsId,
+        categoryId: this.queryParams.categoryId,
+        tagId: this.queryParams.tagId,
         status: this.queryParams.status,
         exchangeShow: this.queryParams.exchangeShow,
         minCost: accMul(this.queryParams.minCost, 100),

+ 20 - 0
src/views/business/tag/index.vue

@@ -0,0 +1,20 @@
+<template>
+  <div class="app-container">
+
+  </div>
+</template>
+<script>
+export default {
+  name: 'ListTag',
+  components: {},
+  data() {
+    return {};
+  },
+  created(){
+    
+  },
+  methods: {},
+};
+</script>
+<style>
+</style>