Explorar el Código

增加商品列表

david hace 2 años
padre
commit
ba862b47a2
Se han modificado 5 ficheros con 627 adiciones y 0 borrados
  1. 42 0
      src/api/shop.js
  2. 25 0
      src/lang/en.js
  3. 25 0
      src/lang/zh.js
  4. 12 0
      src/router/index.js
  5. 523 0
      src/views/shop/index.vue

+ 42 - 0
src/api/shop.js

@@ -0,0 +1,42 @@
+import request from '@/utils/request'
+
+// 商品列表
+export function shopList(query) {
+    return request({
+      url: '/v1/shop/index',
+      method: 'get',
+      data: query,
+      params: query
+    })
+}
+
+// 导出
+export function goodsListExport(query) {
+    return request({
+      url: '/v1/shop/goods-list-export',
+      method: 'get',
+      data: query,
+      params: query
+    })
+}
+
+// 商品上下架
+export function updateGoodsStatus(query) {
+    return request({
+      url: '/v1/shop/goods-status',
+      method: 'post',
+      data: query
+    })
+}
+
+// 删除商品
+export function goodsDelete(query) {
+    return request({
+      url: '/v1/shop/goods-delete',
+      method: 'post',
+      data: query
+    })
+}
+
+
+

+ 25 - 0
src/lang/en.js

@@ -499,6 +499,31 @@ export default {
     placementNetworkList:'Placement network list',
   },
 
+  // 商品管理
+  shop: {
+    onSale:'On sale',
+    soldOut:'Sold out',
+    addProduct:'Add Product',
+    editProducts:'Edit Products',
+    productName:'Product Name',
+    memberDiscount:'Member discount',
+    productType:'Product type',
+    bvSplit:'BV split',
+    productCategory:'Product Category',
+    productCode:'Product Code',
+    unit:'Unit',
+    taxRate:'Tax Rate',
+    uSPrice:'US Price($)',
+    salesPrice:'Sales Price(₦)',
+    marketPrice:'Market Price(₦)',
+    priceBV:'Price BV',
+    inventory:'Inventory',
+    productDetails:'Product details',
+    enterContentNotice:'Please enter the content',
+    order:'Order',
+    uploadImages:'Upload Images',
+  },
+
   // 管理员管理
   Administrator: {
     role: '角色',

+ 25 - 0
src/lang/zh.js

@@ -501,6 +501,31 @@ export default {
     placementNetworkList:'安置网络列表',
   },
 
+  // 商品管理
+  shop: {
+    onSale:'商品上架',
+    soldOut:'商品下架',
+    addProduct:'商品添加',
+    editProducts:'修改商品',
+    productName:'商品名称',
+    memberDiscount:'会员折扣',
+    productType:'商品类型',
+    bvSplit:'BV 分期',
+    productCategory:'商品分类',
+    productCode:'商品编号',
+    unit:'单位',
+    taxRate:'税率',
+    uSPrice:'美元价格($)',
+    salesPrice:'销售价格(₦)',
+    marketPrice:'市场价格(₦)',
+    priceBV:'价格BV',
+    inventory:'库存',
+    productDetails:'商品详情',
+    enterContentNotice:'请输入内容',
+    order:'排序',
+    uploadImages:'上传图片',
+  },
+
   // 管理员管理
   Administrator: {
     role: '角色',

+ 12 - 0
src/router/index.js

@@ -147,6 +147,18 @@ export const constantRoutes = [
       },
     ]
   },
+  {
+    path: '/shop',
+    component: Layout,
+    hidden: true,
+    children: [
+      {
+        path: '/shop/index', // 商品列表
+        component: () => import('@/views/shop/index'),
+        name: 'shop_index',
+      }
+    ]
+  },
   {
     path: '/login',
     component: () => import('@/views/login/index'),

+ 523 - 0
src/views/shop/index.vue

@@ -0,0 +1,523 @@
+<template>
+    <div v-loading="loading">
+      <div class="white-box">
+        <div class="filter-box">
+            <filter-user :filter-types="filterTypes" @select-value="handleFilterUser"></filter-user>
+        </div>
+        <el-table class="table-box" ref="multipleTable" :data="tableData" stripe style="width: 100%;" :height="tool.getTableHeight()" @selection-change="handleSelectionChange">
+          <el-table-column type="selection" width="55" v-if="tableHeaders" :selectable="checkSelectable"></el-table-column>
+          <el-table-column v-for="(tableHeader, key) in tableHeaders" :key="key" :label="tableHeader.header" :width="tableHeader.other.width ? tableHeader.other.width : ''" :prop="tableHeader.other.prop ? tableHeader.other.prop : null">
+            <template slot-scope="scope">
+              <template v-if="scope.row[tableHeader.index].other.tag" >
+                <el-tag :type="scope.row[tableHeader.index].other.tag.type ? scope.row[tableHeader.index].other.tag.type : null" :size="scope.row[tableHeader.index].other.tag.size ? scope.row[tableHeader.index].other.tag.size : null" :class="scope.row[tableHeader.index].other.tag.class ? scope.row[tableHeader.index].other.tag.class : null" >{{scope.row[tableHeader.index].value}}</el-tag>
+              </template>
+              <template v-else>
+                <div v-html="scope.row[tableHeader.index].value"></div>
+              </template>
+            </template>
+          </el-table-column>
+          <el-table-column :fixed="fixedColumn" :label="$t('common.action')" width="180"><!-- 操作 -->
+            <template slot-scope="scope">
+              <el-dropdown size="small" trigger="click" v-if="permission.hasPermission(`shop/goods-edit`) || permission.hasPermission(`shop/goods-delete`)">
+                <el-button type="primary" size="small" @click.stop="">
+                  {{ $t('common.action') }}<!-- 操作该数据 --><i class="el-icon-arrow-down el-icon--right"></i>
+                </el-button>
+                <el-dropdown-menu slot="dropdown">
+                  <el-dropdown-item command="goods-edit" @click.native="handleEditShow(scope.row)">{{ $t('common.edit') }}<!-- 修改数据 --> </el-dropdown-item>
+                  <el-dropdown-item command="del" @click.native="handleDel(scope.row.ID)" v-show="permission.hasPermission(`shop/goods-delete`)">
+                    {{ $t('common.delete') }}<!-- 删除数据 -->
+                  </el-dropdown-item>
+                  <el-dropdown-item command="goods-edit" @click.native="handleGoodUp(scope.row.ID)">{{ $t('shop.onSale') }}<!-- 商品上架 --> </el-dropdown-item>
+                  <el-dropdown-item command="goods-edit" @click.native="handleGoodDown(scope.row.ID)">{{ $t('shop.soldOut') }}<!-- 商品下架 --> </el-dropdown-item>
+                </el-dropdown-menu>
+              </el-dropdown>
+            </template>
+          </el-table-column>
+          <!--   <el-table-column label="操作">
+            <template slot-scope="scope">
+              <el-button type="success" size="small" @click="handleGroupManage(scope.row)" >
+                状态管理
+              </el-button>
+            </template></el-table-column>-->
+        </el-table>
+        <div class="white-box-footer">
+  
+         <!-- <el-dropdown size="small" trigger="click">
+              <el-button type="primary" size="small">
+                  所选数据<i class="el-icon-arrow-down el-icon&#45;&#45;right"></i>
+              </el-button>
+              <el-dropdown-menu slot="dropdown">
+                  <el-dropdown-item command="delete" @click.native="handleMuliDel()">上架</el-dropdown-item>
+              </el-dropdown-menu>
+          </el-dropdown>-->
+          <el-button type="primary" size="small" @click="handlestate" icon="el-icon-plus" v-if="permission.hasPermission(`shop/goods-add`)">
+            <!-- 商品添加 -->{{ $t('shop.addProduct') }}
+          </el-button>
+  
+          <el-button type="success" size="small" @click="handleExport" v-show="permission.hasPermission(`shop/goods-list-export`)">{{ $t('common.exportExcel') }}</el-button>
+          <!-- <el-button-group>
+            <el-button type="success" size="mini" @click.native="handleup(scope.row.ID)">上架</el-button>
+            <el-button type="danger" size="mini">下架</el-button>
+          </el-button-group> -->
+          <pagination :total="totalCount" :page_size="pageSize" @size-change="handleSizeChange" @current-change="handleCurrentChange"></pagination>
+        </div>
+      </div>
+      <el-dialog :title="$t('shop.editProducts')" :visible.sync="dialogEditFormVisible"><!-- 修改商品 -->
+        <el-form :model="form" label-width="250px" class="form-dialog" v-loading="dialogEditLoading">
+          <el-form-item :label="$t('shop.productName')"><!-- 商品名称 -->
+            <el-input v-model="form.goodsName"></el-input>
+          </el-form-item>
+            <!-- <el-form-item label="商品来源">
+              <el-select v-model="form.type">
+                  <el-option v-for="(item,index) in goodsType" :key="index" :label="item.name"
+                             :value="index"></el-option>
+              </el-select>
+            </el-form-item> -->
+            <el-form-item :label="$t('shop.memberDiscount')"><!-- 会员折扣 -->
+              <el-input v-model="form.sellDiscount"></el-input>
+            </el-form-item>
+            <el-form-item :label="$t('shop.productType')"><!-- 商品类型 -->
+              <el-checkbox  v-for="(value,index) in GiftTypeArr" v-model="value.checked" :key="index" >{{value.name}}</el-checkbox>
+            </el-form-item>
+            <!-- <el-form-item label="复消购买方式">
+               <el-checkbox  v-for="(value,index) in sell_type" v-model="value.checked" :key="index" >{{value.name}}</el-checkbox>
+            </el-form-item> -->
+            <el-form-item :label="$t('shop.bvSplit')">
+  <!--                      <el-checkbox v-model="form.pvSplit" :checked="form.pvSplit">Yes</el-checkbox>-->
+              <el-select v-model="form.pvSplit" placeholder="">
+                <el-option
+                  v-for="item in pvSplitOptions"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item :label="$t('shop.productCategory')"> <!-- 商品分类 -->
+              <el-select v-model="form.categoryType">
+                <el-option v-for="item in categoryType" :key="item.id" :label="item.name" :value="item.id" ></el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item :label="$t('shop.productCode')"><!-- 商品编号 -->
+              <el-input v-model="form.goodsNo"></el-input>
+            </el-form-item>
+            <el-form-item :label="$t('shop.unit')"><!-- 单位 -->
+              <el-input v-model="form.unit"></el-input>
+            </el-form-item>
+            <el-form-item :label="$t('shop.taxRate')"><!-- 税率 -->
+              <el-input v-model="form.taxRate">
+                <template slot="append">%</template>
+              </el-input>
+            </el-form-item>
+            <el-form-item :label="$t('shop.uSPrice')" p>
+              <el-input v-model="form.sellPriceStandard"></el-input>
+            </el-form-item>
+            <el-form-item :label="$t('shop.salesPrice')" p>
+              <el-input v-model="form.sellPrice"></el-input>
+            </el-form-item>
+            <el-form-item :label="$t('shop.marketPrice')">
+              <el-input v-model="form.marketPrice"></el-input>
+            </el-form-item>
+            <el-form-item :label="$t('shop.priceBV')" v-show="pvDisabled"> <!-- 价格BV -->
+              <el-input v-model="form.pricePv"></el-input>
+            </el-form-item>
+  <!--                    <el-form-item label="Exchange points" v-show="false"> &lt;!&ndash; 兑换积分 &ndash;&gt;-->
+  <!--                        <el-input v-model="form.point"></el-input>-->
+  <!--                    </el-form-item>-->
+            <el-form-item :label="$t('shop.inventory')"> <!-- 库存 -->
+              <el-input v-model="form.storeNums"></el-input>
+            </el-form-item>
+            <el-form-item :label="$t('shop.productDetails')"><!-- 商品详情 -->
+              <el-input
+                type="textarea"
+                :rows="2"
+                :placeholder="$t('shop.enterContentNotice')"
+                v-model="form.content">
+              </el-input><!-- 请输入内容 -->
+            </el-form-item>
+            <el-form-item :label="$t('shop.order')"> <!-- 排序 -->
+              <el-input v-model="form.sort"></el-input>
+            </el-form-item>
+            
+            <el-form-item :label="$t('shop.uploadImages')"> <!-- 上传图片 -->
+              <div class='up_load'>
+             <!-- <img v-if="form.cover&&img_show" :src="form.cover" alt=""> -->
+                <!-- <leo-uploader
+                    @on-success='upLoadSuccess'
+                    :request-route="'shop/upload'"
+                    ref='up_load'
+                    :defaultImageUrl='form.cover'
+                ></leo-uploader> -->
+              </div>
+            </el-form-item>
+  
+          </el-form>
+          <div slot="footer" class="dialog-footer">
+            <el-button @click="dialogEditFormVisible = false">{{ $t('table.cancel') }}<!-- 取 消 --></el-button>
+            <el-button type="primary" @click.native="handleEdit">{{ $t('table.edit') }}<!-- 修 改 --></el-button>
+          </div>
+      </el-dialog>
+    </div>
+  </template>
+  
+  <script>
+  import {getOperatingSystem} from "@/utils"
+  import tool from '@/utils/tool'
+  import baseInfo from '@/utils/baseInfo'
+  import FilterUser from '@/components/FilterUser'
+  import permission from '@/utils/permission'
+  import Pagination from '@/components/Pagination'
+  import filterHelper from '@/utils/filterHelper'
+  import { shopList, goodsListExport, updateGoodsStatus, goodsDelete } from '@/api/shop'
+  
+  
+//   import LeoUploader from '@/components/Uploader';
+  export default {
+    name: 'index',
+    components: {FilterUser, Pagination},
+    mounted () {
+      this.getData()
+      // this.$refs.up_load.successImageUrl='';
+      let system =  getOperatingSystem()
+      if (system == "Android" || system == 'ios') {
+        this.fixedColumn = false
+      } else {
+        this.fixedColumn = 'right'
+      }
+    },
+  
+    data () {
+      return {
+        fixedColumn:false, // 固定,当手机端不固定,pc固定
+        tableHeaders: null,
+        tableData: null,
+        loading: true,
+        currentPage: 1,
+        totalPages: 1,
+        totalCount: 1,
+        pageSize: 20,
+        multipleSelection: [],
+        tool: tool,
+        permission: permission,
+        baseDecLevels: baseInfo.decLevels(),
+        baseEmpLevels: baseInfo.empLevels(),
+        filterTypes: null,
+        dialogVisible: false,
+        dialogLoading: false,
+        filterModel: {},
+        value: [],
+        selectedIds: '',
+        dialogEditFormVisible: false,
+        dialogEditLoading: false,
+        pvSplitOptions: [
+          {
+            value: '0',
+            label: 'No'
+          },
+          {
+            value: '1',
+            label: 'Yes'
+          }],
+        form: {
+          // sellType: [],
+          goodsName: '',
+          type: '',
+          giftType: [],
+          goodsNo: '',
+          unit: '',
+          marketPrice: '',
+          sellPrice: '',
+          sellPriceStandard: '',
+          pricePv: '',
+          point: '',
+          storeNums: '',
+          content: '',
+          sort: '',
+          discount: '',
+          cover: '',
+          textarea: '',
+          sellDiscount: '',
+          pvSplit: '',
+          categoryType: '',
+          sellType: 1,
+          taxRate: 0
+        },
+        submitButtonStat: false,
+        goodsType: [],
+        GiftTypeArr: [],
+        sell_type: [],
+        categoryType: [],
+        img_show: true,
+        pvDisabled: true,
+        exchangeRate: baseInfo.exchangeRate()
+      }
+    },
+    methods: {
+      handleSelectionChange (val) {
+        this.multipleSelection = val
+      },
+      handleCurrentChange (page) {
+        this.getData(page, this.pageSize)
+      },
+      handleSizeChange (pageSize) {
+        this.getData(this.currentPage, pageSize)
+      },
+      handleFilterUser (filterData) {
+        filterHelper.handleFilterUser(this, filterData)
+      },
+      checkSelectable (row) {
+        return row.DONT_DEL !== '1'
+      },
+      handleFilter () {
+        this.getData()
+      },
+      handlestate () {
+        this.$router.push({path: `/shop/goods-add`})
+      },
+      upLoadSuccess (file) {
+        // this.form.cover=file;
+        this.form.cover = tool.getArImage(file, '/files/')
+        this.form.coverOrigin = file
+        this.img_show = false
+      },
+      handleEditShow (row) {
+        this.dialogEditLoading = true
+        this.auditId = row.ID
+        this.dialogEditFormVisible = true
+        let vueObj = this
+        network.getData('shop/goods-edit', {id: this.auditId}).then(response => {
+          vueObj.dialogEditLoading = false
+          vueObj.goodsType = response.goodsType
+          vueObj.categoryType = response.categoryType
+  
+          let gift = response.goodsInfo.GIFT_TYPE;
+          let gift_type = response.giftType
+  
+          let giftType = []
+          if (gift.length > 0) {
+            for (let i in gift_type) {
+              giftType.push({key: i, name: gift_type[i].name, checked: false})
+              gift.map((v, k) => {
+                if (v === i) {
+                  giftType[i - 1].checked = true
+                }
+              })
+            }
+          }
+          vueObj.GiftTypeArr = giftType
+  
+          // let sell = response.goodsInfo.SELL_TYPE;
+          // let sell_type = response.sellType;
+          // let sellType=[];
+          // if(sell.length>0){
+          //     for(let i in sell_type){
+          //         sellType.push({key:i,name:sell_type[i].name,checked:false})
+          //         sell.map((item,index)=>{
+          //             if(item==i){
+          //                 sellType[i-1].checked=true;
+          //             }
+          //         })
+          //     }
+          // }
+          vueObj.sell_type = response.goodsInfo.SELL_TYPE;
+          vueObj.form.goodsName = response.goodsInfo.GOODS_NAME
+          vueObj.form.sellDiscount = response.goodsInfo.SELL_DISCOUNT
+          vueObj.form.goodsNo = response.goodsInfo.GOODS_NO
+          vueObj.form.type = response.goodsInfo.TYPE
+          vueObj.form.unit = response.goodsInfo.UNIT
+          vueObj.form.marketPrice = response.goodsInfo.MARKET_PRICE
+          vueObj.form.sellPrice = response.goodsInfo.SELL_PRICE
+          vueObj.form.sellPriceStandard = response.goodsInfo.SELL_PRICE_STANDARD
+          vueObj.form.pricePv = response.goodsInfo.PRICE_PV
+          vueObj.form.point = response.goodsInfo.POINT
+          vueObj.form.storeNums = response.goodsInfo.STORE_NUMS
+          vueObj.form.content = response.goodsInfo.CONTENT
+          vueObj.form.sort = response.goodsInfo.SORT
+          vueObj.form.id = response.goodsInfo.ID
+          vueObj.form.pvSplit = response.goodsInfo.PV_SPLIT
+          // vueObj.form.cover = response.goodsInfo.COVER
+          vueObj.form.categoryType = parseInt(response.goodsInfo.CATEGORY_TYPE)
+          vueObj.form.taxRate = response.goodsInfo.TAX_RATE
+          // vueObj.form.sellType=vueObj.form.sellType.map((item,index)=>{
+          //   return response.goodsInfo.SELL_TYPE.some(val=>(index+1).toString()==val)
+          //   })
+  
+          vueObj.form.coverOrigin = response.goodsInfo.COVER
+          vueObj.form.cover = tool.getArImage(response.goodsInfo.COVER, '/files/')
+  
+          this.$forceUpdate()
+        })
+      },
+      handleEdit () {
+        this.dialogEditFormVisible = false
+        this.$message({
+          message: 'Modifying data', // 正在修改数据
+          type: 'info'
+        })
+        let path = 'shop/goods-edit'
+  
+        // let sen_sell=[];
+        // this.sell_type.map((item,index)=>{
+        //     if(item.checked){
+        //         sen_sell.push(item.key);
+        //     }
+        // })
+        // this.form.sellType=sen_sell;
+  
+        let sen_gift = []
+        this.GiftTypeArr.map((item, index) => {
+          if (item.checked) {
+            sen_gift.push(item.key)
+          }
+        })
+        this.form.giftType = sen_gift
+        this.form.sellType = 1
+        this.form.cover = this.form.coverOrigin
+        delete this.form.coverOrigin
+  
+        network.postData(path, {...this.form}).then(response => {
+          this.$message({
+            message: response,
+            type: 'success'
+          })
+          this.getData(this.currentPage, this.pageSize)
+        }).catch(response => {
+        })
+      },
+  
+      handleDel (id = null) {
+        let obj = this
+        this.$confirm(this.$t('common.deleteTips'), this.$t('common.hint'), { // '确定删除选定的数据?', '提示'
+          confirmButtonText: this.$t('common.confirm'), // 确定
+          cancelButtonText: this.$t('common.cancel'), // 取消
+          type: 'warning'
+        }).then(() => {
+          let selectedIds = []
+          if (id === null) {
+            for (let val of obj.multipleSelection) {
+              selectedIds.push(val.ID)
+            }
+          } else {
+            selectedIds.push(id)
+          }
+          goodsDelete({selected: selectedIds}).then(response => {
+            this.$message({
+                message: response.data,
+                type: 'success'
+            })
+            obj.getData(obj.currentPage, obj.pageSize)
+          }).catch(err => {
+            this.$message({
+                message: err,
+                type: 'error'
+            })
+          })
+        })
+      },
+      getData (page, pageSize) {
+        let filterData = this.filterModel
+        /* this.allData = response */
+        let vueObj=this
+        const paramsData = Object.assign({
+        page: (page === null || page == undefined) ? 1 : page,
+        pageSize: (pageSize === null || pageSize == undefined) ? vueObj.pageSize : pageSize
+        }, filterData)
+        shopList(paramsData).then(response => {
+            vueObj.tableHeaders = response.data.columnsShow ? response.data.columnsShow : []
+            vueObj.tableData = response.data.list
+            vueObj.filterTypes = response.data.filterTypes
+            vueObj.currentPage = page
+            vueObj.totalPages = parseInt(response.data.totalPages)
+            vueObj.totalCount = parseInt(response.data.totalCount)
+            vueObj.pageSize = pageSize
+            this.loading = false
+        }).catch(err => {
+            this.loading = false
+            this.$message({
+                message: err,
+                type: 'error'
+            })
+        })
+      },
+      handleGoodUp (id) {
+        updateGoodsStatus({selectedIds: id, status: 1}).then(response => {
+            this.$message({
+              message: response.data,
+              type: 'success'
+            })
+            this.getData(this.currentPage, this.pageSize)
+        }).catch(err => {
+            this.$message({
+              message: err,
+              type: 'error'
+            })
+        })
+      },
+      handleGoodDown (id) {
+        updateGoodsStatus({selectedIds: id, status: 0}).then(response => {
+            this.$message({
+              message: response.data,
+              type: 'success'
+            })
+            this.getData(this.currentPage, this.pageSize)
+        }).catch(err => {
+            this.$message({
+              message: err,
+              type: 'error'
+            })
+        })
+      },
+  
+      handleExport () {
+        this.$confirm(this.$t('financial.exportNotice'), this.$t('common.hint'), { // 确定要导出当前数据吗?`, '提示'
+          confirmButtonText: this.$t('common.confirm'), // 确定
+          cancelButtonText: this.$t('common.cancel'), // 取消
+          type: 'warning'
+        }).then(() => {
+            goodsListExport(this.filterModel).then(response => {
+                this.$message({
+                    message: response.data,
+                    type: 'success'
+                })
+            }).catch(err => {
+                this.$message({
+                    message: err,
+                    type: 'error'
+                })
+            })
+        })
+      }
+    },
+    watch: {
+      // 监听商品分类,控制PV是否展示
+      'form.categoryType': {
+        deep: true,
+        handler (modern, origin) {
+          this.pvDisabled = (parseInt(modern) === 1)
+        }
+      }
+      // // 监听商品标准价格,自动计算销售价格
+      // 'form.sellPriceStandard': {
+      //     deep: true,
+      //     handler(modern, origin) {
+      //         this.form.sellPrice = modern * this.exchangeRate
+      //     }
+      // },
+    }
+  }
+  
+  </script>
+  
+  <style scoped>
+      .table-box .el-form-item__label {
+          width: 100px;
+          color: #99a9bf;
+      }
+  
+      .table-box .el-form-item {
+          width: 30%;
+          margin-right: 0;
+          margin-bottom: 0;
+      }
+  </style>
+