123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- <template>
- <div id="goods">
- <template v-if="view === 'list'">
- <data-search :fields="searchFields" v-model="searchInfo" @query="search">
- <template #status>
- <el-option v-for="i in goodsStatusList" :key="i.value" :label="i.label" :value="i.value"></el-option>
- </template>
- </data-search>
- <data-btn :fields="btnList" @add="toAdd"></data-btn>
- <data-table
- ref="dataTable"
- :fields="fields"
- :opera="opera"
- :data="list"
- :total="total"
- :limit="limit"
- @query="search"
- @edit="toEdit"
- @puton="toPuton"
- @lower="toLower"
- @delete="toDelete"
- @spec="toSpec"
- ></data-table>
- </template>
- <template v-else>
- <el-row>
- <el-col :span="24">
- <el-button icon="el-icon-back" size="mini" @click="toBack()">返回</el-button>
- </el-col>
- <el-col :span="24">
- <data-form :fields="infoFields" :rules="rules" v-model="form" labelWidth="150px" @save="toSave">
- <template #tags="{ item }">
- <el-cascader v-model="form[item.model]" :options="tagsList" :props="props" clearable filterable :show-all-levels="false"></el-cascader>
- </template>
- <template #act_tags>
- <el-option v-for="i in act_tagsList" :key="i.value" :label="i.label" :value="i.value"></el-option>
- </template>
- <template #status>
- <el-option v-for="i in goodsStatusList" :key="i.value" :label="i.label" :value="i.value"></el-option>
- </template>
- <template #brief>
- <editor v-model="form.brief" url="/files/point/goods/upload" />
- </template>
- </data-form>
- </el-col>
- </el-row>
- </template>
- </div>
- </template>
- <script>
- const _ = require('lodash');
- import methodsUtil from '@/util/opera';
- import { mapState, createNamespacedHelpers } from 'vuex';
- const { mapActions: selfShop } = createNamespacedHelpers('selfShop');
- const { mapActions: goods } = createNamespacedHelpers('goods');
- const { mapActions: goodsTags } = createNamespacedHelpers('goodsTags');
- const { mapActions: dictData } = createNamespacedHelpers('dictData');
- export default {
- name: 'index',
- props: {},
- components: { editor: () => import('@/components/editor.vue') },
- data: function () {
- return {
- view: 'list',
- fields: [
- { label: '商品名称', model: 'name' },
- { label: '店铺名称', model: 'shop.name' },
- { label: '商品分类', model: 'tags', format: (i) => this.getTags(i) },
- { label: '活动标签', model: 'act_tags', format: (i) => this.getAct_tags(i) },
- { label: '商品状态', model: 'status', format: (i) => this.getStatus(i) },
- ],
- opera: [
- { label: '修改', method: 'edit' },
- { label: '上架', method: 'puton' },
- { label: '下架', method: 'lower' },
- { label: '库存管理', method: 'spec' },
- { label: '删除', method: 'delete', confirm: true, type: 'danger' },
- ],
- btnList: [{ label: '添加', method: 'add' }],
- searchFields: [
- { label: '商品名称', model: 'name' },
- { label: '商品状态', model: 'status', type: 'select' },
- ],
- searchInfo: {},
- list: [],
- total: 0,
- limit: 10,
- // info部分
- infoFields: [
- { label: '商品名称', model: 'name' },
- { label: '商品分类', model: 'tags', custom: true },
- { label: '活动标签', model: 'act_tags', type: 'selectMany' },
- { label: '简短简介', model: 'shot_brief', maxLength: 50 },
- { label: '预计发货时间', model: 'send_time' },
- { label: '商品状态', model: 'status', type: 'select' },
- { label: '商品来源', model: 'source' },
- { label: '网址', model: 'url' },
- { label: '排序', model: 'sort', type: 'number' },
- { label: '商品图片', model: 'file', type: 'upload', url: '/files/point/goods/upload' },
- { label: '商品介绍', model: 'brief', custom: true },
- ],
- rules: {},
- form: {},
- // 商品分类
- tagsList: [],
- props: { multiple: true, label: 'label', value: 'code' },
- // 活动标签
- act_tagsList: [],
- goodsStatusList: [],
- shop: {},
- };
- },
- created() {
- this.searchOthers();
- this.search();
- },
- methods: {
- ...dictData({ getDict: 'query' }),
- ...goodsTags(['tree']),
- ...selfShop(['getInfo', 'getGoods', 'goodsCreate']),
- ...goods(['delete', 'fetch', 'update', 'create']),
- ...methodsUtil,
- async search({ skip = 0, limit = this.limit, ...others } = {}) {
- let query = { skip, limit, ...others };
- if (Object.keys(this.searchInfo).length > 0) query = { ...query, ...this.searchInfo };
- const res = await this.getGoods(query);
- if (this.$checkRes(res)) {
- this.$set(this, `list`, res.data);
- this.$set(this, `total`, res.total);
- }
- },
- initAddData() {
- const obj = {
- status: '1',
- shop: _.get(this.shop, '_id'),
- };
- this.$set(this, 'form', obj);
- },
- async searchOthers() {
- let res = await this.tree();
- if (this.$checkRes(res)) this.$set(this, `tagsList`, res.data);
- res = await this.getDict({ code: 'goods_status' });
- if (this.$checkRes(res)) this.$set(this, `goodsStatusList`, res.data);
- res = await this.getInfo();
- if (this.$checkRes(res)) this.$set(this, `shop`, res.data);
- res = await this.getDict({ code: 'act_tags' });
- if (this.$checkRes(res)) this.$set(this, `act_tagsList`, res.data);
- },
- getStatus(data) {
- const res = this.goodsStatusList.find((f) => f.value === data);
- if (res) return res.label;
- return '';
- },
- getAct_tags(data) {
- const arr = [];
- for (const val of data) {
- const r = this.act_tagsList.find((f) => f.value === val);
- if (r) arr.push(r.label);
- }
- return arr.join(';');
- },
- getTags(data) {
- let list = this.tagsList;
- const getChildren = (list) =>
- list.map((i) => {
- if (i.children) return getChildren(i.children);
- return i;
- });
- list = _.flattenDeep(getChildren(list));
- const arr = [];
- for (const ts of data) {
- const last = _.last(ts);
- const r = list.find((f) => f.code === last);
- if (r) arr.push(r.label);
- }
- return arr.join(';');
- },
- // 上架
- async toPuton({ data }) {
- this.$confirm('是否确认上架该商品?', '提示', {
- confirmButtonText: '确定',
- cancelButtonText: '取消',
- type: 'warning',
- }).then(async () => {
- data.status = '1';
- let res;
- if (data.id) res = await this.update(data);
- if (this.$checkRes(res)) {
- this.$message({ type: `success`, message: `上架成功` });
- }
- this.search();
- });
- },
- // 下架
- async toLower({ data }) {
- this.$confirm('是否确认下架该商品?', '提示', {
- confirmButtonText: '确定',
- cancelButtonText: '取消',
- type: 'warning',
- }).then(async () => {
- data.status = '0';
- let res;
- if (data._id) res = await this.update(data);
- if (this.$checkRes(res)) {
- console.log(res.data);
- this.$message({ type: `success`, message: `下架成功` });
- }
- this.search();
- });
- },
- toSpec({ data }) {
- this.$router.push({ path: `/selfShop/spec/${data._id}` });
- },
- },
- };
- </script>
- <style lang="less" scoped></style>
|