浏览代码

Merge branch 'master' of http://git.ycjcjy.com/fuxingfan/foyo

# Conflicts:
#	vue-element-admin/src/api/case.js
#	vue-element-admin/src/store/modules/case.js
傅行帆 5 年前
父节点
当前提交
74b423e162

+ 13
- 7
foyo-service/src/main/java/com/huiju/foyo/controller/TaCaseTypeController.java 查看文件

@@ -19,6 +19,10 @@ import org.springframework.web.bind.annotation.RequestParam;
19 19
 import org.springframework.web.bind.annotation.ResponseBody;
20 20
 import org.springframework.web.bind.annotation.RestController;
21 21
 
22
+import java.time.LocalDateTime;
23
+import java.util.Arrays;
24
+import java.util.List;
25
+
22 26
 /**
23 27
  * <p>
24 28
     * 案列类型表  前端控制器
@@ -43,7 +47,7 @@ public class TaCaseTypeController extends BaseController {
43 47
      * @param pageSize
44 48
      * @return
45 49
      */
46
-    @RequestMapping(value="/taCaseType",method= RequestMethod.GET)
50
+    @RequestMapping(value="/admin/caseType/list",method= RequestMethod.GET)
47 51
     public ResponseBean taCaseTypeList(@RequestParam(value ="pageNum",defaultValue = "1") Integer pageNum,
48 52
                                        @RequestParam(value ="pageSize",defaultValue = "10") Integer pageSize){
49 53
         ResponseBean responseBean = new ResponseBean();
@@ -68,10 +72,12 @@ public class TaCaseTypeController extends BaseController {
68 72
      * @param taCaseType 实体对象
69 73
      * @return
70 74
      */
71
-    @RequestMapping(value="/taCaseType",method= RequestMethod.POST)
75
+    @RequestMapping(value="/admin/caseType/add",method= RequestMethod.POST)
72 76
     public ResponseBean taCaseTypeAdd(@RequestBody TaCaseType taCaseType){
73 77
         ResponseBean responseBean = new ResponseBean();
74 78
         try {
79
+            taCaseType.setCreateBy(ConstantFoyo.USER_ADMIN);
80
+            taCaseType.setCreateTime(LocalDateTime.now());
75 81
             if (iTaCaseTypeService.save(taCaseType)){
76 82
                 responseBean.addSuccess(taCaseType);
77 83
             }else {
@@ -86,15 +92,15 @@ public class TaCaseTypeController extends BaseController {
86 92
     }
87 93
 
88 94
     /**
89
-     * 根据id删除对象
90
-     * @param id  实体ID
95
+     * 根据id批量删除对象
91 96
      */
92 97
     @ResponseBody
93
-    @RequestMapping(value="/taCaseType/{id}", method= RequestMethod.DELETE)
94
-    public ResponseBean taCaseTypeDelete(@PathVariable Integer id){
98
+    @RequestMapping(value="/admin/caseType/delete", method= RequestMethod.DELETE)
99
+    public ResponseBean taCaseTypeDelete(@RequestBody String[] ids){
95 100
         ResponseBean responseBean = new ResponseBean();
96 101
         try {
97
-            if(iTaCaseTypeService.removeById(id)){
102
+            List<String> idList = Arrays.asList(ids);
103
+            if(iTaCaseTypeService.removeByIds(idList)){
98 104
                 responseBean.addSuccess("success");
99 105
             }else {
100 106
                 responseBean.addError("fail");

+ 23
- 0
vue-element-admin/src/api/case.js 查看文件

@@ -42,7 +42,30 @@ export function getCaseTypeListData(query) {
42 42
 export function addCase(data) {
43 43
   return request({
44 44
     url: '/case/add',
45
+    method: 'post'
46
+  })
47
+}
48
+
49
+export function serviceCaseList(query) {
50
+  return request({
51
+    url: 'caseType/list',
52
+    method: 'get',
53
+    params: query
54
+  })
55
+}
56
+
57
+export function addServiceCase(data) {
58
+  return request({
59
+    url: '/caseType/add',
45 60
     method: 'post',
46 61
     data
47 62
   })
48 63
 }
64
+
65
+export function deleteServiceCaseBatch(data) {
66
+  return request({
67
+    url: '/caseType/delete',
68
+    method: 'delete',
69
+    data
70
+  })
71
+}

+ 0
- 0
vue-element-admin/src/api/serviceCase.js 查看文件


+ 13
- 0
vue-element-admin/src/router/index.js 查看文件

@@ -148,6 +148,19 @@ export const constantRouterMap = [
148 148
         component: () => import('@/views/case/cover'),
149 149
         name: 'case-cover',
150 150
         meta: { title: '编辑封面图', icon: 'table' }
151
+      },
152
+      {
153
+        path: '/servicecase',
154
+        component: () => import('@/views/case/servicecase/index'),
155
+        name: 'servicecase-index',
156
+        meta: { title: '案例类型列表', icon: 'table' }
157
+      },
158
+      {
159
+        path: '/servicecase/add',
160
+        component: () => import('@/views/case/servicecase/add'),
161
+        name: 'servicecase-add',
162
+        hidden: true,
163
+        meta: { title: '新增案例类型', icon: 'table' }
151 164
       }
152 165
     ]
153 166
   }

+ 28
- 1
vue-element-admin/src/store/modules/case.js 查看文件

@@ -1,4 +1,4 @@
1
-import { serviceCaseCover, addCaseCover, getCaseListData, deleteServiceBatch, addCase, getCaseTypeListData } from '@/api/case'
1
+import { serviceCaseCover, addCaseCover, getCaseListData, deleteServiceBatch, addCase, getCaseTypeListData, serviceCaseList, addServiceCase, deleteServiceCaseBatch } from '@/api/case'
2 2
 
3 3
 const servicecase = {
4 4
   namespaced: true,
@@ -57,6 +57,33 @@ const servicecase = {
57 57
           reject(error)
58 58
         })
59 59
       })
60
+    },
61
+    getServiceCaseList({ commit, state }, data) {
62
+      return new Promise((resolve, reject) => {
63
+        serviceCaseList(data).then(response => {
64
+          resolve(response)
65
+        }).catch(error => {
66
+          reject(error)
67
+        })
68
+      })
69
+    },
70
+    addServiceCase({ commit, state }, data) {
71
+      return new Promise((resolve, reject) => {
72
+        addServiceCase(data).then(response => {
73
+          resolve(response)
74
+        }).catch(error => {
75
+          reject(error)
76
+        })
77
+      })
78
+    },
79
+    deleteServiceCase({ commit, state }, data) { // 删除
80
+      return new Promise((resolve, reject) => {
81
+        deleteServiceCaseBatch(data).then(response => {
82
+          resolve(response)
83
+        }).catch(error => {
84
+          reject(error)
85
+        })
86
+      })
60 87
     }
61 88
   }
62 89
 }

+ 234
- 0
vue-element-admin/src/views/case/servicecase/add.vue 查看文件

@@ -0,0 +1,234 @@
1
+<template>
2
+  <div id="app" class="app-container">
3
+    <el-form ref="form" :model="form">
4
+      <el-form-item :label-width="formLabelWidth" label="类型名称">
5
+        <el-input v-model="form.typeName"/>
6
+      </el-form-item>
7
+      <el-form-item :label-width="formLabelWidth" label="排序">
8
+        <el-input v-model="form.sort"/>
9
+      </el-form-item>
10
+      <el-form-item>
11
+        <el-tag
12
+          v-for="tag in dynamicTags"
13
+          :key="tag"
14
+          :disable-transitions="false"
15
+          closable
16
+          @close="handleClose(tag)">
17
+          {{ tag }}
18
+        </el-tag>
19
+        <el-input
20
+          v-if="inputVisible"
21
+          ref="saveTagInput"
22
+          v-model="inputValue"
23
+          size="small"
24
+          class="input-new-tag"
25
+          @keyup.enter.native="handleInputConfirm"
26
+          @blur="handleInputConfirm"/>
27
+      </el-form-item>
28
+    </el-form>
29
+    <div slot="footer" class="dialog-footer">
30
+      <el-button @click="dialogForm('0')">取 消</el-button>
31
+      <el-button type="primary" @click="dialogForm('1')">确 定</el-button>
32
+    </div>
33
+  </div>
34
+</template>
35
+
36
+<script>
37
+// import { updateArticle, createBanner } from '@/api/banner' // getBanner
38
+import waves from '@/directive/waves' // Waves directive
39
+import Pagination from '@/components/Pagination' // Secondary package based on el-pagination
40
+const calendarTypeOptions = [
41
+  { key: 'CN', display_name: 'China' },
42
+  { key: 'US', display_name: 'USA' },
43
+  { key: 'JP', display_name: 'Japan' },
44
+  { key: 'EU', display_name: 'Eurozone' }
45
+]
46
+// arr to obj ,such as { CN : "China", US : "USA" }
47
+const calendarTypeKeyValue = calendarTypeOptions.reduce((acc, cur) => {
48
+  acc[cur.key] = cur.display_name
49
+  return acc
50
+}, {})
51
+export default {
52
+  name: 'UpdateBanner',
53
+  components: { Pagination },
54
+  directives: { waves },
55
+  filters: {
56
+    statusFilter(status) {
57
+      const statusMap = {
58
+        published: 'success',
59
+        draft: 'info',
60
+        deleted: 'danger'
61
+      }
62
+      return statusMap[status]
63
+    },
64
+    typeFilter(type) {
65
+      return calendarTypeKeyValue[type]
66
+    }
67
+  },
68
+  data() {
69
+    return {
70
+      tableKey: 0,
71
+      list: null,
72
+      total: 0,
73
+      listLoading: true,
74
+      imageUrl: '', // 图片预览
75
+      importanceOptions: [1, 2, 3],
76
+      calendarTypeOptions,
77
+      communityQuery: {
78
+        pageNum: 1,
79
+        pageSize: 300,
80
+        communityId: undefined,
81
+        communityName: undefined,
82
+        provinceId: undefined,
83
+        cityId: undefined,
84
+        districtId: undefined
85
+      },
86
+      listQuery: [],
87
+      form: {
88
+        id: '',
89
+        serviceName: '',
90
+        sort: '',
91
+        serviceImageUrl: '',
92
+        labelList: []
93
+      },
94
+      uploadImgUrl: process.env.BASE_API + '/uploadimage',
95
+      dialogStatus: '',
96
+      downloadLoading: false,
97
+      formLabelWidth: '120px',
98
+      showContentVisible: false,
99
+      showURLVisible: true,
100
+      bannerPositionArr: [
101
+        { id: 1, value: '首页banner' },
102
+        { id: 2, value: '服务banner' }
103
+      ],
104
+      dynamicTags: [],
105
+      inputVisible: false,
106
+      inputValue: ''
107
+    }
108
+  },
109
+  computed: {
110
+  },
111
+  created() {
112
+    this.listQuery = this.$route.params.listQuery
113
+  },
114
+  updated() {
115
+  },
116
+  methods: {
117
+    handleAvatarSuccess(res, file) { // 上传成功回调
118
+      this.imageUrl = URL.createObjectURL(file.raw)
119
+      this.form.serviceImageUrl = res.data[0]
120
+    },
121
+    dialogAddForm() {
122
+      this.dialogFormVisible = true
123
+      this.form.typeName = ''
124
+      this.form.sort = ''
125
+      this.form.serviceImageUrl = ''
126
+    },
127
+    dialogForm(isVaule) {
128
+      if (isVaule === '0') {
129
+        this.$router.push({ name: 'servicecase-index' })
130
+      } else {
131
+        this.createData()
132
+      }
133
+    },
134
+    showContent() {
135
+      if (this.form.bannerType === '1') {
136
+        this.showContentVisible = false
137
+        this.showURLVisible = true
138
+      } else {
139
+        this.showContentVisible = true
140
+        this.showURLVisible = false
141
+      }
142
+    },
143
+    createData() {
144
+      this.$refs['form'].validate((valid) => {
145
+        if (valid) {
146
+          this.form.labelList = this.dynamicTags
147
+          this.$store.dispatch('servicecase/addServiceCase', this.form).then((res) => {
148
+            if (res.data.code === '0') {
149
+              this.$message({
150
+                message: res.data.message,
151
+                type: 'success'
152
+              })
153
+              this.$router.push({ name: 'servicecase-index' })
154
+            } else {
155
+              this.$message({
156
+                message: res.data.message,
157
+                type: 'warning'
158
+              })
159
+            }
160
+          })
161
+        }
162
+      })
163
+    },
164
+    handleClose(tag) {
165
+      this.dynamicTags.splice(this.dynamicTags.indexOf(tag), 1)
166
+    },
167
+    showInput() {
168
+      this.inputVisible = true
169
+      this.$nextTick(_ => {
170
+        this.$refs.saveTagInput.$refs.input.focus()
171
+      })
172
+    },
173
+    handleInputConfirm() {
174
+      const inputValue = this.inputValue
175
+      if (inputValue) {
176
+        this.dynamicTags.push(inputValue)
177
+      }
178
+      this.inputVisible = false
179
+      this.inputValue = ''
180
+    }
181
+  }
182
+}
183
+</script>
184
+
185
+<style scoped>
186
+.app-container {
187
+  width: 50%;
188
+  margin: auto;
189
+}
190
+.dialog-footer {
191
+  text-align: center;
192
+}
193
+.el-tag + .el-tag {
194
+    margin-left: 10px;
195
+  }
196
+  .button-new-tag {
197
+    margin-left: 10px;
198
+    height: 32px;
199
+    line-height: 30px;
200
+    padding-top: 0;
201
+    padding-bottom: 0;
202
+  }
203
+  .input-new-tag {
204
+    width: 90px;
205
+    margin-left: 10px;
206
+    vertical-align: bottom;
207
+  }
208
+</style>
209
+<style>
210
+.avatar-uploader .el-upload {
211
+  border: 1px dashed #d9d9d9;
212
+  border-radius: 6px;
213
+  cursor: pointer;
214
+  position: relative;
215
+  overflow: hidden;
216
+}
217
+.avatar-uploader .el-upload:hover {
218
+  border-color: #409EFF;
219
+}
220
+.avatar-uploader-icon {
221
+  font-size: 28px;
222
+  color: #8c939d;
223
+  width: 178px;
224
+  height: 178px;
225
+  line-height: 178px;
226
+  text-align: center;
227
+}
228
+.avatar {
229
+  width: 178px;
230
+  height: 178px;
231
+  display: block;
232
+}
233
+</style>
234
+

+ 283
- 0
vue-element-admin/src/views/case/servicecase/index.vue 查看文件

@@ -0,0 +1,283 @@
1
+<template>
2
+  <div class="root">
3
+    <el-form :inline="true" :model="listQuery" class="form-listQuery">
4
+      <!-- <el-form-item label="业务名称">
5
+        <el-input v-model="listQuery.serviceName" placeholder="业务名称" />
6
+      </el-form-item>
7
+      <el-form-item>
8
+        <el-button type="info" @click="clearListQuery">清空</el-button>
9
+        <el-button type="primary" @click="handleFilter">查询</el-button>
10
+      </el-form-item> -->
11
+    </el-form>
12
+    <div class="operation">
13
+      <div>
14
+        <el-button type="primary" @click="addServiceCase">新增案例类型</el-button>
15
+        <el-button type="danger" @click="deleteServiceCase">删除</el-button>
16
+      </div>
17
+    </div>
18
+    <el-table
19
+      v-loading="listLoading"
20
+      ref="multipleTable"
21
+      :data="serviceCaseList"
22
+      border
23
+      tooltip-effect="dark"
24
+      style="width: 100%; margin-top: 20px;"
25
+      @selection-change="handleSelectionChange">
26
+      <el-table-column type="selection" width="55" align="center"/>
27
+      <el-table-column label="类型名称" align="center">
28
+        <template slot-scope="scope">
29
+          <span>{{ scope.row.typeName }}</span>
30
+        </template>
31
+      </el-table-column>
32
+      <el-table-column label="排序" align="center">
33
+        <template slot-scope="scope">
34
+          <span>{{ scope.row.sort }}</span>
35
+        </template>
36
+      </el-table-column>
37
+      <el-table-column label="创建时间" align="center">
38
+        <template slot-scope="scope">
39
+          <span>{{ formatDate(scope.row.createTime) }}</span>
40
+        </template>
41
+      </el-table-column>
42
+    </el-table>
43
+    <div class="block">
44
+      <el-pagination
45
+        :current-page.sync="listQuery.pageNum"
46
+        :page-sizes="[10, 20, 50, 100]"
47
+        :page-size.sync="listQuery.pageSize"
48
+        :total="total"
49
+        layout="total, sizes, prev, pager, next, jumper"
50
+        @size-change="handleSizeChange"
51
+        @current-change="handleCurrentChange"/>
52
+    </div>
53
+  </div>
54
+</template>
55
+
56
+<script>
57
+import waves from '@/directive/waves' // Waves directive
58
+import { parseTime } from '@/utils'
59
+
60
+export default {
61
+  directives: { waves },
62
+  data() {
63
+    var _self = this
64
+    return {
65
+      events: {
66
+        click: (e) => {
67
+          // _self.postData.Coordinate = e.lnglat.lat + ',' + e.lnglat.lng
68
+          _self.detail.longitude = e.lnglat.lng
69
+          _self.detail.latitude = e.lnglat.lat
70
+        }
71
+      },
72
+      markers: [],
73
+      searchOption: {
74
+        city: '南京',
75
+        citylimit: false
76
+      },
77
+      serviceCaseList: [],
78
+      total: 0,
79
+      listLoading: true,
80
+      listQuery: {
81
+        pageNum: 1,
82
+        pageSize: 20,
83
+        typeName: undefined
84
+      },
85
+      ids: [], // id集合
86
+      tableKey: 0,
87
+      downloadLoading: false
88
+    }
89
+  },
90
+  created() {
91
+    this.getList()
92
+  },
93
+  methods: {
94
+    setCurrent(item) {
95
+      this.setDetail({ ...item })
96
+    },
97
+    getList() {
98
+      this.listLoading = true
99
+      this.$store.dispatch('servicecase/getServiceCaseList', this.listQuery).then((res) => {
100
+        console.log(res)
101
+        this.serviceCaseList = res.data.data.records
102
+        this.total = res.data.data.total
103
+        this.listLoading = false
104
+      }).catch(() => {
105
+        this.loading = false
106
+        console.log('get list error')
107
+      })
108
+    },
109
+    clearListQuery() {
110
+      this.listQuery.pageNum = 1
111
+      this.listQuery.pageSize = 20
112
+      this.listQuery.billId = undefined
113
+      this.listQuery.billName = undefined
114
+      this.listQuery.billExplain = undefined
115
+      this.getList()
116
+    },
117
+    getInfo(billId, billStatus) {
118
+      if (billStatus === '2') {
119
+        this.$router.push({ name: 'bill-edi', query: { id: billId }})
120
+      } else {
121
+        this.$router.push({ name: 'bill-info', query: { id: billId }})
122
+      }
123
+    },
124
+    addServiceCase() {
125
+      this.$router.push({ name: 'servicecase-add' })
126
+    },
127
+    handleFilter() {
128
+      this.listQuery.pageNum = 1
129
+      this.getList()
130
+    },
131
+    handleModifyStatus(row, status) {
132
+      this.$message({
133
+        message: '操作成功',
134
+        type: 'success'
135
+      })
136
+      row.status = status
137
+    },
138
+    sortChange(data) {
139
+      const { prop, order } = data
140
+      if (prop === 'id') {
141
+        this.sortByID(order)
142
+      }
143
+    },
144
+    handleSizeChange(val) {
145
+      // console.log(`每页 ${val} 条`);
146
+      this.listQuery.pageSize = val
147
+      this.getList()
148
+    },
149
+    handleCurrentChange(val) {
150
+      // console.log(`当前页: ${val}`);
151
+      this.listQuery.pageNum = val
152
+      this.getList()
153
+    },
154
+    sortByID(order) {
155
+      if (order === 'ascending') {
156
+        this.listQuery.sort = '+id'
157
+      } else {
158
+        this.listQuery.sort = '-id'
159
+      }
160
+      this.handleFilter()
161
+    },
162
+    handleUpdate(row) {
163
+      this.setCurrent(row)
164
+      this.dialogStatus = 'update'
165
+      this.dialogFormVisible = true
166
+      this.$nextTick(() => {
167
+        this.$refs['dataForm'].clearValidate()
168
+      })
169
+      this.getEditCityList()
170
+      this.getEditDistrictList()
171
+    },
172
+    handleLook(id) {
173
+      this.$router.push({ name: 'transaction-info', params: { id: id }})
174
+    },
175
+    handleCreate() {
176
+      this.resetDetail()
177
+      this.dialogStatus = 'create'
178
+      this.dialogFormVisible = true
179
+      this.$nextTick(() => {
180
+        this.$refs['dataForm'].clearValidate()
181
+      })
182
+    },
183
+    handleDelete(row) {
184
+      this.$notify({
185
+        title: '成功',
186
+        message: '删除成功',
187
+        type: 'success',
188
+        duration: 2000
189
+      })
190
+      const index = this.list.indexOf(row)
191
+      this.list.splice(index, 1)
192
+    },
193
+    handleDownload() {
194
+      this.downloadLoading = true
195
+      import('@/vendor/Export2Excel').then(excel => {
196
+        const tHeader = ['timestamp', 'title', 'type', 'importance', 'status']
197
+        const filterVal = ['timestamp', 'title', 'type', 'importance', 'status']
198
+        const data = this.formatJson(filterVal, this.list)
199
+        excel.export_json_to_excel({
200
+          header: tHeader,
201
+          data,
202
+          filename: 'table-list'
203
+        })
204
+        this.downloadLoading = false
205
+      })
206
+    },
207
+    padDate(value) {
208
+      value = value < 10 ? '0' + value : value
209
+      return value
210
+    },
211
+    formatDate(val) {
212
+      if (val === null) {
213
+        return ''
214
+      }
215
+      var value = new Date(val)
216
+      var year = value.getFullYear()
217
+      var month = this.padDate(value.getMonth() + 1)
218
+      var day = this.padDate(value.getDate())
219
+      var hour = this.padDate(value.getHours())
220
+      var minutes = this.padDate(value.getMinutes())
221
+      var seconds = this.padDate(value.getSeconds())
222
+      return year + '-' + month + '-' + day + ' ' + hour + ':' + minutes + ':' + seconds
223
+    },
224
+    formatJson(filterVal, jsonData) {
225
+      return jsonData.map(v => filterVal.map(j => {
226
+        if (j === 'timestamp') {
227
+          return parseTime(v[j])
228
+        } else {
229
+          return v[j]
230
+        }
231
+      }))
232
+    },
233
+    deleteServiceCase() { // 删除
234
+      if (this.ids.length <= 0) {
235
+        this.$message.error('请至少选择一项')
236
+        return
237
+      }
238
+      this.$store.dispatch('servicecase/deleteServiceCase', this.ids).then(res => {
239
+        const resCode = res.data.code
240
+        if (resCode === '0') {
241
+          this.$message.success('删除成功')
242
+          this.getList()
243
+          return
244
+        }
245
+        this.$message.error(res.data.message)
246
+      }).catch(() => {
247
+        console.log('DeleteBillBeach error')
248
+      })
249
+    },
250
+    handleSelectionChange(val) { // 选择
251
+      console.log(val)
252
+      this.ids = []
253
+
254
+      val.map((item, index) => {
255
+        console.log(item, index)
256
+        this.ids.push(item.id)
257
+      })
258
+    }
259
+  }
260
+}
261
+</script>
262
+
263
+<style scoped>
264
+.root{
265
+  display: flex;
266
+  flex-flow: column;
267
+}
268
+.form-listQuery{
269
+  margin-top: 20px;
270
+  margin-left: 30px;
271
+}
272
+.operation{
273
+  display: flex;
274
+  justify-content: space-between;
275
+  margin-left: 20px;
276
+  margin-right: 20px;
277
+}
278
+.block{
279
+  display: flex;
280
+  justify-content: flex-end;
281
+  margin-top: 10px;
282
+}
283
+</style>