许静 пре 6 година
родитељ
комит
e5d3345342

+ 36
- 0
src/config/api.js Прегледај датотеку

@@ -126,6 +126,42 @@ const apis = {
126 126
       method: 'post',
127 127
       url: `${commPrefix}/customer/add`
128 128
     }
129
+  },
130
+  goods:{
131
+    list:{
132
+      method:'get',
133
+      url: `${commPrefix}/taGoods`
134
+    },
135
+    detail: {
136
+      method: 'get',
137
+      url: `${commPrefix}/taGoods/:id`
138
+    },
139
+    add: {
140
+      method: 'post',
141
+      url: `${commPrefix}/customer/add`
142
+    }
143
+  },
144
+  newsType: {
145
+    list: {
146
+      method: 'get',
147
+      url: `${commPrefix}/taNewsType`
148
+    },
149
+    add: {
150
+      method: 'post',
151
+      url: `${commPrefix}/taNewsType`
152
+    },
153
+    delete: {
154
+      method: 'delete',
155
+      url: `${commPrefix}/taNewsType/:id`
156
+    },
157
+    update: {
158
+      method: 'put',
159
+      url: `${commPrefix}/taNewsType/:id`
160
+    },
161
+    getById: {
162
+      method: 'get',
163
+      url: `${commPrefix}/taNewsType/:id`
164
+    }
129 165
   }
130 166
 }
131 167
 

+ 3
- 0
src/store/index.js Прегледај датотеку

@@ -2,6 +2,7 @@ import Vue from 'vue'
2 2
 import Vuex from 'vuex'
3 3
 import system from './system'
4 4
 import apartment from './modules/apartment'
5
+import news from './modules/news'
5 6
 Vue.use(Vuex)
6 7
 
7 8
 const store = new Vuex.Store({
@@ -13,6 +14,8 @@ const store = new Vuex.Store({
13 14
     customer: require('./modules/customer').default,
14 15
     building: require('./modules/building').default,
15 16
     img: require('./modules/img').default,
17
+    goods: require('./modules/goods').default,
18
+    news
16 19
   }
17 20
 })
18 21
 

+ 132
- 0
src/store/modules/goods.js Прегледај датотеку

@@ -0,0 +1,132 @@
1
+import request from '../../utils/request'
2
+import apis from '../../config/api'
3
+
4
+export default {
5
+  namespaced: true,
6
+  state: {
7
+    dynamics: {},
8
+    detail: {}
9
+  },
10
+  mutations: {
11
+    updateList (state, payload) {
12
+      state.dynamics = payload
13
+    },
14
+    updateDetail (state, payload) {
15
+      state.detail = payload
16
+    }
17
+  },
18
+  actions: {
19
+    setDetailNull ({ commit }) {
20
+      commit('updateDetail', {})
21
+    },
22
+    getGoods ({ commit }, payload) {
23
+      return new Promise((resolve, reject) => {
24
+        request({
25
+          ...apis.goods.list,
26
+          params: payload,
27
+        }).then((data) => {
28
+          commit('updateList', data)
29
+          resolve(data)
30
+        }).catch((err) => {
31
+          const message = err.message || err.msg
32
+
33
+          if (typeof message === 'string') {
34
+            reject(message)
35
+          }
36
+        })
37
+      })
38
+    },
39
+    getGoodsDetail ({ commit }, payload) {
40
+      return new Promise((resolve, reject) => {
41
+        request({
42
+          ...apis.goods.detail,
43
+          urlData: payload,
44
+        }).then((data) => {
45
+          commit('updateDetail', data)
46
+          resolve(data)
47
+        }).catch((err) => {
48
+          const message = err.message || err.msg
49
+
50
+          if (typeof message === 'string') {
51
+            reject(message)
52
+          }
53
+        })
54
+      })
55
+    },
56
+    addDynamics (_, payload) {
57
+      return new Promise((resolve, reject) => {
58
+        request({
59
+          ...apis.dynamic.add, 
60
+          data: payload.detail,
61
+        }).then((data) => {
62
+          resolve(data)
63
+        }).catch((err) => {
64
+          const message = err.message || err.msg
65
+          if (typeof message === 'string') {
66
+            reject(message)
67
+          }
68
+        })
69
+      })
70
+    },
71
+    editDynamics (_, payload) {
72
+      return new Promise((resolve, reject) => {
73
+        request({
74
+          ...apis.dynamic.edit,
75
+          data: payload.detail,
76
+        }).then((data) => {
77
+          resolve(data)
78
+        }).catch((err) => {
79
+          const message = err.message || err.msg
80
+
81
+          if (typeof message === 'string') {
82
+            reject(message)
83
+          }
84
+        })
85
+      })
86
+    },
87
+    deleteDynamics (_, payload) {
88
+      return new Promise((resolve, reject) => {
89
+        request({
90
+          ...apis.dynamic.delete,
91
+          ...payload
92
+        }).then(() => {
93
+          resolve()
94
+        }).catch(() => {
95
+          reject()
96
+        })
97
+      })
98
+    },
99
+    publicDynamic (_, payload) {
100
+      return new Promise((resolve, reject) => {
101
+        request({
102
+          ...apis.dynamic.public,
103
+          urlData: payload,
104
+        }).then((data) => {
105
+          resolve(data)
106
+        }).catch((err) => {
107
+          const message = err.message || err.msg
108
+
109
+          if (typeof message === 'string') {
110
+            reject(message)
111
+          }
112
+        })
113
+      })
114
+    },
115
+    cancelDynamic (_, payload) {
116
+      return new Promise((resolve, reject) => {
117
+        request({
118
+          ...apis.dynamic.cancel,
119
+          urlData: payload,
120
+        }).then((data) => {
121
+          resolve(data)
122
+        }).catch((err) => {
123
+          const message = err.message || err.msg
124
+
125
+          if (typeof message === 'string') {
126
+            reject(message)
127
+          }
128
+        })
129
+      })
130
+    }
131
+  }
132
+}

+ 76
- 0
src/store/modules/news.js Прегледај датотеку

@@ -0,0 +1,76 @@
1
+import apis from '../../config/api'
2
+import request from '../../utils/request'
3
+
4
+export default {
5
+    namespaced: true,
6
+    state: {
7
+        list: [],
8
+        detail: []
9
+    },
10
+    mutations: {
11
+
12
+    },
13
+    actions: {
14
+        getTypeList({ commit }, payload) { // 查询所有资迅类型
15
+           return  new Promise((resolve, reject) => {
16
+               request({
17
+                   ...apis.newsType.list,
18
+                   params: payload,
19
+               }).then((data) => {
20
+                   resolve(data)
21
+               }).catch((err) => {
22
+                   reject(err)
23
+               })
24
+           })
25
+        },
26
+        getTypeById({ commit }, payload) { // 根据Id查询资迅类型
27
+            return  new Promise((resolve, reject) => {
28
+                request({
29
+                    ...apis.newsType.getById,
30
+                    urlData: { id: payload.newsTypeId },
31
+                }).then((data) => {
32
+                    resolve(data)
33
+                }).catch((err) => {
34
+                    reject(err)
35
+                })
36
+            })
37
+        },
38
+        addType({ commit }, payload) { // 添加类型
39
+            return  new Promise((resolve, reject) => {
40
+                request({
41
+                    ...apis.newsType.add,
42
+                    data: payload,
43
+                }).then((data) => {
44
+                    resolve(data)
45
+                }).catch((err) => {
46
+                    reject(err)
47
+                })
48
+            })
49
+        },
50
+        updateType({ commit }, payload) { // 修改类型
51
+            return  new Promise((resolve, reject) => {
52
+                request({
53
+                    ...apis.newsType.update,
54
+                    urlData:{ id: payload.newsTypeId },
55
+                    data:payload
56
+                }).then((data) => {
57
+                    resolve(data)
58
+                }).catch((err) => {
59
+                    reject(err)
60
+                })
61
+            })
62
+        },
63
+        deleteType({ commit }, payload) { // 删除类型
64
+            return  new Promise((resolve, reject) => {
65
+                request({
66
+                    ...apis.newsType.delete,
67
+                    urlData: { id: payload.newsTypeId },
68
+                }).then((data) => {
69
+                    resolve(data)
70
+                }).catch((err) => {
71
+                    reject(err)
72
+                })
73
+            })
74
+        }
75
+    }
76
+}

+ 209
- 0
src/views/goods/edit.vue Прегледај датотеку

@@ -0,0 +1,209 @@
1
+<template>
2
+  <div>
3
+    <div class="form-wrapper">
4
+      <el-form label-width="100px" :model="detail">
5
+        <el-form-item label="商品图片:">
6
+          <el-upload
7
+            class="avatar-uploader"
8
+            :action="upFileUrl"
9
+            name='file'
10
+            :show-file-list="false"
11
+            :before-upload="beforeImgUpload"
12
+            :on-success="handleAvatarSuccess">
13
+            <img v-if="detail.imgUrl" :src="detail.imgUrl" class="avatar">
14
+            <i v-else class="el-icon-plus avatar-uploader-icon"></i>
15
+          </el-upload>
16
+        </el-form-item>
17
+        <el-form-item label="商品名称:">
18
+          <el-input v-model="detail.goodsName"></el-input>
19
+        </el-form-item>
20
+        <el-form-item label="所需积分:">
21
+          <el-input v-model="detail.pointPrice"></el-input>
22
+        </el-form-item>
23
+        <el-form-item label="商品数量:">
24
+          <el-input v-model="detail.totalNum"></el-input>
25
+        </el-form-item>
26
+        <el-form-item label="剩余数量:">
27
+          <el-input v-model="detail.inventory"></el-input>
28
+        </el-form-item>
29
+        <el-form-item label="授权项目:">
30
+          <el-select v-model="detail.buildings" placeholder="请选择">
31
+            <el-option v-for="(build,i) in buildings.list || []" :key="i" :label="build.buildingName" :value="build.buildingId"></el-option>
32
+          </el-select>
33
+        </el-form-item>
34
+        <el-form-item label="商品详情:">
35
+            <div id="websiteEditorElem" style="height: 400px"></div>
36
+        </el-form-item>
37
+        <el-form-item label="状态:">
38
+          <el-radio-group v-model="detail.status">
39
+            <el-radio-button :label="0">禁用</el-radio-button>
40
+            <el-radio-button :label="1">启用</el-radio-button>
41
+          </el-radio-group>
42
+        </el-form-item>
43
+        <el-form-item label="领取地址:">
44
+          <el-input v-model="detail.tel"></el-input>
45
+        </el-form-item>
46
+        <el-form-item>
47
+          <el-button type="primary" @click="submitForm">保存</el-button>
48
+          <el-button @click="$router.go(-1)">返回</el-button>
49
+        </el-form-item>
50
+      </el-form>
51
+    </div>
52
+  </div>
53
+</template>
54
+
55
+<script>
56
+import { createNamespacedHelpers } from "vuex";
57
+import apis from "../../config/api";
58
+import E from "wangeditor";
59
+
60
+const { mapActions: mapGoodsActions } = createNamespacedHelpers("goods");
61
+const {
62
+  mapState: mapBuildingState,
63
+  mapActions: mapBuildingActions
64
+} = createNamespacedHelpers("building");
65
+export default {
66
+  name: "goodsEdit",
67
+  data() {
68
+    return {
69
+      upFileUrl: apis.file.upload.url,
70
+      detail: {}
71
+    };
72
+  },
73
+  created() {
74
+    this.init();
75
+  },
76
+  computed: {
77
+    ...mapBuildingState({
78
+      buildings: x => x.buildings
79
+    })
80
+  },
81
+  methods: {
82
+    ...mapBuildingActions(["getBuildings"]),
83
+    ...mapGoodsActions(["getGoodsDetail", "editConsultant"]),
84
+    init() {
85
+      if (this.$route.params.id) {
86
+        this.getGoodsDetail({ id: this.$route.params.id }).then(data => {
87
+          this.detail = data;
88
+        });
89
+      }
90
+    },
91
+    beforeImgUpload(file) {
92
+      if (file.type !== "image/jpeg" && file.type !== "image/png") {
93
+        this.$message.error("上传图片只能是 JPG 或 PNG 格式!");
94
+        return false;
95
+      }
96
+
97
+      this.showLoadding("上传中...");
98
+      return true;
99
+    },
100
+
101
+    handleAvatarSuccess(res) {
102
+      this.detail.photo = res.data;
103
+      this.hideLoadding();
104
+    },
105
+
106
+    submitForm() {
107
+      this.showLoadding("保存中...");
108
+      this.editConsultant(this.detail)
109
+        .then(res => {
110
+          if (res.personId) {
111
+            this.detail = res;
112
+          }
113
+
114
+          this.hideLoadding();
115
+          this.$notify.info("保存成功");
116
+        })
117
+        .catch(err => {
118
+          this.hideLoadding();
119
+          this.$notify.error(err.message);
120
+        });
121
+    },
122
+
123
+    showLoadding(text) {
124
+      this.loading = this.$loading({
125
+        text,
126
+        lock: true,
127
+        spinner: "el-icon-loading",
128
+        background: "rgba(255, 255, 255, 0.7)"
129
+      });
130
+    },
131
+
132
+    hideLoadding() {
133
+      if (this.loading) this.loading.close();
134
+    }
135
+  },
136
+  mounted() {
137
+    const _that = this;
138
+    const phoneEditor = new E("#websiteEditorElem");
139
+    phoneEditor.customConfig.onchange = function(html) {
140
+      _that.dynamic = { ..._that.dynamic, url: html };
141
+    };
142
+    // phoneEditor.customConfig.uploadImgServer = this.upFileUrl
143
+    // phoneEditor.customConfig.uploadFileName = 'uploadFiles'
144
+
145
+    phoneEditor.customConfig.customUploadImg = function(files, insert) {
146
+      _that.uploadImg(files[0]).then(data => {
147
+        insert(data);
148
+      });
149
+    };
150
+    phoneEditor.customConfig.menus = [
151
+      "head", // 标题
152
+      "bold", // 粗体
153
+      "fontSize", // 字号
154
+      "fontName", // 字体
155
+      "italic", // 斜体
156
+      "underline", // 下划线
157
+      "strikeThrough", // 删除线
158
+      "foreColor", // 文字颜色
159
+      "backColor", // 背景颜色
160
+      "justify", // 对齐方式
161
+      "image" // 插入图片
162
+    ];
163
+    phoneEditor.create()
164
+
165
+    // this.getBuildings({
166
+    //   pageNum: 1,
167
+    //   pageSize: 100
168
+    // }).then(() => {
169
+    //   if ((this.$route.query.id || "") !== "") {
170
+    //     this.getDetail({ id: this.$route.query.id }).then(data => {
171
+    //       phoneEditor.txt.html(data.url);
172
+    //     });
173
+    //   }
174
+    // });
175
+  }
176
+};
177
+</script>
178
+
179
+<style lang="scss" scoped>
180
+.form-wrapper {
181
+  width: 60%;
182
+}
183
+</style>
184
+
185
+<style lang="scss">
186
+.avatar-uploader .el-upload {
187
+  border: 1px dashed #d9d9d9;
188
+  border-radius: 6px;
189
+  cursor: pointer;
190
+  position: relative;
191
+  overflow: hidden;
192
+}
193
+.avatar-uploader .el-upload:hover {
194
+  border-color: #409eff;
195
+}
196
+.avatar-uploader-icon {
197
+  font-size: 28px;
198
+  color: #8c939d;
199
+  width: 178px;
200
+  height: 178px;
201
+  line-height: 178px;
202
+  text-align: center;
203
+}
204
+.avatar {
205
+  width: 178px;
206
+  height: 178px;
207
+  display: block;
208
+}
209
+</style>

+ 188
- 0
src/views/goods/list.vue Прегледај датотеку

@@ -0,0 +1,188 @@
1
+<template>
2
+<div class="list">
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='addDynamic'>新增</el-button>
7
+        </div>
8
+        <ul>
9
+          <li>
10
+            <el-input v-model="filterData.goodsName" placeholder="商品名称"></el-input>
11
+          </li>
12
+
13
+        </ul>
14
+        <el-button
15
+          size="mini"
16
+          type="primary" @click="search">查询</el-button>
17
+      </div>
18
+      <div class="moreFilter"></div>
19
+    </div>
20
+  <el-table
21
+    :data="list || []"
22
+    style="width: 100%">
23
+    <el-table-column
24
+      label="商品图片">
25
+      <template slot-scope="scope">
26
+          <div class="header">
27
+            <img :src="scope.row.imgUrl" alt="" />
28
+          </div>
29
+        </template>
30
+    </el-table-column>
31
+    <el-table-column
32
+      prop="goodsName"
33
+      label="商品名称">
34
+    </el-table-column>
35
+    <el-table-column
36
+      prop="pointPrice"
37
+      label="所需积分">
38
+    </el-table-column>
39
+    <el-table-column
40
+      prop="totalNum"
41
+      label="总数量">
42
+    </el-table-column>
43
+    <el-table-column
44
+      label="已经兑换数量">
45
+      <template slot-scope="scope">
46
+        <span  >{{scope.row.totalNum -scope.row.inventory }}</span>
47
+      </template>
48
+    </el-table-column>
49
+    <el-table-column
50
+      prop="inventory"
51
+      label="剩余数量">
52
+    </el-table-column>
53
+    <el-table-column   label="状态">
54
+      <template slot-scope="scope">
55
+        <span :style="{color:(scope.row.status == 1?'':'red')}" >{{scope.row.status == 1 ? '已上架' : '未上架'}}</span>
56
+      </template>
57
+    </el-table-column>
58
+    <el-table-column
59
+      fixed="right"
60
+      label="操作">
61
+      <template slot-scope="scope">
62
+        <el-button type="text" @click="toDetail(scope.row)" size="small">{{scope.row.status == 1?'下架':'上架'}}</el-button>
63
+        <el-button type="text" @click="toDetail(scope.row)" size="small">编辑</el-button>
64
+      </template>
65
+    </el-table-column>
66
+  </el-table>
67
+  <el-pagination
68
+    small
69
+    style="margin-top:10px;"
70
+    layout="prev, pager, next"
71
+    :current-page.sync="pageNavi.current"
72
+    :pageSize="pageNavi.size"
73
+    :total="pageNavi.total || 0"
74
+    @current-change="getConsultants"
75
+  >
76
+  </el-pagination>
77
+</div>
78
+</template>
79
+
80
+<script>
81
+import { createNamespacedHelpers } from "vuex";
82
+
83
+const { mapActions: mapGoodsActions } = createNamespacedHelpers("goods");
84
+
85
+export default {
86
+  name: "goods-list",
87
+  data() {
88
+    return {
89
+      filterData: {
90
+        goodsName: ""
91
+      },
92
+      list: [],
93
+      pageNavi: {
94
+        current: 1,
95
+        size: 20,
96
+        total: 0
97
+      }
98
+    };
99
+  },
100
+  computed: {},
101
+  methods: {
102
+    ...mapGoodsActions(["getGoods"]),
103
+    getList() {
104
+      const pageNumber = this.pageNavi.current || 1;
105
+      const pageSize = this.pageNavi.size;
106
+
107
+      this.getGoods({
108
+        ...this.filterData,
109
+        pageNumber,
110
+        pageSize
111
+      })
112
+        .then(res => {
113
+          const { records, ...pageNavi } = res;
114
+
115
+          this.list = records;
116
+          this.pageNavi = pageNavi;
117
+        })
118
+        .catch(err => {
119
+          this.$notify.error(err.msg || err.message);
120
+        });
121
+    },
122
+    addDynamic() {
123
+      this.$router.push({ name: "consultant.list" });
124
+    },
125
+    toDetail(row) {
126
+      this.$router.push({
127
+        name: "goods.edit",
128
+        params: { id: row.goodsId }
129
+      });
130
+    },
131
+    search() {
132
+      this.pageNavi.current = 1;
133
+      this.getList();
134
+    },
135
+    newPage(page) {
136
+      this.$router.replace({ name: "consultant.list", query: { page } });
137
+    }
138
+  },
139
+  created() {
140
+    this.pageNavi.current = this.$route.query.page || 1;
141
+
142
+    this.getList();
143
+  }
144
+};
145
+</script>
146
+
147
+<style lang="scss" scoped>
148
+.list {
149
+  .header {
150
+    width: 50px;
151
+    height: 50px;
152
+    border-radius: 50%;
153
+  }
154
+  img {
155
+      width: 100%;
156
+      height: 100%;
157
+    }
158
+}
159
+.system-table-search {
160
+  width: calc(100% - 40px);
161
+  margin: 20px auto 0;
162
+}
163
+
164
+.system-table-search li {
165
+  margin-right: 20px;
166
+}
167
+
168
+.system-table-search ul {
169
+  font-size: 0;
170
+  white-space: nowrap;
171
+}
172
+
173
+.system-table-search ul > li {
174
+  display: inline-block;
175
+}
176
+
177
+.flex-h {
178
+  display: flex;
179
+  align-items: center;
180
+}
181
+
182
+.flex-item {
183
+  flex: 1;
184
+  -webkit-flex: 1;
185
+  position: relative;
186
+  overflow: hidden;
187
+}
188
+</style>

+ 89
- 1
src/views/index.js Прегледај датотеку

@@ -221,6 +221,7 @@ const pages = [
221 221
     ]
222 222
   },
223 223
   {
224
+
224 225
     path: 'systemManagement',
225 226
     name: 'systemManagement',
226 227
     component: () => import('./index.vue'),
@@ -248,7 +249,94 @@ const pages = [
248 249
         },
249 250
       },
250 251
     ]
251
-  }
252
+  },
253
+  {
254
+    path: '/news',
255
+    name: 'news',
256
+    component: () => import('./index.vue'),
257
+    meta: {
258
+      menuShow: true,
259
+      title: '资迅管理',
260
+    },
261
+    children: [
262
+      {
263
+        path: '/news/type/list',
264
+        name: 'news-type-list',
265
+        component: () => import('./news/type/index.vue'),
266
+        meta: {
267
+          menuShow: true,
268
+          title: '资迅类型',
269
+        },
270
+      },
271
+      {
272
+        path: '/news/type/edi',
273
+        name: 'news-type-edi',
274
+        component: () => import('./news/type/edi/index.vue'),
275
+        meta: {
276
+          menuShow: false,
277
+          title: '编辑资迅类型',
278
+        },
279
+      }
280
+    ]
281
+  },
282
+  {
283
+    path: 'pointsmall',
284
+    name: 'pointsmall',
285
+    redirect: 'pointsmall/list',
286
+    component: () => import('./index.vue'),
287
+    meta: {
288
+      menuShow: true,
289
+      title: '积分商城',
290
+    },
291
+    children: [
292
+      {
293
+        path: 'list',
294
+        name: 'goods.list',
295
+        component: () => import('./goods/list.vue'),
296
+        meta: {
297
+          menuShow: true,
298
+          title: '商品列表',
299
+        },
300
+      },
301
+      {
302
+        path: 'goods/edit',
303
+        name: 'goods.edit',
304
+        component: () => import('./goods/edit.vue'),
305
+        meta: {
306
+          menuShow: false,
307
+          title: '编辑商品',
308
+        },
309
+      },
310
+      {
311
+        path: 'edit/:id?',
312
+        name: 'pointsmall.edit',
313
+        component: () => import('./consultant/edit.vue'),
314
+        meta: {
315
+          menuShow: true,
316
+          title: '积分获取',
317
+        },
318
+      },
319
+      {
320
+        path: 'edit/:id?',
321
+        name: 'consultant.edit',
322
+        component: () => import('./consultant/edit.vue'),
323
+        meta: {
324
+          menuShow: true,
325
+          title: '商品核销',
326
+        },
327
+      },
328
+      {
329
+        path: 'edit/:id?',
330
+        name: 'consultant.edit',
331
+        component: () => import('./consultant/edit.vue'),
332
+        meta: {
333
+          menuShow: true,
334
+          title: '兑换记录',
335
+        },
336
+      },
337
+    ]
338
+  },
339
+
252 340
 ]
253 341
 
254 342
 const flatten = (rts, parents = []) => {

+ 98
- 0
src/views/news/index.vue Прегледај датотеку

@@ -0,0 +1,98 @@
1
+<template>
2
+    <div id="root">
3
+        <div class="operation-class">
4
+           <el-button type="primary">新增</el-button>
5
+            &nbsp;
6
+            <el-select v-model="form.buildingId" placeholder="项目">
7
+                <el-option
8
+                        v-for="item in buildingList"
9
+                        :key="item.buildingId"
10
+                        :label="item.buildingName"
11
+                        :value="item.buildingId">
12
+                </el-option>
13
+            </el-select>
14
+        </div>
15
+        <div class="body">
16
+            <el-table
17
+                    :data="[]"
18
+                    height="250"
19
+                    border
20
+                    style="width: 100%">
21
+                <el-table-column
22
+                        prop="date"
23
+                        label="类型图"
24
+                        align="center">
25
+                    <template slot-scope="scope">
26
+                        <img :src="scope.row.news_type_img" width="50" height="50"/>
27
+                    </template>
28
+                </el-table-column>
29
+                <el-table-column
30
+                        prop="newsTypeName"
31
+                        label="名称"
32
+                        align="center">
33
+                </el-table-column>
34
+                <el-table-column
35
+                        prop="newsTypeId"
36
+                        align="center"
37
+                        label="操作">
38
+                    <template slot-scope="scope">
39
+                        <router-link :to="{ name:'newsTypeEdi', query: { id: scope.row.newsTypeId } }">编辑</router-link>
40
+                        <span @click="deleteNews(scope.row.newsTypeId)">删除</span>
41
+                    </template>
42
+                </el-table-column>
43
+            </el-table>
44
+        </div>
45
+        <div class="block">
46
+            <el-pagination
47
+                    @size-change="handleSizeChange"
48
+                    @current-change="handleCurrentChange"
49
+                    :current-page="form.pageNum"
50
+                    :page-sizes="[1, 10, 20, 30, 40]"
51
+                    :page-size="form.pageSize"
52
+                    layout="total, sizes, prev, pager, next, jumper"
53
+                    :total="total">
54
+            </el-pagination>
55
+        </div>
56
+    </div>
57
+</template>
58
+
59
+<script>
60
+    export default {
61
+        name: "newsIndex",
62
+        data() {
63
+            return {
64
+                buildingList: [],
65
+                form: {
66
+                    buildingId: '',
67
+                    pageNum: 0,
68
+                    pageSize: 10
69
+                },
70
+                total: 0
71
+            }
72
+        },
73
+        methods: {
74
+            deleteNews(id) {
75
+                // 删除操作
76
+            },
77
+            handleSizeChange(val) {
78
+                console.log(`每页 ${val} 条`);
79
+            },
80
+            handleCurrentChange(val) {
81
+                console.log(`当前页: ${val}`);
82
+            }
83
+        }
84
+    }
85
+</script>
86
+
87
+<style scoped>
88
+.operation-class {
89
+    margin-left: 20px;
90
+}
91
+.body {
92
+    margin-top: 10px;
93
+}
94
+.block {
95
+    display: flex;
96
+    justify-content: flex-end;
97
+}
98
+</style>

+ 156
- 0
src/views/news/type/edi/index.vue Прегледај датотеку

@@ -0,0 +1,156 @@
1
+<template>
2
+    <div id="root">
3
+        <el-form ref="form" :model="form" label-width="80px" class="form">
4
+            <el-form-item label="项目">
5
+                <el-select v-model="form.buildingId" placeholder="请选择">
6
+                    <el-option
7
+                            v-for="item in buildingList"
8
+                            :key="item.buildingId"
9
+                            :label="item.buildingName"
10
+                            :value="item.buildingId">
11
+                    </el-option>
12
+                </el-select>
13
+            </el-form-item>
14
+            <el-form-item label="图片">
15
+<!--                class="avatar-uploader"-->
16
+                <el-upload
17
+                        :headers="uploadHeaders"
18
+                        :action="upFileUrl"
19
+                        :show-file-list="false"
20
+                        :on-success="handleAvatarSuccess">
21
+                    <img v-if="imageUrl" :src="imageUrl" class="avatar">
22
+                    <i v-else class="el-icon-plus avatar-uploader-icon"></i>
23
+                </el-upload>
24
+            </el-form-item>
25
+            <el-form-item label="名称">
26
+                <el-input v-model="form.newsTypeName"></el-input>
27
+            </el-form-item>
28
+            <el-form-item>
29
+                <el-button type="primary" @click="submitNewsType">保存</el-button>
30
+                <el-button @click="cancel">取消</el-button>
31
+            </el-form-item>
32
+        </el-form>
33
+    </div>
34
+</template>
35
+
36
+<script>
37
+    import apis from '../../../../config/api'
38
+    export default {
39
+        name: "index",
40
+        data() {
41
+            return {
42
+                upFileUrl: apis.file.upload.url,
43
+                buildingList: [],
44
+                imageUrl: '',
45
+                form: {
46
+                    newsTypeId: '',
47
+                    newsTypeImg: '',
48
+                    newsTypeName: '',
49
+                    buildingId: ''
50
+                },
51
+                buildingForm: {
52
+                    pageNum: 1,
53
+                    pageSize: 100
54
+                },
55
+            }
56
+        },
57
+        created() {
58
+            this.getBuildList()
59
+            this.form.newsTypeId = this.$route.query.id
60
+            if (this.form.newsTypeId !== undefined) {
61
+                this.getById()
62
+            }
63
+        },
64
+        computed: {
65
+            uploadHeaders () {
66
+                const token = localStorage.getItem('x-token') || ''
67
+                return {
68
+                    Authorization: `Bearer ${token}`
69
+                }
70
+            }
71
+        },
72
+        methods: {
73
+            handleAvatarSuccess(res, file) {
74
+                this.imageUrl = URL.createObjectURL(file.raw);
75
+                // console.log(res)
76
+                this.form.newsTypeImg = res.data
77
+            },
78
+            getBuildList() {
79
+                this.$store.dispatch('building/getBuildings', this.buildingForm).then((res) => {
80
+                    this.buildingList = res.records
81
+                }).catch(() => {
82
+                    console.log('building/getBuildings err')
83
+                })
84
+            },
85
+            submitNewsType() {
86
+                console.log(this.form.newsTypeId)
87
+                if (this.form.newsTypeId === '' || this.form.newsTypeId === undefined) {
88
+                    console.log('添加')
89
+                    this.$store.dispatch('news/addType', this.form).then((res) => {
90
+                        this.$message.success('操作成功!')
91
+                        this.$router.go(-1)
92
+                        // console.log(res)
93
+                    }).catch(() => {
94
+                        console.log('news/addType err')
95
+                    })
96
+
97
+                    return;
98
+                }
99
+
100
+                // 修改
101
+                this.$store.dispatch('news/updateType', this.form).then((res) => {
102
+                    this.$message.success('操作成功!')
103
+                    this.$router.go(-1)
104
+                    // console.log(res)
105
+                }).catch(() => {
106
+                    console.log('news/updateType err')
107
+                })
108
+
109
+            },
110
+            cancel() {
111
+                this.$router.go(-1)
112
+            },
113
+            getById() {
114
+                this.$store.dispatch('news/getTypeById', this.form).then((res) => {
115
+                    this.form.newsTypeName = res.newsTypeName
116
+                    this.form.newsTypeImg = res.newsTypeImg
117
+                    this.imageUrl = res.newsTypeImg
118
+                    this.form.buildingId = res.buildingId
119
+                }).catch(() => {
120
+                    console.log('news/getTypeById err')
121
+                })
122
+            }
123
+        }
124
+    }
125
+</script>
126
+
127
+<style scoped>
128
+    .avatar-uploader .el-upload {
129
+        border: 1px dashed #d9d9d9;
130
+        border-radius: 6px;
131
+        cursor: pointer;
132
+        position: relative;
133
+        overflow: hidden;
134
+    }
135
+    .avatar-uploader .el-upload:hover {
136
+        border-color: #409EFF;
137
+    }
138
+    .avatar-uploader-icon {
139
+        font-size: 28px;
140
+        color: #8c939d;
141
+        width: 178px;
142
+        height: 178px;
143
+        line-height: 178px;
144
+        text-align: center;
145
+    }
146
+    .avatar {
147
+        width: 178px;
148
+        height: 178px;
149
+        display: block;
150
+    }
151
+    .form {
152
+        width: 300px;
153
+        margin-left: auto;
154
+        margin-right: auto;
155
+    }
156
+</style>

+ 141
- 0
src/views/news/type/index.vue Прегледај датотеку

@@ -0,0 +1,141 @@
1
+<template>
2
+    <div id="root">
3
+        <div class="operation-class">
4
+           <el-button type="primary" @click="ediNewsType">新增</el-button>
5
+            &nbsp;
6
+            <el-select v-model="form.buildingId" placeholder="项目" @change="getList">
7
+                <el-option
8
+                        v-for="item in buildingList"
9
+                        :key="item.buildingId"
10
+                        :label="item.buildingName"
11
+                        :value="item.buildingId">
12
+                </el-option>
13
+            </el-select>
14
+        </div>
15
+        <div class="body">
16
+            <el-table
17
+                    :data="list"
18
+                    border
19
+                    style="width: 100%">
20
+                <el-table-column
21
+                        prop="date"
22
+                        label="类型图"
23
+                        align="center">
24
+                    <template slot-scope="scope">
25
+                        <img :src="scope.row.newsTypeImg" width="50" height="50"/>
26
+                    </template>
27
+                </el-table-column>
28
+                <el-table-column
29
+                        prop="newsTypeName"
30
+                        label="名称"
31
+                        align="center">
32
+                </el-table-column>
33
+                <el-table-column
34
+                        prop="newsTypeId"
35
+                        align="center"
36
+                        label="操作">
37
+                    <template slot-scope="scope">
38
+                        <router-link :to="{ name:'news-type-edi', query: { id: scope.row.newsTypeId } }">编辑</router-link>
39
+                        <a href="javascript:void(0);" @click="deleteNews(scope.row.newsTypeId)" class="delClass">删除</a>
40
+                    </template>
41
+                </el-table-column>
42
+            </el-table>
43
+        </div>
44
+        <div class="block">
45
+            <el-pagination
46
+                    @size-change="handleSizeChange"
47
+                    @current-change="handleCurrentChange"
48
+                    :current-page="form.pageNum"
49
+                    :page-sizes="[1, 10, 20, 30, 40]"
50
+                    :page-size="form.pageSize"
51
+                    layout="total, sizes, prev, pager, next, jumper"
52
+                    :total="total">
53
+            </el-pagination>
54
+        </div>
55
+    </div>
56
+</template>
57
+
58
+<script>
59
+    export default {
60
+        name: "newsIndex",
61
+        data() {
62
+            return {
63
+                buildingList: [],
64
+                form: {
65
+                    buildingId: '',
66
+                    pageNum: 1,
67
+                    pageSize: 10
68
+                },
69
+                buildingForm: {
70
+                    pageNum: 1,
71
+                    pageSize: 100
72
+                },
73
+                total: 0,
74
+                list: []
75
+            }
76
+        },
77
+        created() {
78
+          this.getList()
79
+          this.getBuildList()
80
+        },
81
+        methods: {
82
+            deleteNews(id) {
83
+                // 删除操作
84
+                const data = { newsTypeId: id }
85
+                this.$store.dispatch('news/deleteType', data).then((res) => {
86
+                    this.getList()
87
+                }).catch(() => {
88
+                    console.log('news/deleteType err');
89
+                })
90
+            },
91
+            handleSizeChange(val) {
92
+                console.log(`每页 ${val} 条`);
93
+                this.form.pageSize = val
94
+                this.form.pageNum = 1
95
+                this.getList()
96
+            },
97
+            handleCurrentChange(val) {
98
+                console.log(`当前页: ${val}`);
99
+                this.form.pageNum = val
100
+                this.getList()
101
+            },
102
+            getList() {
103
+              this.$store.dispatch('news/getTypeList', this.form).then((res) => {
104
+                this.list = res.records
105
+                this.form.pageNum = res.current
106
+                this.form.pageSize = res.size
107
+                this.total = res.total
108
+              }).catch(() => {
109
+                  console.log('news/getTypeList err')
110
+              })
111
+            },
112
+            getBuildList() {
113
+                this.$store.dispatch('building/getBuildings', this.buildingForm).then((res) => {
114
+                    this.buildingList = res.records
115
+                }).catch(() => {
116
+                    console.log('building/getBuildings err')
117
+                })
118
+            },
119
+            ediNewsType() {
120
+                this.$router.push({ name: 'news-type-edi' })
121
+            }
122
+        }
123
+    }
124
+</script>
125
+
126
+<style scoped>
127
+.operation-class {
128
+    margin-left: 20px;
129
+}
130
+.body {
131
+    margin-top: 10px;
132
+}
133
+.block {
134
+    display: flex;
135
+    justify-content: flex-end;
136
+}
137
+.delClass {
138
+    padding-left: 10px;
139
+    padding-right: 10px;
140
+}
141
+</style>