wangfei 6 years ago
parent
commit
609ebb967c

+ 1
- 1
config/index.js View File

@@ -12,7 +12,7 @@ module.exports = {
12 12
     proxyTable: {
13 13
       '/api': {
14 14
         // target: 'https://dp.huiju360.com.cn/hj_operations',
15
-        target: 'http://192.168.0.62:8080', //wf
15
+        target: 'http://localhost:8080', //wf
16 16
         // target: 'http://192.168.0.11:8088', //zys
17 17
         changeOrigin: true, // 如果接口跨域,需要进行这个参数配置
18 18
         // pathRewrite: {

+ 202
- 0
src/pages/system/goodsManager/goodManager/edit.vue View File

@@ -0,0 +1,202 @@
1
+<template>
2
+  <div class="subPage">
3
+    <form class="mainForm">
4
+      <ul>
5
+         <li class="flex-h">
6
+          <span>选择案场:</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>商品名称:</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>商品图片:</span>
34
+          <div class="flex-item">
35
+            <div style="width:50%">
36
+              <el-upload
37
+                :action="$api.file.image.url"
38
+                :limit='limit'
39
+                list-type="picture-card"
40
+                :file-list='imgsArr'
41
+                :on-success="handlePictureCardPreview"
42
+                :on-remove="handleRemove"
43
+                :on-exceed="exceed">
44
+                <i class="el-icon-plus"></i>
45
+              </el-upload>
46
+              <el-dialog :visible.sync="dialogVisible">
47
+                <img width="100%" :src="imgs" alt="">
48
+              </el-dialog>
49
+            </div>
50
+          </div>
51
+        </li>
52
+        <li class="flex-h">
53
+          <span>商品价格:</span>
54
+          <div class="flex-item">
55
+            <div style="width:50%">
56
+              <el-input
57
+                placeholder="请输入商品价格"
58
+                v-model="detail.Price"
59
+                clearable>
60
+              </el-input>
61
+            </div>
62
+          </div>
63
+        </li>
64
+        <li class="flex-h">
65
+          <span>商品规格:</span>
66
+          <div class="flex-item">
67
+            <div style="width:50%">
68
+              <el-select v-model="detail.specs" multiple placeholder="请选择" style="width:100%;">
69
+                <el-option
70
+                  v-for="item in specs.list"
71
+                  :key="item.SpecId"
72
+                  :label="item.SpecName"
73
+                  :value="item.SpecId">
74
+                </el-option>
75
+              </el-select>
76
+            </div>
77
+          </div>
78
+        </li>
79
+        <li class="flex-h">
80
+          <span>商品类别:</span>
81
+          <div class="flex-item">
82
+            <div style="width:50%">
83
+              <el-select v-model="detail.TypeId" placeholder="请选择商品类型">
84
+                <el-option
85
+                  v-for="item in types.list"
86
+                  :key="item.TypeId"
87
+                  :label="item.TypeName"
88
+                  :value="item.TypeId">
89
+                </el-option>
90
+              </el-select>
91
+            </div>
92
+          </div>
93
+        </li>
94
+        <li style="text-align:center">
95
+          <el-button type="primary" size="mini" @click='submit'>保存</el-button>
96
+          <el-button type="danger" size="mini" @click="cancel">取消</el-button>
97
+        </li>
98
+      </ul>
99
+    </form>
100
+  </div>
101
+</template>
102
+
103
+<script>
104
+import { createNamespacedHelpers, mapState } from 'vuex'
105
+
106
+const { mapState: mapGoodsState, mapActions: mapGoodsActions } = createNamespacedHelpers('goods')
107
+export default {
108
+  name: '',
109
+  data () {
110
+    return {
111
+      imgs: '',
112
+      imgsArr: [],
113
+      limit: 1,
114
+      dialogVisible: false,
115
+    }
116
+  },
117
+  components: {},
118
+  computed: {
119
+    ...mapGoodsState({
120
+      detail: x => x.goodsInfo,
121
+      types: x => x.goodsTypes,
122
+      specs: x => x.goodsSpecs,
123
+    }),
124
+    ...mapState({
125
+      cases: x => x.app.cases.list,
126
+      caseid: x => x.app.cases.default,
127
+      orgid: x => x.app.user.OrgId,
128
+    }),
129
+    Case: {
130
+      get () {
131
+        return this.detail.CaseId || this.caseid
132
+      },
133
+      set (val) {
134
+        this.UpdateInfo({...this.detail, CaseId: val})
135
+        this.GetGoodTypes({ pagesize: 1000, caseid: this.Case })
136
+        this.GetGoodSpecs({ pagesize: 1000, caseid: this.Case })
137
+      }
138
+    }
139
+  },
140
+  methods: {
141
+    ...mapGoodsActions([
142
+      'GetGoodTypes',
143
+      'GetGoodsByID',
144
+      'AddGoods',
145
+      'UpdateGoods',
146
+      'SetRoleNull',
147
+      'UpdateInfo',
148
+      'GetGoodSpecs',
149
+    ]),
150
+    submit () {
151
+      this.detail.specs = JSON.stringify(this.detail.specs.map(x => ({SpecId: x, GoodsPrice: this.detail.Price})))
152
+      if ((this.detail.EquipmentId || '') === '') {
153
+        this.detail.OrgId = this.orgid
154
+        if (!this.detail.CaseId || this.detail.CaseId === '') {
155
+          this.detail.CaseId = this.caseid
156
+        }
157
+        this.detail.images = this.imgs
158
+        this.AddGoods(this.detail)
159
+      } else {
160
+        this.UpdateGoods(this.detail)
161
+      }
162
+      this.$message({
163
+        type: 'success',
164
+        message: '操作成功'
165
+      })
166
+      this.$router.push({ name: 'goodsInfo' })
167
+    },
168
+    cancel () {
169
+      this.$router.go(-1)
170
+    },
171
+    handlePictureCardPreview (res, file, fileList) {
172
+      this.imgs = res.result.url
173
+      this.dialogVisible = false
174
+      this.imgsArr = fileList
175
+    },
176
+    handleRemove (file, fileList) {
177
+      this.imgsArr = fileList
178
+    },
179
+    exceed () {
180
+      this.$message({
181
+        message: '超过可传的图片上限',
182
+        type: 'info',
183
+        duration: 1000
184
+      })
185
+    }
186
+  },
187
+  created () {
188
+    this.GetGoodTypes({ pagesize: 1000, caseid: this.Case })
189
+    this.GetGoodSpecs({ pagesize: 1000, caseid: this.Case })
190
+    const { id } = this.$route.query
191
+    if (id && id !== '') {
192
+      this.GetGoodsByID({ id: id })
193
+    } else {
194
+      this.SetRoleNull()
195
+    }
196
+  }
197
+}
198
+</script>
199
+
200
+<!-- Add "scoped" attribute to limit CSS to this component only -->
201
+<style lang="scss" scoped>
202
+</style>

+ 179
- 0
src/pages/system/goodsManager/goodManager/index.vue View File

@@ -0,0 +1,179 @@
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
+                v-for="item in cases"
14
+                :key="item.CaseId"
15
+                :label="item.CaseName"
16
+                :value="item.CaseId">
17
+              </el-option>
18
+            </el-select>
19
+          </li>
20
+          <li>
21
+            <el-input
22
+              placeholder="请输入商品名称"
23
+              v-model="postData.name"
24
+            >
25
+            </el-input>
26
+          </li>
27
+          <li>
28
+            <span>商品类型:</span>
29
+            <el-select v-model="postData.type" placeholder="请选择">
30
+              <el-option
31
+                v-for="item in types.list"
32
+                :key="item.TypeId"
33
+                :label="item.TypeName"
34
+                :value="item.TypeId">
35
+              </el-option>
36
+            </el-select>
37
+          </li>
38
+        </ul>
39
+        <el-button
40
+          size="mini"
41
+          type="primary" @click="search">搜索</el-button>
42
+      </div>
43
+      <div class="moreFilter"></div>
44
+    </div>
45
+    <div class="system-table-box">
46
+      <el-table :data="goods.list" stripe style="width: 100%">
47
+        <el-table-column prop="RoleName" label="角色名">
48
+        </el-table-column>
49
+        <el-table-column label="创建时间" width="300">
50
+          <template slot-scope="scope">
51
+            <label>{{FormatDate(scope.row.CreateDate)}}</label>
52
+          </template>
53
+        </el-table-column>
54
+        <el-table-column fixed='right' label="操作" width="300">
55
+          <template slot-scope="scope">
56
+            <el-button size="mini" type="warning" @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
57
+            <el-button size="mini" type="danger" @click="handleDelete(scope.$index, scope.row)">删除</el-button>
58
+          </template>
59
+        </el-table-column>
60
+      </el-table>
61
+    </div>
62
+    <el-pagination
63
+    @size-change="handleSizeChange"
64
+    @current-change="handleCurrentChange"
65
+    :current-page.sync="currentPage"
66
+    :page-size="postData.pagesize"
67
+    layout="prev, pager, next, jumper"
68
+    :total="goods.pagenum">
69
+    </el-pagination>
70
+  </div>
71
+</template>
72
+
73
+<script>
74
+import { createNamespacedHelpers, mapState } from 'vuex'
75
+import tableSearch from '@/components/tableSearch/index'
76
+
77
+const { mapState: mapGoodsState, mapActions: mapGoodsActions } = createNamespacedHelpers('goods')
78
+
79
+export default {
80
+  name: '',
81
+  data () {
82
+    return {
83
+      currentPage: 0, // 当前页码
84
+      key: '',
85
+      postData: {
86
+        caseid: '',
87
+        name: '',
88
+        type: '',
89
+        page: 1,
90
+        pagesize: 10,
91
+      },
92
+    }
93
+  },
94
+  computed: {
95
+    ...mapState({
96
+      cases: x => x.app.cases.list,
97
+      defaultCaseId: x => x.app.cases.default
98
+    }),
99
+    ...mapGoodsState({
100
+      goods: x => x.goodsList,
101
+      types: x => x.goodsTypes,
102
+    }),
103
+    CaseId: {
104
+      get () {
105
+        return this.postData.caseid || this.defaultCaseId
106
+      },
107
+      set (val) {
108
+        this.postData.caseid = val
109
+        this.GetGoodTypes({ pagesize: 1000, caseid: this.CaseId })
110
+      }
111
+    }
112
+  },
113
+  components: {
114
+    tableSearch
115
+  },
116
+  methods: {
117
+    ...mapGoodsActions([
118
+      'GetGoodsList',
119
+      'GetGoodTypes',
120
+    ]),
121
+    search () { // 搜索
122
+      this.postData.page = 1
123
+      this.currentList = []
124
+      this.getList()
125
+    },
126
+    getList () {
127
+      this.GetGoodsList({...this.postData, caseid: this.CaseId})
128
+    },
129
+    handleSizeChange (val) {
130
+      console.log(`每页 ${val} 条`)
131
+    },
132
+    handleCurrentChange (val) {
133
+      this.GetRolesList({ page: val })
134
+      console.log(`当前页: ${val}`)
135
+    },
136
+    handleEdit (index, row) {
137
+      // 编辑
138
+      this.$router.push({ name: 'editGoods', query: { id: row.GooddId } })
139
+    },
140
+    handleDelete (index, row) {
141
+      // 删除
142
+      console.log(index, row)
143
+      this.$confirm('确认删除此角色?', '提示', {
144
+        confirmButtonText: '确定',
145
+        cancelButtonText: '取消',
146
+        type: 'warning'
147
+      })
148
+        .then(() => {
149
+          this.DelRole({id: row.RoleId, callback: this.delCallBack})
150
+        })
151
+        .catch(() => {
152
+          this.$message({
153
+            type: 'info',
154
+            message: '已取消删除'
155
+          })
156
+        })
157
+    },
158
+    delCallBack () {
159
+      this.$message({
160
+        type: 'success',
161
+        message: '删除成功!'
162
+      })
163
+      this.getList()
164
+    },
165
+    addRole () {
166
+      this.$router.push({ name: 'editGoods' })
167
+    },
168
+  },
169
+  mounted () {
170
+    this.GetGoodTypes({ pagesize: 1000, caseid: this.CaseId })
171
+    this.$nextTick(function () {
172
+      this.getList()
173
+    })
174
+  },
175
+}
176
+</script>
177
+
178
+<style lang="scss" scoped>
179
+</style>

+ 12
- 0
src/pages/system/page.js View File

@@ -35,6 +35,8 @@ import editGoodsType from './goodsManager/goodsTypeManager/edit' // 编辑商品
35 35
 import goodsSpecManager from './goodsManager/goodsSpecManager/index' // 商品规格管理
36 36
 import addGoodsSpec from './goodsManager/goodsSpecManager/add' // 新增商品规格
37 37
 import editGoodsSpec from './goodsManager/goodsSpecManager/edit' // 编辑商品规格管理
38
+import goodsList from './goodsManager/goodManager/index' // 商品管理
39
+import editGoods from './goodsManager/goodManager/edit' // 商品编辑
38 40
 
39 41
 import cmsManager from './cmsManager/index' // cms管理
40 42
 import bannerManager from './cmsManager/bannerManager/index' // 轮播图管理
@@ -231,6 +233,16 @@ export default {
231 233
             component: editGoodsSpec,
232 234
             children: []
233 235
           }]
236
+        }, { // 商品管理
237
+          path: 'goodsInfo',
238
+          name: 'goodsInfo',
239
+          component: goodsList,
240
+          children: [{ // 编辑商品
241
+            path: 'editGoods',
242
+            name: 'editGoods',
243
+            component: editGoods,
244
+            children: []
245
+          }]
234 246
         }],
235 247
       }, { // cms管理
236 248
         path: 'cmsManager',

+ 103
- 0
src/store/goods/goods.js View File

@@ -0,0 +1,103 @@
1
+import ajax from '../../util/ajax'
2
+import api from '../../util/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
+      ajax(api.goodsManager.getGoodsList.url, {
29
+        method: api.goodsManager.getGoodsList.method,
30
+        queryData: {
31
+          ...payload,
32
+        }
33
+      }).then(res => {
34
+        commit('updateList', res)
35
+      })
36
+    },
37
+    GetGoodTypes ({ commit }, payload) {
38
+      ajax(api.goodsManager.getGoodsTypeList.url, {
39
+        method: api.goodsManager.getGoodsTypeList.method,
40
+        queryData: {
41
+          ...payload,
42
+        }
43
+      }).then(res => {
44
+        commit('updateTypes', res)
45
+      })
46
+    },
47
+    GetGoodSpecs ({ commit }, payload) {
48
+      ajax(api.goodsManager.getGoodsSpecList.url, {
49
+        method: api.goodsManager.getGoodsSpecList.method,
50
+        queryData: {
51
+          ...payload,
52
+        }
53
+      }).then(res => {
54
+        commit('updateSpecs', res)
55
+      })
56
+    },
57
+    GetGoodsByID ({ commit }, { id }) {
58
+      ajax(api.goodsManager.getGoodsByID.url, {
59
+        method: api.goodsManager.getGoodsByID.method,
60
+        urlData: {
61
+          id: id,
62
+        }
63
+      }).then(res => {
64
+        commit('updateInfo', res)
65
+      })
66
+    },
67
+    AddGoods ({ commit }, payload) {
68
+      ajax(api.goodsManager.addGoods.url, {
69
+        method: api.goodsManager.addGoods.method,
70
+        data: {
71
+          ...payload
72
+        }
73
+      }).then(res => {
74
+        commit('updateInfo', res)
75
+      })
76
+    },
77
+    UpdateGoods ({ commit }, payload) {
78
+      ajax(api.goodsManager.updateGoods.url, {
79
+        method: api.goodsManager.updateGoods.method,
80
+        data: {
81
+          ...payload
82
+        }
83
+      }).then(res => {
84
+      })
85
+    },
86
+    DelGoods ({ commit }, { id, callback }) {
87
+      ajax(api.goodsManager.deleteGoods.url, {
88
+        method: api.goodsManager.deleteGoods.method,
89
+        urlData: {
90
+          id: id,
91
+        }
92
+      }).then(res => {
93
+        callback()
94
+      })
95
+    },
96
+    SetRoleNull ({ commit }) {
97
+      commit('updateInfo', {})
98
+    },
99
+    UpdateInfo ({ commit }, payload) {
100
+      commit('updateInfo', payload)
101
+    }
102
+  }
103
+}

+ 1
- 0
src/store/index.js View File

@@ -17,6 +17,7 @@ export const modules = {
17 17
   cms: () => require('./cms').default,
18 18
   role: () => require('./system/role').default,
19 19
   device: () => require('./case/device').default,
20
+  goods: () => require('./goods/goods').default,
20 21
 }
21 22
 
22 23
 Object.keys(modules).forEach((modKey) => {

+ 5
- 5
src/util/ajax.js View File

@@ -15,10 +15,11 @@ const Axios = axios.create({
15 15
 })
16 16
 
17 17
 Axios.interceptors.request.use((config) => {
18
+  config.urlData = {...config.urlData, org: 1}
18 19
   // 处理请求data,若为get请求,拼到url后面,若为post请求,直接添加到body中
19 20
   let urlData = qs.stringify(config.urlData)
20 21
   let queryData = qs.stringify(config.queryData)
21
-  // 判断是通过斜杠传参还是通过query传参
22
+  // 判断是通过斜杠传参
22 23
   if (config.url.indexOf(':') > -1) {
23 24
     if (typeof config.urlData === 'object') {
24 25
       config.url = Object.keys(config.urlData).reduce((url, k) => { // 此方法对每个元素进行处理
@@ -28,10 +29,9 @@ Axios.interceptors.request.use((config) => {
28 29
     } else {
29 30
       config.url = config.url.slice(0, config.url.indexOf(':')) + urlData
30 31
     }
31
-  } else {
32
-    if (queryData) {
33
-      config.url += '?' + queryData
34
-    }
32
+  }
33
+  if (queryData) {
34
+    config.url += '?' + queryData
35 35
   }
36 36
   let fm = new FormData()
37 37
   for (let k in config.data) {

+ 31
- 11
src/util/api.js View File

@@ -1,6 +1,6 @@
1 1
 const baseUrl = '/api'
2
-const common = '/common'
3
-const guest = '/guest'
2
+const common = '/common/:org'
3
+const guest = '/guest/:org'
4 4
 
5 5
 const $api = {
6 6
   login: { // 登陆
@@ -26,35 +26,35 @@ const $api = {
26 26
   systemSet: {
27 27
     getUserList: { // 获取用户列表
28 28
       method: 'get',
29
-      url: `${baseUrl}/common/user`
29
+      url: `${baseUrl}${common}/user`
30 30
     },
31 31
     getUserInfo: { // 获取用户信息
32 32
       method: 'get',
33
-      url: `${baseUrl}/common/user/:id`
33
+      url: `${baseUrl}${common}/user/:id`
34 34
     },
35 35
     addUser: { // 新增用户
36 36
       method: 'post',
37
-      url: `${baseUrl}/common/user`
37
+      url: `${baseUrl}${common}/user`
38 38
     },
39 39
     editUser: { // 更新用户
40 40
       method: 'put',
41
-      url: `${baseUrl}/common/user`
41
+      url: `${baseUrl}${common}/user`
42 42
     },
43 43
     deleteUser: { // 删除用户
44 44
       method: 'delete',
45
-      url: `${baseUrl}/common/user/:id`
45
+      url: `${baseUrl}${common}/user/:id`
46 46
     },
47 47
     resetPassword: { // 重置用户密码
48 48
       method: 'put',
49
-      url: `${baseUrl}/common/user/password/reset`
49
+      url: `${baseUrl}${common}/user/password/reset`
50 50
     },
51 51
     bindRoles: { // 绑定角色
52 52
       method: 'put',
53
-      url: `${baseUrl}/common/userrole`
53
+      url: `${baseUrl}${common}/userrole`
54 54
     },
55 55
     getUserRoles: { // 获取用户绑定角色
56 56
       method: 'get',
57
-      url: `${baseUrl}/common/userrole`
57
+      url: `${baseUrl}${common}/userrole`
58 58
     },
59 59
   },
60 60
   channelManager: {
@@ -194,7 +194,7 @@ const $api = {
194 194
     },
195 195
     getUserTypeList: { // 获取用户类型列表
196 196
       method: 'get',
197
-      url: `${baseUrl}/common/usertype`
197
+      url: `${baseUrl}${common}/usertype`
198 198
     },
199 199
   },
200 200
   goodsManager: {
@@ -238,6 +238,26 @@ const $api = {
238 238
       method: 'delete',
239 239
       url: `${baseUrl}${common}/type/goods/:id`
240 240
     },
241
+    getGoodsList: {
242
+      method: 'get',
243
+      url: `${baseUrl}${common}/goods`
244
+    },
245
+    getGoodsByID: {
246
+      method: 'get',
247
+      url: `${baseUrl}${common}/goods/:id`
248
+    },
249
+    addGoods: {
250
+      method: 'post',
251
+      url: `${baseUrl}${common}/goods`
252
+    },
253
+    updateGoods: {
254
+      method: 'put',
255
+      url: `${baseUrl}${common}/goods/:id`
256
+    },
257
+    deleteGoods: {
258
+      method: 'delete',
259
+      url: `${baseUrl}${common}/goods/:id`
260
+    },
241 261
   },
242 262
   cms: {
243 263
     location: { // 图片位置(5A)