瀏覽代碼

批量上传

傅行帆 6 年之前
父節點
當前提交
2b0a5ae5b1

+ 6
- 0
CODE/smart-community/community-common/src/main/java/com/community/commom/constant/Constant.java 查看文件

@@ -167,4 +167,10 @@ public class Constant {
167 167
      * 活动
168 168
      */
169 169
     public static final String MESSAGE_TYPE_ACTIVITY = "8";
170
+    
171
+    /**
172
+     * excel后缀
173
+     */
174
+    public static final String SUFFIX_2003 = ".xls";
175
+    public static final String SUFFIX_2007 = ".xlsx";
170 176
 }

+ 17
- 0
CODE/smart-community/property-api/pom.xml 查看文件

@@ -39,6 +39,23 @@
39 39
 			<artifactId>spring-cloud-starter-openfeign</artifactId>
40 40
 		</dependency>
41 41
 
42
+		<!--解析Excel-->
43
+		<dependency>
44
+			<groupId>org.apache.poi</groupId>
45
+			<artifactId>poi</artifactId>
46
+			<version>3.14</version>
47
+		</dependency>
48
+		<dependency>
49
+			<groupId>org.apache.poi</groupId>
50
+			<artifactId>poi-ooxml</artifactId>
51
+			<version>3.14</version>
52
+		</dependency>
53
+		<dependency>
54
+			<groupId>org.apache.poi</groupId>
55
+			<artifactId>poi-ooxml-schemas</artifactId>
56
+			<version>3.14</version>
57
+		</dependency>
58
+
42 59
 		<dependency>
43 60
 			<groupId>io.springfox</groupId>
44 61
 			<artifactId>springfox-swagger2</artifactId>

+ 3
- 3
CODE/smart-community/property-api/src/main/java/com/community/huiju/common/base/BaseController.java 查看文件

@@ -11,8 +11,8 @@ import javax.servlet.http.HttpSession;
11 11
  */
12 12
 public class BaseController {
13 13
 
14
-    protected UserElement getUserElement(HttpSession session){
15
-        session.getAttribute(Constant.)
16
-    }
14
+    //protected UserElement getUserElement(HttpSession session){
15
+    //    session.getAttribute(Constant.)
16
+    //}
17 17
 
18 18
 }

+ 12
- 0
CODE/smart-community/property-api/src/main/java/com/community/huiju/controller/BuildingOwnerInfoController.java 查看文件

@@ -10,12 +10,16 @@ import io.swagger.annotations.ApiImplicitParam;
10 10
 import io.swagger.annotations.ApiImplicitParams;
11 11
 import io.swagger.annotations.ApiOperation;
12 12
 import org.springframework.beans.factory.annotation.Autowired;
13
+import org.springframework.web.bind.annotation.PostMapping;
13 14
 import org.springframework.web.bind.annotation.RequestBody;
14 15
 import org.springframework.web.bind.annotation.RequestMapping;
15 16
 import org.springframework.web.bind.annotation.RequestMethod;
17
+import org.springframework.web.bind.annotation.RequestParam;
16 18
 import org.springframework.web.bind.annotation.RestController;
19
+import org.springframework.web.multipart.MultipartFile;
17 20
 
18 21
 import java.util.List;
22
+import java.util.Map;
19 23
 
20 24
 /**
21 25
  * <p>
@@ -88,5 +92,13 @@ public class BuildingOwnerInfoController extends BaseController {
88 92
         responseBean = iBuildingOwnerInfoService.deleteByIdDatch(ids);
89 93
         return responseBean;
90 94
     }
95
+    
96
+    @ApiOperation(value = "上传楼栋信息接口", notes = "上传楼栋信息接口")
97
+    @PostMapping(value = "/building/uploadExcel", consumes = "multipart/*", headers = "content-type=multipart/form-data")
98
+    public ResponseBean uploadExcel(@RequestParam("file") MultipartFile file) {
99
+        ResponseBean responseBean = new ResponseBean();
100
+        responseBean = iBuildingOwnerInfoService.getExcelData(file);
101
+        return responseBean;
102
+    }
91 103
 
92 104
 }

+ 9
- 1
CODE/smart-community/property-api/src/main/java/com/community/huiju/service/IBuildingOwnerInfoService.java 查看文件

@@ -3,8 +3,10 @@ package com.community.huiju.service;
3 3
 import com.baomidou.mybatisplus.extension.service.IService;
4 4
 import com.community.commom.mode.ResponseBean;
5 5
 import com.community.huiju.model.BuildingOwnerInfo;
6
+import org.springframework.web.multipart.MultipartFile;
6 7
 
7 8
 import java.util.List;
9
+import java.util.Map;
8 10
 
9 11
 /**
10 12
  * <p>
@@ -43,5 +45,11 @@ public interface IBuildingOwnerInfoService extends IService<BuildingOwnerInfo> {
43 45
      * @return
44 46
      */
45 47
     ResponseBean deleteByIdDatch(List<Integer> ids);
46
-
48
+    
49
+    /**
50
+     * 根据excel获取相关信息
51
+     * @param file
52
+     * @return
53
+     */
54
+    ResponseBean getExcelData(MultipartFile file);
47 55
 }

+ 106
- 1
CODE/smart-community/property-api/src/main/java/com/community/huiju/service/impl/BuildingOwnerInfoServiceImpl.java 查看文件

@@ -7,20 +7,36 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
7 7
 import com.baomidou.mybatisplus.core.metadata.IPage;
8 8
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
9 9
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
10
+import com.community.commom.constant.Constant;
10 11
 import com.community.commom.mode.ResponseBean;
12
+import com.community.commom.utils.AccountValidatorUtil;
11 13
 import com.community.commom.utils.BeanTools;
14
+import com.community.commom.utils.HttpClientUtils;
12 15
 import com.community.huiju.dao.BuildingOwnerInfoMapper;
13 16
 import com.community.huiju.model.BuildingOwnerInfo;
14 17
 import com.community.huiju.service.IBuildingOwnerInfoService;
15 18
 import com.google.common.collect.Lists;
16 19
 import com.google.common.collect.Maps;
20
+import com.sun.org.apache.xerces.internal.xs.datatypes.ObjectList;
21
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
22
+import org.apache.poi.ss.usermodel.Cell;
23
+import org.apache.poi.ss.usermodel.Row;
24
+import org.apache.poi.ss.usermodel.Sheet;
25
+import org.apache.poi.ss.usermodel.Workbook;
26
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
27
+import org.slf4j.Logger;
28
+import org.slf4j.LoggerFactory;
17 29
 import org.springframework.beans.factory.annotation.Autowired;
18 30
 import org.springframework.stereotype.Service;
19 31
 import org.springframework.transaction.annotation.Transactional;
32
+import org.springframework.web.multipart.MultipartFile;
20 33
 
21 34
 import java.time.LocalDateTime;
35
+import java.util.ArrayList;
36
+import java.util.HashMap;
22 37
 import java.util.List;
23 38
 import java.util.Map;
39
+import java.util.regex.Pattern;
24 40
 
25 41
 /**
26 42
  * <p>
@@ -35,7 +51,9 @@ public class BuildingOwnerInfoServiceImpl extends ServiceImpl<BuildingOwnerInfoM
35 51
 
36 52
     @Autowired
37 53
     private BuildingOwnerInfoMapper buildingOwnerInfoMapper;
38
-
54
+    
55
+    public static final Logger logger = LoggerFactory.getLogger(BuildingOwnerInfoServiceImpl.class);
56
+    
39 57
     @Override
40 58
     public ResponseBean listQuery(String parameter) {
41 59
 
@@ -139,4 +157,91 @@ public class BuildingOwnerInfoServiceImpl extends ServiceImpl<BuildingOwnerInfoM
139 157
         }
140 158
         return null;
141 159
     }
160
+    
161
+    /**
162
+     * 根据excel获取相关信息
163
+     *
164
+     * @param file
165
+     * @return
166
+     */
167
+    @Override
168
+    public ResponseBean getExcelData(MultipartFile file) {
169
+        ResponseBean responseBean = new ResponseBean();
170
+        List<BuildingOwnerInfo> list = new ArrayList<>();
171
+        if (file == null) {
172
+            responseBean.addError("对象不能为空");
173
+            return responseBean;
174
+        }
175
+        //获取文件的名字
176
+        String originalFilename = file.getOriginalFilename();
177
+        Workbook workbook = null;
178
+        try {
179
+            if (originalFilename.endsWith(Constant.SUFFIX_2003)) {
180
+                workbook = new HSSFWorkbook(file.getInputStream());
181
+            } else if (originalFilename.endsWith(Constant.SUFFIX_2007)) {
182
+                workbook = new XSSFWorkbook(file.getInputStream());
183
+            }
184
+        } catch (Exception e) {
185
+            logger.info(originalFilename);
186
+            e.printStackTrace();
187
+            responseBean.addError("格式错误");
188
+            return responseBean;
189
+        }
190
+        if (workbook == null) {
191
+            logger.info(originalFilename);
192
+            responseBean.addError("格式错误");
193
+            return responseBean;
194
+        } else {
195
+            List<String> temBuildingList = new ArrayList<String>();
196
+            List<String> temTelList = new ArrayList<String>();
197
+            //获取一个sheet也就是一个工作簿
198
+            Sheet sheet = workbook.getSheetAt(0);
199
+            int lastRowNum = sheet.getLastRowNum();
200
+            //从第一行开始第一行一般是标题
201
+            for (int j = 3; j <= lastRowNum; j++) {
202
+                Row row = sheet.getRow(j);
203
+                BuildingOwnerInfo buildingOwnerInfo = new BuildingOwnerInfo();
204
+                String building = row.getCell(0).getStringCellValue();
205
+                String unit = row.getCell(1).getStringCellValue();
206
+                String level = row.getCell(2).getStringCellValue();
207
+                String roomNo = row.getCell(3).getStringCellValue();
208
+                String ownerName = row.getCell(4).getStringCellValue();
209
+                String ownerTel = row.getCell(5).getStringCellValue();
210
+                //校验手机号码
211
+                if (!AccountValidatorUtil.isPhone(ownerTel)){
212
+                    responseBean.addError("请输入正确手机号:" + ownerTel);
213
+                    return responseBean;
214
+                }
215
+                String buildingInfo = building + unit + level + roomNo;
216
+                if (temBuildingList.contains(buildingInfo)){
217
+                    logger.info("存在重复房源:{}",buildingInfo);
218
+                    responseBean.addError("存在重复房源:"+ buildingInfo);
219
+                    return responseBean;
220
+                }
221
+                if (temTelList.contains(ownerTel)){
222
+                    logger.info("存在重复手机号:{}",ownerTel);
223
+                    responseBean.addError("存在重复手机号:"+ ownerTel);
224
+                    return responseBean;
225
+                }
226
+                //把数据塞入temList校验是否有重复的数据
227
+                temBuildingList.add(buildingInfo);
228
+                temTelList.add(ownerTel);
229
+                //构建数据
230
+                buildingOwnerInfo.setBuilding(building);
231
+                buildingOwnerInfo.setUnit(unit);
232
+                buildingOwnerInfo.setLevel(level);
233
+                buildingOwnerInfo.setRoomNo(roomNo);
234
+                buildingOwnerInfo.setOwnerName(ownerName);
235
+                buildingOwnerInfo.setOwnerTel(ownerTel);
236
+                list.add(buildingOwnerInfo);
237
+            }
238
+        }
239
+        //构建分页
240
+        Map<String,Object> data = new HashMap<String, Object>();
241
+        data.put("list",list);
242
+        data.put("total",list.size());
243
+        
244
+        responseBean.addSuccess(data);
245
+        return responseBean;
246
+    }
142 247
 }

+ 1
- 1
CODE/smart-community/property-api/src/main/resources/bootstrap.yml 查看文件

@@ -2,7 +2,7 @@ server:
2 2
   port: 8084
3 3
 spring:
4 4
   application:
5
-    name: eureka-client2
5
+    name: property-api
6 6
   cloud:
7 7
     config:
8 8
       name: application

+ 3
- 2
VUECODE/smart-property-manage/package.json 查看文件

@@ -17,16 +17,17 @@
17 17
     "axios": "0.18.0",
18 18
     "element-ui": "2.4.6",
19 19
     "file-saver": "^2.0.0-rc.4",
20
+    "jquery": "^2.2.3",
20 21
     "js-cookie": "2.2.0",
21 22
     "normalize.css": "7.0.0",
22 23
     "nprogress": "0.2.0",
24
+    "qs": "^6.6.0",
23 25
     "vue": "2.5.17",
24 26
     "vue-amap": "^0.5.8",
25 27
     "vue-router": "3.0.1",
26 28
     "vuex": "3.0.1",
27 29
     "wangeditor": "^3.1.1",
28
-    "xlsx": "^0.14.0",
29
-    "jquery": "^2.2.3"
30
+    "xlsx": "^0.14.0"
30 31
   },
31 32
   "devDependencies": {
32 33
     "@antv/data-set": "^0.10.1",

+ 16
- 0
VUECODE/smart-property-manage/src/api/batchImport.js 查看文件

@@ -0,0 +1,16 @@
1
+import request from '@/utils/ajax'
2
+
3
+export function uploadBuildingExcel(query) {
4
+  return new Promise((resolve, reject) => {
5
+    request({
6
+      url: '/building/uploadExcel',
7
+      method: 'post',
8
+      data: query
9
+    }).then((res) => {
10
+      console.log('out')
11
+      resolve(res)
12
+    }).catch((err) => {
13
+      console.log(err)
14
+    })
15
+  })
16
+}

+ 3
- 1
VUECODE/smart-property-manage/src/store/index.js 查看文件

@@ -5,6 +5,7 @@ import user from './modules/user'
5 5
 import banner from './modules/banner'
6 6
 import community from './modules/community'
7 7
 import trunkIndex from './modules/trunkIndex'
8
+import batchImport from './modules/batchImport'
8 9
 import getters from './getters'
9 10
 
10 11
 Vue.use(Vuex)
@@ -15,7 +16,8 @@ const store = new Vuex.Store({
15 16
     user,
16 17
     community,
17 18
     banner,
18
-    trunkIndex
19
+    trunkIndex,
20
+    batchImport
19 21
   },
20 22
   getters
21 23
 })

+ 38
- 0
VUECODE/smart-property-manage/src/store/modules/batchImport.js 查看文件

@@ -0,0 +1,38 @@
1
+import { uploadBuildingExcel } from '@/api/batchImport'
2
+
3
+const batchImport = {
4
+  namespaced: true,
5
+  state: {
6
+    total: '',
7
+    temlist: []
8
+  },
9
+
10
+  mutations: {
11
+    SET_LIST: (state, list) => {
12
+      state.temlist = list
13
+    },
14
+    SET_TOTAL: (state, total) => {
15
+      state.total = total
16
+    }
17
+  },
18
+
19
+  actions: {
20
+    UploadBuildingExcel({ commit }, file) {
21
+      console.log(file)
22
+      return new Promise((resolve, reject) => {
23
+        uploadBuildingExcel({ file: file.raw }).then(response => {
24
+          if (response.code === '0') {
25
+            const data = response.data
26
+            commit('SET_LIST', data.list)
27
+            commit('SET_TOTAL', data.total)
28
+          }
29
+          resolve(response)
30
+        }).catch(error => {
31
+          reject(error)
32
+        })
33
+      })
34
+    }
35
+  }
36
+}
37
+
38
+export default batchImport

+ 75
- 0
VUECODE/smart-property-manage/src/utils/ajax.js 查看文件

@@ -0,0 +1,75 @@
1
+import axios from 'axios'
2
+import qs from 'qs'
3
+import { getToken } from '@/utils/auth'
4
+
5
+const Axios = axios.create({
6
+  baseURL: process.env.BASE_API, // api 的 base_url
7
+  timeout: 60000,
8
+  responseType: 'json',
9
+  withCredentials: true,
10
+  queryData: {},
11
+  urlData: {},
12
+  headerData: '',
13
+  headers: {
14
+    'Content-Type': 'multipart/form-data'
15
+  }
16
+})
17
+
18
+Axios.interceptors.request.use((config) => {
19
+  config.headers['Content-Type'] = config.headerData ? config.headerData : 'multipart/form-data'
20
+  config.headers['X-Auth-Token'] = getToken()
21
+  // config.urlData = { ...config.urlData,  }
22
+  // 处理请求data,若为get请求,拼到url后面,若为post请求,直接添加到body中
23
+  let urlData = qs.stringify(config.urlData)
24
+  let queryData = qs.stringify(config.queryData)
25
+  // 判断是通过斜杠传参
26
+  if (config.url.indexOf(':') > -1) {
27
+    if (typeof config.urlData === 'object') {
28
+      config.url = replaceURLParams(config.url, config.urlData)
29
+    } else {
30
+      config.url = config.url.slice(0, config.url.indexOf(':')) + urlData
31
+    }
32
+  }
33
+  if (queryData) {
34
+    config.url += '?' + queryData
35
+  }
36
+  if (config.headerData) {
37
+    return config
38
+  } else {
39
+    let fm = new FormData()
40
+    for (let k in config.data) {
41
+      if (Array.isArray(config.data[k])) {
42
+        config.data[k].forEach((v) => {
43
+          fm.append(k, v)
44
+        })
45
+      } else {
46
+        fm.append(k, config.data[k])
47
+      }
48
+    }
49
+    config.data = fm
50
+    return config
51
+  }
52
+}, (error) => {
53
+  console.log(error)
54
+})
55
+
56
+const ajax = (...args) => {
57
+  return new Promise((resolve, reject) => {
58
+    Axios(...args).then(({ data }) => {
59
+      resolve(data)
60
+    }).catch(() => {
61
+      console.log('error')
62
+    })
63
+  })
64
+}
65
+
66
+export default ajax
67
+
68
+export function replaceURLParams (url, params) {
69
+  const args = { ...(params || {}), org: 'MQ' }
70
+
71
+  return Object.keys(args).reduce((acc, k) => { // 此方法对每个元素进行处理
72
+    const re = new RegExp(`:${k}(?!w)`, 'i')
73
+    return acc.replace(re, args[k])
74
+  }, url)
75
+}

+ 82
- 40
VUECODE/smart-property-manage/src/views/building/batch/batchImport.vue 查看文件

@@ -3,92 +3,134 @@
3 3
   <div class="root">
4 4
     <el-form :inline="true" :model="listQuery" class="form-listQuery">
5 5
       <el-form-item>
6
-        <el-upload
7
-          class="upload-demo"
8
-          action="https://jsonplaceholder.typicode.com/posts/"
9
-          :on-preview="handlePreview"
10
-          :on-remove="handleRemove"
11
-          :before-remove="beforeRemove"
12
-          multiple
13
-          :limit="3"
14
-          :on-exceed="handleExceed"
15
-          :file-list="fileList">
6
+        <el-upload class="upload-demo" action="" :on-preview="handlePreview" :on-change="handleChange" :before-upload="beforeUpload" multiple :limit="1" :on-exceed="handleExceed" :file-list="fileList">
16 7
           <el-button style="margin-left: 10px;" size="large" type="primary">下载模板</el-button>
17 8
           <el-button slot="trigger" size="large" type="primary">选取文件并预览</el-button>
18 9
           <el-button style="margin-left: 10px;" size="large" type="success" @click="submitUpload">提交</el-button>
19 10
         </el-upload>
20 11
       </el-form-item>
21 12
     </el-form>
22
-    <el-table
23
-      ref="multipleTable"
24
-      :data="tableData3"
25
-      border
26
-      tooltip-effect="dark"
27
-      style="width: 100%; margin-top: 20px;"
28
-      @selection-change="handleSelectionChange">
13
+    <el-table ref="multipleTable" :data="list" border tooltip-effect="dark" style="width: 100%; margin-top: 20px;" @selection-change="handleSelectionChange">
29 14
       <el-table-column label="栋">
30
-        <template slot-scope="scope">{{ scope.row.date }}</template>
15
+        <template slot-scope="scope">{{ scope.row.building }}</template>
16
+      </el-table-column>
17
+      <el-table-column label="单元">
18
+        <template slot-scope="scope">{{ scope.row.unit }}</template>
19
+      </el-table-column>
20
+      <el-table-column label="楼层">
21
+        <template slot-scope="scope">{{ scope.row.level }}</template>
22
+      </el-table-column>
23
+      <el-table-column label="户号">
24
+        <template slot-scope="scope">{{ scope.row.roomNo }}</template>
25
+      </el-table-column>
26
+      <el-table-column label="业主姓名">
27
+        <template slot-scope="scope">{{ scope.row.ownerName }}</template>
28
+      </el-table-column>
29
+      <el-table-column label="手机号码">
30
+        <template slot-scope="scope">{{ scope.row.ownerTel }}</template>
31 31
       </el-table-column>
32
-      <el-table-column prop="name" label="单元"/>
33
-      <el-table-column prop="address" label="楼层"/>
34
-      <el-table-column prop="address" label="户号"/>
35
-      <el-table-column prop="address" label="业主姓名"/>
36
-      <el-table-column prop="address" label="手机号码"/>
37 32
     </el-table>
38 33
     <div class="block">
39
-      <el-pagination
40
-        :current-page="listQuery.pageNum"
41
-        :page-sizes="[5, 10, 20, 30]"
42
-        :page-size="listQuery.pageSize"
43
-        :total="40"
44
-        layout="total, sizes, prev, pager, next, jumper"
45
-        @size-change="handleSizeChange"
46
-        @current-change="handleCurrentChange"/>
34
+      <el-pagination :current-page="listQuery.pageNum" :page-sizes="[5, 10, 20, 30]" :page-size="listQuery.pageSize" :total="total" layout="total, sizes, prev, pager, next, jumper" @size-change="handleSizeChange" @current-change="handleCurrentChange"/>
47 35
     </div>
48 36
   </div>
49 37
 </template>
50 38
 
51 39
 <script>
40
+import { mapState, mapActions, mapMutations } from "vuex";
52 41
 export default {
42
+  computed: {
43
+    ...mapState("batchImport", {
44
+      temlist: s => s.temlist,
45
+      total: s => s.total
46
+    })
47
+  },
53 48
   data() {
54 49
     return {
55 50
       listQuery: {
56 51
         pageNum: 1,
57 52
         pageSize: 20
58 53
       },
54
+      list: [],
59 55
       currentPage4: 4
60
-    }
56
+    };
57
+  },
58
+  created() {
59
+    console.log(mapActions);
61 60
   },
62 61
   methods: {
62
+    ...mapActions("batchImport", ["UploadBuildingExcel"]),
63 63
     handleSizeChange(val) {
64
-      console.log(`每页 ${val} 条`)
64
+      this.listQuery.pageSize = val;
65
+      this.getList();
66
+      console.log(`每页 ${val} 条`);
65 67
     },
66 68
     handleCurrentChange(val) {
67
-      console.log(`当前页: ${val}`)
69
+      this.listQuery.pageNum = val;
70
+      this.getList();
71
+      console.log(`当前页: ${val}`);
68 72
     },
69 73
     dialogBatchImport() {
70
-      this.$router.push({ name: 'batch-import' })
74
+      this.$router.push({ name: "batch-import" });
75
+    },
76
+    beforeUpload(file) {
77
+      this.files = file;
78
+      const extension = file.name.split(".")[1] === "xls";
79
+      const extension2 = file.name.split(".")[1] === "xlsx";
80
+      if (!extension && !extension2) {
81
+        this.$message.warning("上传文件只能是 xls、xlsx格式!");
82
+        return;
83
+      }
84
+      return false; // 返回false不会自动上传
85
+    },
86
+    handleChange(file) {
87
+      const fileName = file.name;
88
+      if (fileName == "") {
89
+        this.$message.warning("请选择要上传的文件!");
90
+        return false;
91
+      }
92
+      this.UploadBuildingExcel(file)
93
+        .then(response => {
94
+          console.log("success");
95
+          if (response.code === "1") {
96
+            this.$message.warning(response.message);
97
+          }
98
+          if (response.code === "0") {
99
+            this.$message.success("上传成功");
100
+            this.getList();
101
+          }
102
+        })
103
+        .catch(() => {
104
+          console.log("upload error");
105
+        });
106
+    },
107
+    getList() {
108
+      this.list = this.temlist.slice(
109
+        (this.listQuery.pageNum - 1) * this.listQuery.pageSize,
110
+        this.listQuery.pageNum * this.listQuery.pageSize
111
+      );
112
+      console.log(this.list);
71 113
     }
72 114
   }
73
-}
115
+};
74 116
 </script>
75 117
 
76 118
 <style scoped>
77
-.root{
119
+.root {
78 120
   display: flex;
79 121
   flex-flow: column;
80 122
 }
81
-.form-listQuery{
123
+.form-listQuery {
82 124
   margin-top: 20px;
83 125
   margin-left: 30px;
84 126
 }
85
-.operation{
127
+.operation {
86 128
   display: flex;
87 129
   justify-content: space-between;
88 130
   margin-left: 20px;
89 131
   margin-right: 20px;
90 132
 }
91
-.block{
133
+.block {
92 134
   display: flex;
93 135
   justify-content: flex-end;
94 136
   margin-top: 10px;