ソースを参照

咨迅类型 完成

魏熙美 6 年 前
コミット
e39c9b00cc
共有6 個のファイルを変更した383 個の追加7 個の削除を含む
  1. 23
    1
      src/config/api.js
  2. 3
    0
      src/store/index.js
  3. 76
    0
      src/store/modules/news.js
  4. 10
    1
      src/views/index.js
  5. 156
    0
      src/views/news/type/edi/index.vue
  6. 115
    5
      src/views/news/type/index.vue

+ 23
- 1
src/config/api.js ファイルの表示

@@ -1,4 +1,4 @@
1
-const commPrefix = '/api/admin'
1
+const commPrefix = '/api/admin/'
2 2
 
3 3
 const apis = {
4 4
   system: {
@@ -126,6 +126,28 @@ const apis = {
126 126
       method: 'post',
127 127
       url: `${commPrefix}/customer/add`
128 128
     }
129
+  },
130
+  newsType: {
131
+    list: {
132
+      method: 'get',
133
+      url: `${commPrefix}/taNewsType`
134
+    },
135
+    add: {
136
+      method: 'post',
137
+      url: `${commPrefix}/taNewsType`
138
+    },
139
+    delete: {
140
+      method: 'delete',
141
+      url: `${commPrefix}/taNewsType/:id`
142
+    },
143
+    update: {
144
+      method: 'put',
145
+      url: `${commPrefix}/taNewsType/:id`
146
+    },
147
+    getById: {
148
+      method: 'get',
149
+      url: `${commPrefix}/taNewsType/:id`
150
+    }
129 151
   }
130 152
 }
131 153
 

+ 3
- 0
src/store/index.js ファイルの表示

@@ -2,6 +2,8 @@ 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'
6
+
5 7
 Vue.use(Vuex)
6 8
 
7 9
 const store = new Vuex.Store({
@@ -13,6 +15,7 @@ const store = new Vuex.Store({
13 15
     customer: require('./modules/customer').default,
14 16
     building: require('./modules/building').default,
15 17
     img: require('./modules/img').default,
18
+    news
16 19
   }
17 20
 })
18 21
 

+ 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
+}

+ 10
- 1
src/views/index.js ファイルの表示

@@ -175,11 +175,20 @@ const pages = [
175 175
       {
176 176
         path: '/news/type/list',
177 177
         name: 'news-type-list',
178
-        component: () => import('./news/index.vue'),
178
+        component: () => import('./news/type/index.vue'),
179 179
         meta: {
180 180
           menuShow: true,
181 181
           title: '咨迅类型',
182 182
         },
183
+      },
184
+      {
185
+        path: '/news/type/edi',
186
+        name: 'news-type-edi',
187
+        component: () => import('./news/type/edi/index.vue'),
188
+        meta: {
189
+          menuShow: false,
190
+          title: '编辑咨迅类型',
191
+        },
183 192
       }
184 193
     ]
185 194
   },

+ 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>

+ 115
- 5
src/views/news/type/index.vue ファイルの表示

@@ -1,8 +1,9 @@
1 1
 <template>
2 2
     <div id="root">
3 3
         <div class="operation-class">
4
-           <el-button type="primary">新增</el-button>
5
-            <el-select v-model="buildingId" placeholder="项目" style="margin-left: 20px;">
4
+           <el-button type="primary" @click="ediNewsType">新增</el-button>
5
+            &nbsp;
6
+            <el-select v-model="form.buildingId" placeholder="项目" @change="getList">
6 7
                 <el-option
7 8
                         v-for="item in buildingList"
8 9
                         :key="item.buildingId"
@@ -11,21 +12,130 @@
11 12
                 </el-option>
12 13
             </el-select>
13 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>
14 55
     </div>
15 56
 </template>
16 57
 
17 58
 <script>
18 59
     export default {
19
-        name: "newsTypeIndex",
60
+        name: "newsIndex",
20 61
         data() {
21 62
             return {
22 63
                 buildingList: [],
23
-                buildingId: ''
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' })
24 121
             }
25 122
         }
26 123
     }
27 124
 </script>
28 125
 
29 126
 <style scoped>
30
-
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
+}
31 141
 </style>