Sfoglia il codice sorgente

合并所有页面

dingxin 6 anni fa
parent
commit
5d76b07fed

+ 3
- 1
src/store/index.js Vedi File

@@ -18,6 +18,7 @@ import visitor from './modules/visitor'
18 18
 import lobby from './modules/lobby'
19 19
 import followup from './modules/followup'
20 20
 import sysyrole from './modules/role'
21
+import goods from './modules/goods'
21 22
 import sysmenu from './modules/sysmenu'
22 23
 
23 24
 Vue.use(Vuex)
@@ -42,7 +43,8 @@ const store = new Vuex.Store({
42 43
     lobby,
43 44
     followup,
44 45
     sysyrole,
45
-    sysmenu
46
+    goods,
47
+    sysmenu,
46 48
   }
47 49
 })
48 50
 

+ 71
- 0
src/store/modules/goods.js Vedi File

@@ -0,0 +1,71 @@
1
+import { interact, replaceApiParams } from '../../utils'
2
+import apis from '../../config/api'
3
+
4
+export default {
5
+  namespaced: true,
6
+  state: {
7
+    goodsList: [],
8
+    goodsInfo: {},
9
+    goodsTypes: [],
10
+    goodsSpecs: [],
11
+  },
12
+  mutations: {
13
+    updateList (state, payload) {
14
+      state.goodsList = payload || []
15
+    },
16
+    updateInfo (state, payload) {
17
+      state.goodsInfo = payload || {}
18
+    },
19
+    updateTypes (state, payload) {
20
+      state.goodsTypes = payload || {}
21
+    },
22
+    updateSpecs (state, payload) {
23
+      state.goodsSpecs = payload || {}
24
+    }
25
+  },
26
+  actions: {
27
+    GetGoodsList ({ commit }, payload) {
28
+      return new Promise((resolve, reject) => {
29
+        interact(apis.goodsManager.getGoodsList, payload).then(res => {
30
+          commit('updateList', res)
31
+          resolve(res)
32
+        }).catch(reject)
33
+      })
34
+    },
35
+    GetGoodTypes ({ commit }, payload) {
36
+      return new Promise((resolve, reject) => {
37
+        interact(apis.goodsManager.getGoodsTypeList, payload).then(res => {
38
+          commit('updateTypes', res)
39
+          resolve(res)
40
+        }).catch(reject)
41
+      })
42
+    },
43
+    GetGoodSpecs ({ commit }, payload) {
44
+      interact(apis.goodsManager.getGoodsSpecList, payload).then(res => {
45
+        commit('updateSpecs', res)
46
+      })
47
+    },
48
+    GetGoodsByID ({ commit }, { id }) {
49
+      interact(replaceApiParams(apis.goodsManager.getGoodsByID, { id })).then(res => {
50
+        commit('updateInfo', res)
51
+      })
52
+    },
53
+    AddGoods ({ commit }, payload) {
54
+      interact(apis.goodsManager.addGoods, payload).then(res => {
55
+        commit('updateInfo', res)
56
+      })
57
+    },
58
+    UpdateGoods (_, payload) {
59
+      interact(replaceApiParams(apis.goodsManager.updateGoods, { id: payload.GoodsId }), payload).then(x => x)
60
+    },
61
+    DelGoods (_, { id, callback }) {
62
+      interact(replaceApiParams(apis.goodsManager.deleteGoods.url, { id: id })).then(callback)
63
+    },
64
+    SetNull ({ commit }) {
65
+      commit('updateInfo', {})
66
+    },
67
+    UpdateInfo ({ commit }, payload) {
68
+      commit('updateInfo', payload)
69
+    }
70
+  }
71
+}

+ 1
- 1
src/store/modules/role.js Vedi File

@@ -1,5 +1,5 @@
1 1
 import lodash from 'lodash'
2
-import { interact, replaceApiParams } from '../../utils'
2
+import { interact } from '../../utils'
3 3
 import apis from '../../config/api'
4 4
 
5 5
 export default {

+ 255
- 0
src/views/goodsManager/goodManager/edit.vue Vedi File

@@ -0,0 +1,255 @@
1
+<template>
2
+  <div class="subPage">
3
+    <form class="mainForm">
4
+      <ul>
5
+         <li class="flex-h">
6
+          <span>选择案场:<em>*</em></span>
7
+          <div class="flex-item">
8
+            <div style="width:50%">
9
+              <el-select v-model="Case" placeholder="请选择">
10
+                <el-option
11
+                  v-for="item in cases"
12
+                  :key="item.CaseId"
13
+                  :label="item.CaseName"
14
+                  :value="item.CaseId">
15
+                </el-option>
16
+              </el-select>
17
+            </div>
18
+          </div>
19
+        </li>
20
+        <li class="flex-h">
21
+          <span>商品名称:<em>*</em></span>
22
+          <div class="flex-item">
23
+            <div style="width:50%">
24
+              <el-input
25
+                placeholder="请输入商品名称"
26
+                v-model="detail.GoodsName"
27
+                clearable>
28
+              </el-input>
29
+            </div>
30
+          </div>
31
+        </li>
32
+        <li class="flex-h">
33
+          <span>商品图片:<em>*</em></span>
34
+          <div class="flex-item">
35
+            <div class="red-hint">建议上传150*150尺寸的图片</div>
36
+            <div style="width:50%">
37
+              <el-upload
38
+                class="avatar-uploader"
39
+                action='string'
40
+                :before-upload="toolClass.beforeUpload"
41
+                :http-request="toolClass.upload"
42
+                :show-file-list="false"
43
+                :on-success="handleAvatarSuccess">
44
+                <img v-if="Image" :src="Image" class="avatar">
45
+                <i v-else class="el-icon-plus avatar-uploader-icon"></i>
46
+              </el-upload>
47
+            </div>
48
+          </div>
49
+        </li>
50
+        <li class="flex-h">
51
+          <span>商品价格:<em>*</em></span>
52
+          <div class="flex-item">
53
+            <div style="width:50%">
54
+              <el-input
55
+                placeholder="请输入商品价格"
56
+                v-model="detail.Price"
57
+                clearable>
58
+              </el-input>
59
+            </div>
60
+          </div>
61
+        </li>
62
+        <li class="flex-h">
63
+          <span>商品规格:</span>
64
+          <div class="flex-item">
65
+            <div style="width:50%">
66
+              <el-select v-model="detailSpecs" multiple placeholder="请选择" style="width:100%;">
67
+                <el-option
68
+                  v-for="item in ((Case || '') === '' ? [] : specs.list)"
69
+                  :key="item.SpecId"
70
+                  :label="item.SpecName"
71
+                  :value="item.SpecId">
72
+                </el-option>
73
+              </el-select>
74
+            </div>
75
+          </div>
76
+        </li>
77
+        <li class="flex-h">
78
+          <span>商品类别:<em>*</em></span>
79
+          <div class="flex-item">
80
+            <div style="width:50%">
81
+              <el-select v-model="TypeId" placeholder="请选择商品类型">
82
+                <el-option
83
+                  v-for="item in ((Case || '') === '' ? [] : types.list)"
84
+                  :key="item.TypeId"
85
+                  :label="item.TypeName"
86
+                  :value="item.TypeId">
87
+                </el-option>
88
+              </el-select>
89
+            </div>
90
+          </div>
91
+        </li>
92
+        <li style="text-align:center">
93
+          <el-button type="primary" size="mini" @click='submit'>保存</el-button>
94
+          <el-button type="danger" size="mini" @click="cancel">取消</el-button>
95
+        </li>
96
+      </ul>
97
+    </form>
98
+  </div>
99
+</template>
100
+
101
+<script>
102
+import { createNamespacedHelpers, mapState, mapActions } from 'vuex'
103
+
104
+const { mapState: mapGoodsState, mapActions: mapGoodsActions } = createNamespacedHelpers('goods')
105
+export default {
106
+  name: '',
107
+  data () {
108
+    return {
109
+      limit: 1,
110
+      dialogVisible: false,
111
+      infoSpecs: null,
112
+    }
113
+  },
114
+  components: {},
115
+  computed: {
116
+    ...mapGoodsState({
117
+      detail: x => x.goodsInfo,
118
+      types: x => x.goodsTypes,
119
+      specs: x => x.goodsSpecs,
120
+    }),
121
+    ...mapState({
122
+      cases: x => x.app.cases.list,
123
+      caseid: x => x.app.cases.default,
124
+      orgid: x => x.app.user.OrgId,
125
+    }),
126
+    Case: {
127
+      get () {
128
+        return this.detail.CaseId
129
+      },
130
+      set (val) {
131
+        this.UpdateInfo({ ...this.detail, CaseId: val })
132
+        this.detail.TypeId = ''
133
+        this.GetGoodTypes({ pagesize: 1000, caseid: this.Case })
134
+        this.GetGoodSpecs({ pagesize: 1000, caseid: this.Case })
135
+      }
136
+    },
137
+    detailSpecs: {
138
+      get () {
139
+        // console.log(this.infoSpecs || (this.detail.Specs || []).map(x => x.SpecId))
140
+        return this.infoSpecs || (this.detail.Specs || []).map(x => x.SpecId)
141
+      },
142
+      set (val) {
143
+        this.infoSpecs = val
144
+      },
145
+    },
146
+    Image () {
147
+      return ((this.detail.Images || [])[0] || {}).ImgUrl
148
+    },
149
+    TypeId: {
150
+      get () {
151
+        return this.detail.TypeId
152
+      },
153
+      set (val) {
154
+        this.UpdateInfo({ ...this.detail, TypeId: val })
155
+      },
156
+    },
157
+  },
158
+  methods: {
159
+    ...mapGoodsActions([
160
+      'GetGoodTypes',
161
+      'GetGoodsByID',
162
+      'AddGoods',
163
+      'UpdateGoods',
164
+      'SetNull',
165
+      'UpdateInfo',
166
+      'GetGoodSpecs',
167
+    ]),
168
+    ...mapActions([
169
+      'picSize'
170
+    ]),
171
+    submit () {
172
+      this.detail.specs = JSON.stringify(this.detailSpecs.map(x => ({ SpecId: x, GoodsPrice: this.detail.Price })))
173
+      this.detail.images = (this.detail.Images || []).map(x => {
174
+        if (x.response) {
175
+          return x.response.result.url
176
+        } else {
177
+          return x.ImgUrl
178
+        }
179
+      }).join(',')
180
+      if ((this.detail.CaseId || '') === '') {
181
+        this.$message({
182
+          type: 'error',
183
+          message: '案场不能为空'
184
+        })
185
+        return false
186
+      }
187
+      if ((this.detail.GoodsName || '') === '') {
188
+        this.$message({
189
+          type: 'error',
190
+          message: '商品名称不能为空'
191
+        })
192
+        return false
193
+      }
194
+      if ((this.detail.Images || '') === '') {
195
+        this.$message({
196
+          type: 'error',
197
+          message: '图片不能为空'
198
+        })
199
+        return false
200
+      }
201
+      if ((this.detail.Price || '') === '') {
202
+        this.$message({
203
+          type: 'error',
204
+          message: '价格不能为空'
205
+        })
206
+        return false
207
+      }
208
+      if ((this.detail.TypeId || '') === '') {
209
+        this.$message({
210
+          type: 'error',
211
+          message: '类别不能为空'
212
+        })
213
+        return false
214
+      }
215
+      if ((this.detail.GoodsId || '') === '') {
216
+        this.detail.OrgId = this.orgid
217
+        this.AddGoods(this.detail)
218
+      } else {
219
+        if ((this.detail.CaseId || '') === '') {
220
+          this.$message({
221
+            type: 'error',
222
+            message: '案场不能为空'
223
+          })
224
+          return false
225
+        }
226
+        this.UpdateGoods(this.detail)
227
+      }
228
+      this.$message({
229
+        type: 'success',
230
+        message: '操作成功'
231
+      })
232
+      this.$router.push({ name: 'goodsInfo' })
233
+    },
234
+    cancel () {
235
+      this.$router.go(-1)
236
+    },
237
+    handleAvatarSuccess (res, file) {
238
+      this.UpdateInfo({ ...this.detail, Images: [{ ImgUrl: res.result.url }] })
239
+    },
240
+  },
241
+  created () {
242
+    this.picSize({ w: 150, h: 150 })
243
+    const { id } = this.$route.query
244
+    if (id && id !== '') {
245
+      this.GetGoodTypes({ pagesize: 1000, caseid: this.Case })
246
+      this.GetGoodSpecs({ pagesize: 1000, caseid: this.Case })
247
+      this.GetGoodsByID({ id: id })
248
+    }
249
+  }
250
+}
251
+</script>
252
+
253
+<!-- Add "scoped" attribute to limit CSS to this component only -->
254
+<style lang="scss" scoped>
255
+</style>

+ 213
- 0
src/views/goodsManager/goodManager/index.vue Vedi File

@@ -0,0 +1,213 @@
1
+<template>
2
+  <div class="subPage">
3
+    <div class="system-table-search">
4
+      <div class="flex-h">
5
+        <div class="flex-item flex-h">
6
+          <el-button size="mini" type="success" @click='addRole'>新增商品</el-button>
7
+        </div>
8
+        <ul>
9
+          <li>
10
+            <!-- <span>选择案场:</span> -->
11
+            <el-select v-model="CaseId" placeholder="请选择">
12
+              <el-option
13
+                key="all"
14
+                label="所有案场"
15
+                value="all">
16
+              </el-option>
17
+              <el-option
18
+                v-for="item in cases"
19
+                :key="item.CaseId"
20
+                :label="item.CaseName"
21
+                :value="item.CaseId">
22
+              </el-option>
23
+            </el-select>
24
+          </li>
25
+          <li>
26
+            <el-input
27
+              placeholder="请输入商品名称"
28
+              v-model="postData.name"
29
+            >
30
+            </el-input>
31
+          </li>
32
+          <li>
33
+            <span>商品类型:</span>
34
+            <el-select v-model="postData.type" placeholder="请选择">
35
+              <el-option
36
+                v-for="item in types.list"
37
+                :key="item.TypeId"
38
+                :label="item.TypeName"
39
+                :value="item.TypeId">
40
+              </el-option>
41
+            </el-select>
42
+          </li>
43
+        </ul>
44
+        <el-button
45
+          size="mini"
46
+          type="primary" @click="search">搜索</el-button>
47
+      </div>
48
+      <div class="moreFilter"></div>
49
+    </div>
50
+    <div class="system-table-box">
51
+      <el-table :data="goods.list" stripe style="width: 100%">
52
+        <el-table-column prop="GoodsName" label="商品名称">
53
+        </el-table-column>
54
+        <el-table-column label="图片" width="300">
55
+          <template slot-scope="scope">
56
+            <img :src="((scope.row.Images || [])[0] || {}).ImgUrl" style="width:200px;" />
57
+          </template>
58
+        </el-table-column>
59
+        <el-table-column prop="Price" label="价格">
60
+        </el-table-column>
61
+        <el-table-column label="类型">
62
+          <template slot-scope="scope">
63
+            <label>{{getTypeName(scope.row.TypeId)}}</label>
64
+          </template>
65
+        </el-table-column>
66
+        <el-table-column label="规格">
67
+          <template slot-scope="scope">
68
+            <label>{{getSpecNames(scope.row.Specs)}}</label>
69
+          </template>
70
+        </el-table-column>
71
+        <el-table-column label="案场">
72
+          <template slot-scope="scope">
73
+            <label>{{getCaseName(scope.row.CaseId)}}</label>
74
+          </template>
75
+        </el-table-column>
76
+        <el-table-column fixed='right' label="操作" width="300">
77
+          <template slot-scope="scope">
78
+            <el-button size="mini" type="warning" @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
79
+            <el-button size="mini" type="danger" @click="handleDelete(scope.$index, scope.row)">删除</el-button>
80
+          </template>
81
+        </el-table-column>
82
+      </el-table>
83
+    </div>
84
+    <el-pagination
85
+    @size-change="handleSizeChange"
86
+    @current-change="handleCurrentChange"
87
+    :current-page.sync="currentPage"
88
+    :page-size="postData.pagesize"
89
+    layout="prev, pager, next, jumper"
90
+    :total="goods.pagenum">
91
+    </el-pagination>
92
+  </div>
93
+</template>
94
+
95
+<script>
96
+import { createNamespacedHelpers, mapState } from 'vuex'
97
+import tableSearch from '@/components/tableSearch/index'
98
+
99
+const { mapState: mapGoodsState, mapActions: mapGoodsActions } = createNamespacedHelpers('goods')
100
+
101
+export default {
102
+  name: '',
103
+  data () {
104
+    return {
105
+      currentPage: 0, // 当前页码
106
+      key: '',
107
+      postData: {
108
+        caseid: '',
109
+        name: '',
110
+        type: '',
111
+        page: 1,
112
+        pagesize: 10,
113
+      },
114
+    }
115
+  },
116
+  computed: {
117
+    ...mapState({
118
+      cases: x => x.app.cases.list,
119
+      defaultCaseId: x => x.app.cases.default
120
+    }),
121
+    ...mapGoodsState({
122
+      goods: x => x.goodsList,
123
+      types: x => x.goodsTypes,
124
+    }),
125
+    CaseId: {
126
+      get () {
127
+        return this.postData.caseid || this.defaultCaseId
128
+      },
129
+      set (val) {
130
+        this.postData.caseid = val
131
+        this.GetGoodTypes({ pagesize: 1000, caseid: this.CaseId === 'all' ? '' : this.CaseId })
132
+      }
133
+    }
134
+  },
135
+  components: {
136
+    tableSearch
137
+  },
138
+  methods: {
139
+    ...mapGoodsActions([
140
+      'GetGoodsList',
141
+      'GetGoodTypes',
142
+      'DelGoods',
143
+      'SetNull',
144
+    ]),
145
+    getTypeName (typeid) {
146
+      return (this.types.list.filter(x => x.TypeId === typeid)[0] || {}).TypeName
147
+    },
148
+    getSpecNames (specs) {
149
+      return (specs || []).map(x => x.SpecName).join(',')
150
+    },
151
+    getCaseName (caseid) {
152
+      return (this.cases.filter(x => x.CaseId === caseid)[0] || {}).CaseName
153
+    },
154
+    search () { // 搜索
155
+      this.postData.page = 1
156
+      this.currentList = []
157
+      this.getList()
158
+    },
159
+    getList () {
160
+      this.GetGoodsList({ ...this.postData, caseid: this.CaseId === 'all' ? '' : this.CaseId })
161
+    },
162
+    handleSizeChange (val) {
163
+      console.log(`每页 ${val} 条`)
164
+    },
165
+    handleCurrentChange (val) {
166
+      this.postData.page = this.currentPage
167
+      this.getList()
168
+    },
169
+    handleEdit (index, row) {
170
+      // 编辑
171
+      this.SetNull()
172
+      this.$router.push({ name: 'editGoods', query: { id: row.GoodsId } })
173
+    },
174
+    handleDelete (index, row) {
175
+      // 删除
176
+      this.$confirm('确认删除此商品?', '提示', {
177
+        confirmButtonText: '确定',
178
+        cancelButtonText: '取消',
179
+        type: 'warning'
180
+      })
181
+        .then(() => {
182
+          this.DelGoods({ id: row.GoodsId, callback: this.delCallBack })
183
+        })
184
+        .catch(() => {
185
+          this.$message({
186
+            type: 'info',
187
+            message: '已取消删除'
188
+          })
189
+        })
190
+    },
191
+    delCallBack () {
192
+      this.$message({
193
+        type: 'success',
194
+        message: '删除成功!'
195
+      })
196
+      this.getList()
197
+    },
198
+    addRole () {
199
+      this.SetNull()
200
+      this.$router.push({ name: 'addGoods' })
201
+    },
202
+  },
203
+  created () {
204
+    this.GetGoodTypes({ pagesize: 1000, caseid: this.CaseId })
205
+    this.$nextTick(function () {
206
+      this.getList()
207
+    })
208
+  },
209
+}
210
+</script>
211
+
212
+<style lang="scss" scoped>
213
+</style>

+ 105
- 0
src/views/goodsManager/goodsSpecManager/add.vue Vedi File

@@ -0,0 +1,105 @@
1
+<template>
2
+  <div class="subPage">
3
+    <form class="mainForm">
4
+      <ul>
5
+        <li class="flex-h">
6
+          <span>规格名:<em>*</em></span>
7
+          <div class="flex-item">
8
+            <div style="width:50%">
9
+              <el-input
10
+                placeholder="请输入规格名"
11
+                v-model="postData.SpecName"
12
+                clearable>
13
+              </el-input>
14
+            </div>
15
+          </div>
16
+        </li>
17
+        <li class="flex-h">
18
+          <span>选择案场:<em>*</em></span>
19
+          <div class="flex-item">
20
+            <div style="width:50%">
21
+              <el-select v-model="CaseId" placeholder="请选择">
22
+                <el-option
23
+                  v-for="item in cases"
24
+                  :key="item.CaseId"
25
+                  :label="item.CaseName"
26
+                  :value="item.CaseId">
27
+                </el-option>
28
+              </el-select>
29
+            </div>
30
+          </div>
31
+        </li>
32
+        <li style="text-align:center">
33
+          <el-button type="primary" size="mini" @click="submit">保存</el-button>
34
+          <el-button type="danger" size="mini" @click="cancel">取消</el-button>
35
+        </li>
36
+      </ul>
37
+    </form>
38
+  </div>
39
+</template>
40
+
41
+<script>
42
+import { mapState } from 'vuex'
43
+
44
+export default {
45
+  name: '',
46
+  data () {
47
+    return {
48
+      postData: {
49
+        SpecId: '', // 规格id(新增传空值)
50
+        SpecName: '', // 规格名称
51
+        Status: '', // 状态(无状态可传空值)
52
+        OrgId: '', // 机构id
53
+        CaseId: '', // 案场id
54
+      }
55
+    }
56
+  },
57
+  computed: {
58
+    ...mapState({
59
+      cases: x => x.app.cases.list,
60
+      defaultCaseId: x => x.app.cases.default,
61
+      OrgId: x => x.app.user.OrgId,
62
+    }),
63
+    CaseId: {
64
+      get () {
65
+        return this.postData.CaseId === '' ? this.defaultCaseId || '' : this.postData.CaseId
66
+      },
67
+      set (val) {
68
+        this.postData.CaseId = val
69
+      }
70
+    }
71
+  },
72
+  components: {},
73
+  methods: {
74
+    submit () { // 提交数据
75
+      if (this.postData.SpecName === '') {
76
+        this.$message({
77
+          message: '规格名不能为空',
78
+          type: 'error'
79
+        })
80
+        return false
81
+      }
82
+      this.postData.OrgId = this.OrgId
83
+      if (this.postData.CaseId === '') this.postData.CaseId = this.CaseId
84
+      this.$ajax(this.$api.goodsManager.addGoodsSpec.url, {
85
+        method: this.$api.goodsManager.addGoodsSpec.method,
86
+        data: this.postData
87
+      }).then(res => {
88
+        this.$message({
89
+          type: 'success',
90
+          message: '操作成功'
91
+        })
92
+        this.$router.push({ name: 'goodsSpecManager' })
93
+      })
94
+    },
95
+    cancel () {
96
+      this.$router.push({ name: 'goodsSpecManager' })
97
+    }
98
+  },
99
+  mounted () { }
100
+}
101
+</script>
102
+
103
+<!-- Add "scoped" attribute to limit CSS to this component only -->
104
+<style lang="scss" scoped>
105
+</style>

+ 115
- 0
src/views/goodsManager/goodsSpecManager/edit.vue Vedi File

@@ -0,0 +1,115 @@
1
+<template>
2
+  <div class="subPage">
3
+    <form class="mainForm">
4
+      <ul>
5
+        <li class="flex-h">
6
+          <span>规格名:<em>*</em></span>
7
+          <div class="flex-item">
8
+            <div style="width:50%">
9
+              <el-input
10
+                placeholder="请输入规格名"
11
+                v-model="postData.SpecName"
12
+                clearable>
13
+              </el-input>
14
+            </div>
15
+          </div>
16
+        </li>
17
+        <li class="flex-h">
18
+          <span>选择案场:<em>*</em></span>
19
+          <div class="flex-item">
20
+            <div style="width:50%">
21
+              <el-select v-model="CaseId" placeholder="请选择">
22
+                <el-option
23
+                  v-for="item in cases"
24
+                  :key="item.CaseId"
25
+                  :label="item.CaseName"
26
+                  :value="item.CaseId">
27
+                </el-option>
28
+              </el-select>
29
+            </div>
30
+          </div>
31
+        </li>
32
+        <li style="text-align:center">
33
+          <el-button type="primary" size="mini" @click="submit">保存</el-button>
34
+          <el-button type="danger" size="mini" @click="cancel">取消</el-button>
35
+        </li>
36
+      </ul>
37
+    </form>
38
+  </div>
39
+</template>
40
+
41
+<script>
42
+import { mapState } from 'vuex'
43
+
44
+export default {
45
+  name: '',
46
+  data () {
47
+    return {
48
+      postData: {
49
+        SpecId: '',
50
+        SpecName: '',
51
+        Status: '',
52
+        OrgId: '',
53
+        CaseId: ''
54
+      }
55
+    }
56
+  },
57
+  computed: {
58
+    ...mapState({
59
+      cases: x => x.app.cases.list,
60
+      defaultCaseId: x => x.app.cases.default,
61
+      OrgId: x => x.app.user.OrgId,
62
+    }),
63
+    CaseId: {
64
+      get () {
65
+        return this.postData.CaseId === '' ? this.defaultCaseId || '' : this.postData.CaseId
66
+      },
67
+      set (val) {
68
+        this.postData.CaseId = val
69
+      }
70
+    }
71
+  },
72
+  components: {},
73
+  created () {
74
+    this.getInfo()
75
+  },
76
+  methods: {
77
+    getInfo () { // 获取规格信息
78
+      this.$ajax(this.$api.goodsManager.getGoodsSpecById.url, {
79
+        method: this.$api.goodsManager.getGoodsSpecById.method,
80
+        urlData: {id: this.$route.query.id}
81
+      }).then(res => {
82
+        this.postData = res
83
+      })
84
+    },
85
+    submit () { // 提交数据
86
+      if (this.postData.SpecName === '') {
87
+        this.$message({
88
+          type: 'error',
89
+          message: '规格名称不能为空'
90
+        })
91
+        return false
92
+      }
93
+      this.$ajax(this.$api.goodsManager.editGoodsSpec.url, {
94
+        method: this.$api.goodsManager.editGoodsSpec.method,
95
+        data: this.postData,
96
+        urlData: {id: this.postData.SpecId}
97
+      }).then(res => {
98
+        this.$message({
99
+          type: 'success',
100
+          message: '操作成功'
101
+        })
102
+        this.$router.push({ name: 'goodsSpecManager' })
103
+      })
104
+    },
105
+    cancel () {
106
+      this.$router.go(-1)
107
+    }
108
+  },
109
+  mounted () { }
110
+}
111
+</script>
112
+
113
+<!-- Add "scoped" attribute to limit CSS to this component only -->
114
+<style lang="scss" scoped>
115
+</style>

+ 164
- 0
src/views/goodsManager/goodsSpecManager/index.vue Vedi File

@@ -0,0 +1,164 @@
1
+<template>
2
+  <div class="subPage">
3
+    <div class="system-table-search">
4
+      <div class="flex-h">
5
+        <div class="flex-item flex-h">
6
+          <el-button size="mini" type="success" @click="addGoodsSpec">新增商品规格</el-button>
7
+        </div>
8
+        <ul>
9
+          <li>
10
+            <!-- <span>选择案场:</span> -->
11
+            <el-select v-model="CaseId" placeholder="请选择">
12
+              <el-option
13
+                key="all"
14
+                label="所有案场"
15
+                value="all">
16
+              </el-option>
17
+              <el-option
18
+                v-for="item in cases"
19
+                :key="item.CaseId"
20
+                :label="item.CaseName"
21
+                :value="item.CaseId">
22
+              </el-option>
23
+            </el-select>
24
+          </li>
25
+        </ul>
26
+        <el-button
27
+          size="mini"
28
+          type="primary" @click="search">搜索</el-button>
29
+      </div>
30
+      <div class="moreFilter"></div>
31
+    </div>
32
+    <div class="system-table-box">
33
+      <el-table
34
+        :data="currentList"
35
+        stripe
36
+        style="width: 100%">
37
+        <el-table-column
38
+          prop="SpecName"
39
+          label="规格名">
40
+        </el-table-column>
41
+        <el-table-column
42
+          label="所属案场">
43
+          <template slot-scope="scope">
44
+            <label>{{getCaseName(scope.row.CaseId)}}</label>
45
+          </template>
46
+        </el-table-column>
47
+        <el-table-column label="操作">
48
+          <template slot-scope="scope">
49
+            <el-button
50
+              size="mini"
51
+              type="warning"
52
+              @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
53
+            <el-button
54
+              size="mini"
55
+              type="danger"
56
+              @click="handleDelete(scope.$index, scope.row)">删除</el-button>
57
+          </template>
58
+        </el-table-column>
59
+      </el-table>
60
+    </div>
61
+    <el-pagination
62
+      @current-change="handleCurrentChange"
63
+      :current-page.sync="postData.page"
64
+      :page-size="postData.pagesize"
65
+      layout="prev, pager, next, jumper"
66
+      :total="total">
67
+    </el-pagination>
68
+  </div>
69
+</template>
70
+
71
+<script>
72
+import { mapState } from 'vuex'
73
+
74
+export default {
75
+  name: '',
76
+  data () {
77
+    return {
78
+      total: 0,
79
+      postData: { // 表格搜索条件
80
+        CaseId: '', // 案场id
81
+        page: 1, // 当前页码
82
+        pagesize: 10, // 请求数据量
83
+      },
84
+      currentList: []
85
+    }
86
+  },
87
+  mounted () {
88
+    this.$nextTick(function () {
89
+      this.getList()
90
+    })
91
+  },
92
+  computed: {
93
+    ...mapState({
94
+      cases: x => x.app.cases.list,
95
+      defaultCaseId: x => x.app.cases.default
96
+    }),
97
+    CaseId: {
98
+      get () {
99
+        return this.postData.CaseId || this.defaultCaseId
100
+      },
101
+      set (val) {
102
+        this.postData.CaseId = val
103
+      }
104
+    }
105
+  },
106
+  methods: {
107
+    getCaseName (caseid) {
108
+      return (this.cases.filter(x => x.CaseId === caseid)[0] || {}).CaseName
109
+    },
110
+    search () { // 搜索
111
+      this.postData.page = 1
112
+      this.currentList = []
113
+      this.getList()
114
+    },
115
+    getList () { // 获取列表
116
+      this.$ajax(this.$api.goodsManager.getGoodsSpecList.url, {
117
+        method: this.$api.goodsManager.getGoodsSpecList.method,
118
+        queryData: { ...this.postData, caseid: this.CaseId === 'all' ? '' : this.CaseId }
119
+      }).then(res => {
120
+        this.currentList = res.list
121
+        this.postData.page = res.page
122
+        this.total = res.pagenum
123
+      })
124
+    },
125
+    handleCurrentChange (val) { // 跳转到分页
126
+      this.getList()
127
+    },
128
+    handleEdit (index, row) { // 编辑
129
+      this.$router.push({ name: 'editGoodsSpec', query: { id: row.SpecId } })
130
+    },
131
+    handleDelete (index, row) { // 删除
132
+      let name = '确认删除规格“' + row.SpecName + '”?'
133
+      this.$confirm(name, '提示', {
134
+        confirmButtonText: '确定',
135
+        cancelButtonText: '取消',
136
+        type: 'warning'
137
+      }).then(() => {
138
+        this.$ajax(this.$api.goodsManager.deleteGoodsSpec.url, {
139
+          method: this.$api.goodsManager.deleteGoodsSpec.method,
140
+          urlData: { id: row.SpecId }
141
+        }).then(res => {
142
+          this.$message({
143
+            type: 'success',
144
+            message: '删除成功!'
145
+          })
146
+          this.search()
147
+        })
148
+      }).catch(() => {
149
+        this.$message({
150
+          type: 'info',
151
+          message: '已取消删除'
152
+        })
153
+      })
154
+    },
155
+    addGoodsSpec () {
156
+      this.$router.push({ name: 'addGoodsSpec' })
157
+    }
158
+  }
159
+}
160
+</script>
161
+
162
+<!-- Add "scoped" attribute to limit CSS to this component only -->
163
+<style lang="scss" scoped>
164
+</style>

+ 155
- 0
src/views/goodsManager/goodsTypeManager/index.vue Vedi File

@@ -0,0 +1,155 @@
1
+<template>
2
+  <div>
3
+    <div>
4
+      <el-button type="success" @click="addGoodsType">新增商品类型</el-button>
5
+    </div>
6
+    <el-card class="marginTB" shadow="hover">
7
+      <el-table
8
+        :data="currentList"
9
+        stripe
10
+        style="width: 100%">
11
+        <el-table-column
12
+          prop="typeName"
13
+          label="商品种类">
14
+        </el-table-column>
15
+        <el-table-column
16
+          prop="englishName"
17
+          label="英文名称">
18
+        </el-table-column>
19
+        <el-table-column label="操作">
20
+          <template slot-scope="scope">
21
+            <el-button
22
+              size="mini"
23
+              type="warning"
24
+              @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
25
+            <el-button
26
+              size="mini"
27
+              type="danger"
28
+              @click="handleDelete(scope.$index, scope.row)">删除</el-button>
29
+          </template>
30
+        </el-table-column>
31
+      </el-table>
32
+    </el-card>
33
+    <el-pagination
34
+      @current-change="handleCurrentChange"
35
+      :current-page.sync="postData.page"
36
+      :page-size="postData.pagesize"
37
+      layout="prev, pager, next, jumper"
38
+      :total="total">
39
+    </el-pagination>
40
+    <el-dialog title="维护类型" :visible.sync="dialogFormVisible" width="30%">
41
+      <el-form :model="typeDetail">
42
+        <el-form-item label="商品种类" label-width="80px">
43
+          <el-input v-model="typeDetail.typeName" autocomplete="off"></el-input>
44
+        </el-form-item>
45
+        <el-form-item label="英文名称" label-width="80px">
46
+          <el-input v-model="typeDetail.englishName" autocomplete="off"></el-input>
47
+        </el-form-item>
48
+      </el-form>
49
+      <div slot="footer" class="dialog-footer">
50
+        <el-button @click="dialogFormVisible = false">取 消</el-button>
51
+        <el-button type="primary" @click="submitTypeDetail">确 定</el-button>
52
+      </div>
53
+    </el-dialog>
54
+  </div>
55
+</template>
56
+
57
+<script>
58
+import { mapState } from 'vuex'
59
+
60
+export default {
61
+  name: '',
62
+  data () {
63
+    return {
64
+      total: 0,
65
+      dialogFormVisible: false,
66
+      postData: { // 表格搜索条件
67
+        caseid: '', // 案场id
68
+        page: 1, // 当前页码
69
+        pagesize: 10, // 请求数据量
70
+      },
71
+      currentList: [],
72
+      typeDetail: {},
73
+      typeDetailTPL: {
74
+        typeId: '', // 种类id(新增可传空值)
75
+        typeName: '', // 种类名称
76
+        caseId: '', // 案场id
77
+        orgId: '', // 机构id
78
+        creatUser: '', // 创建者(传空值)
79
+        creatTime: '', // 创建时间(传空值)
80
+        status: '', // 状态(传空值)
81
+        englishName: '',
82
+      },
83
+    }
84
+  },
85
+  mounted () {
86
+    this.$nextTick(function () {
87
+      this.getList()
88
+    })
89
+  },
90
+  computed: {
91
+    ...mapState({
92
+    }),
93
+  },
94
+  methods: {
95
+    getList () { // 获取列表
96
+      // this.$ajax(this.$api.goodsManager.getGoodsTypeList.url, {
97
+      //   method: this.$api.goodsManager.getGoodsTypeList.method,
98
+      //   queryData: { ...this.postData, caseid: this.CaseId === 'all' ? '' : this.CaseId }
99
+      // }).then(res => {
100
+      //   // for (var n = 0; n < res.list.length; n++) {
101
+      //   //   res.list[n].CaseName = this.cases.filter(x => x.CaseId === res.list[n].CaseId)[0].CaseName
102
+      //   // }
103
+      //   this.currentList = res.list
104
+      //   this.postData.page = res.page
105
+      //   this.total = res.pagenum
106
+      // })
107
+    },
108
+    handleCurrentChange () { // 跳转到分页
109
+      this.getList()
110
+    },
111
+    handleEdit (index, row) { // 编辑
112
+      this.typeDetail = row
113
+      this.dialogFormVisible = true
114
+    },
115
+    handleDelete (index, row) { // 删除
116
+      let name = '确认删除类型“' + row.typeName + '”?'
117
+      this.$confirm(name, '提示', {
118
+        confirmButtonText: '确定',
119
+        cancelButtonText: '取消',
120
+        type: 'warning'
121
+      }).then(() => {
122
+        // this.$ajax(this.$api.goodsManager.deleteGoodsType.url, {
123
+        //   method: this.$api.goodsManager.deleteGoodsType.method,
124
+        //   urlData: { id: row.TypeId }
125
+        // }).then(res => {
126
+        //   this.$message({
127
+        //     type: 'success',
128
+        //     message: '删除成功!'
129
+        //   })
130
+        //   this.search()
131
+        // })
132
+      }).catch(() => {
133
+        this.$message({
134
+          type: 'info',
135
+          message: '已取消删除'
136
+        })
137
+      })
138
+    },
139
+    addGoodsType () {
140
+      this.typeDetail = { ...this.typeDetailTPL }
141
+      this.dialogFormVisible = true
142
+    },
143
+    submitTypeDetail () {
144
+      this.dialogFormVisible = false
145
+    }
146
+  }
147
+}
148
+</script>
149
+
150
+<!-- Add "scoped" attribute to limit CSS to this component only -->
151
+<style lang="scss" scoped>
152
+.marginTB {
153
+  margin: 20px auto;
154
+}
155
+</style>

+ 9
- 0
src/views/index.js Vedi File

@@ -211,6 +211,15 @@ const pages = [
211 211
           title: '车辆管理',
212 212
         },
213 213
       },
214
+      {
215
+        path: 'goodstype',
216
+        name: 'goodstype',
217
+        component: () => import('./goodsManager/goodsTypeManager'),
218
+        meta: {
219
+          menuShow: true,
220
+          title: '商品类型管理',
221
+        },
222
+      }
214 223
     ]
215 224
   },
216 225
 

+ 1
- 1
src/views/sysuser/role/add/add.vue Vedi File

@@ -51,7 +51,7 @@ export default {
51 51
     getCheckedNodes() {
52 52
       let idSet = new Set();
53 53
       const checkedNodes = this.$refs.tree.getCheckedNodes();
54
-      checkedNodes.map((item,index) => {
54
+      checkedNodes.map((item) => {
55 55
           idSet.add(item.menuId)
56 56
           idSet.add(item.menuPid)
57 57
       })

+ 2
- 2
src/views/sysuser/role/edi/edi.vue Vedi File

@@ -56,7 +56,7 @@ export default {
56 56
     getCheckedNodes() {
57 57
       let idSet = new Set();
58 58
       const checkedNodes = this.$refs.tree.getCheckedNodes();
59
-      checkedNodes.map((item,index) => {
59
+      checkedNodes.map((item) => {
60 60
           idSet.add(item.menuId)
61 61
       })
62 62
 
@@ -77,7 +77,7 @@ export default {
77 77
         })
78 78
     },
79 79
     menusParsing(array) {
80
-        array.map((item,index) => {
80
+        array.map((item) => {
81 81
             this.checkedMenuKeys.push(item.menuId)
82 82
             if (item.children !== null) {
83 83
                 this.menusParsing(item.children)

+ 1
- 1
src/views/sysuser/role/list.vue Vedi File

@@ -136,7 +136,7 @@ export default {
136 136
     },
137 137
     handleSelectionChange(val) {
138 138
       this.ids = []
139
-      val.map((item,index)=> {
139
+      val.map((item)=> {
140 140
         this.ids.push(item.roleId);
141 141
       })
142 142
     }