瀏覽代碼

初始化网格管理平台

lianghq 5 年之前
父節點
當前提交
98b5a4637a

+ 3 - 2
.eslintrc.js

@@ -1,7 +1,8 @@
 module.exports = {
   root: true,
   env: {
-    node: true
+    node: true,
+    jquery:true
   },
   'extends': [
     'plugin:vue/essential',
@@ -14,4 +15,4 @@ module.exports = {
   parserOptions: {
     parser: 'babel-eslint'
   }
-}
+}

+ 4 - 0
package.json

@@ -11,15 +11,18 @@
     "test:e2e": "vue-cli-service test:e2e"
   },
   "dependencies": {
+    "@amap/amap-vue": "^2.0.11",
     "avue-plugin-ueditor": "^0.1.4",
     "axios": "^0.18.0",
     "babel-polyfill": "^6.26.0",
     "classlist-polyfill": "^1.2.0",
     "crypto-js": "^4.0.0",
     "element-ui": "^2.13.2",
+    "jquery": "^3.6.0",
     "js-base64": "^2.5.1",
     "js-cookie": "^2.2.0",
     "js-md5": "^0.7.3",
+    "layui-layer": "^1.0.9",
     "mockjs": "^1.0.1-beta3",
     "node-gyp": "^5.0.6",
     "nprogress": "^0.2.0",
@@ -28,6 +31,7 @@
     "vue": "^2.6.10",
     "vue-axios": "^2.1.2",
     "vue-i18n": "^8.7.0",
+    "vue-layer": "^1.2.1",
     "vue-router": "^3.0.1",
     "vuex": "^3.1.1"
   },

+ 10 - 0
src/api/base/region.js

@@ -23,6 +23,16 @@ export const getLazyTree = (parentCode, params) => {
   })
 }
 
+export const select = (code) => {
+  return request({
+    url: '/api/blade-system/region/select',
+    method: 'get',
+    params: {
+     code
+    }
+  })
+}
+
 export const getDetail = (code) => {
   return request({
     url: '/api/blade-system/region/detail',

+ 50 - 0
src/api/community/agency.js

@@ -0,0 +1,50 @@
+import request from '@/router/axios';
+
+export const getList = (current, size, params) => {
+  return request({
+    url: '/api/community/agency/list',
+    method: 'get',
+    params: {
+      ...params,
+      current,
+      size,
+    }
+  })
+}
+
+export const getDetail = (id) => {
+  return request({
+    url: '/api/community/agency/detail',
+    method: 'get',
+    params: {
+      id
+    }
+  })
+}
+
+export const remove = (ids) => {
+  return request({
+    url: '/api/community/agency/remove',
+    method: 'post',
+    params: {
+      ids,
+    }
+  })
+}
+
+export const add = (row) => {
+  return request({
+    url: '/api/community/agency/submit',
+    method: 'post',
+    data: row
+  })
+}
+
+export const update = (row) => {
+  return request({
+    url: '/api/community/agency/submit',
+    method: 'post',
+    data: row
+  })
+}
+

+ 50 - 0
src/api/community/community.js

@@ -0,0 +1,50 @@
+import request from '@/router/axios';
+
+export const getList = (current, size, params) => {
+  return request({
+    url: '/api/community/d-community/list',
+    method: 'get',
+    params: {
+      ...params,
+      current,
+      size,
+    }
+  })
+}
+
+export const getDetail = (id) => {
+  return request({
+    url: '/api/community/d-community/detail',
+    method: 'get',
+    params: {
+      id
+    }
+  })
+}
+
+export const remove = (ids) => {
+  return request({
+    url: '/api/community/d-community/remove',
+    method: 'post',
+    params: {
+      ids,
+    }
+  })
+}
+
+export const add = (row) => {
+  return request({
+    url: '/api/community/d-community/submit',
+    method: 'post',
+    data: row
+  })
+}
+
+export const update = (row) => {
+  return request({
+    url: '/api/community/d-community/submit',
+    method: 'post',
+    data: row
+  })
+}
+

+ 50 - 0
src/api/community/enterprise.js

@@ -0,0 +1,50 @@
+import request from '@/router/axios';
+
+export const getList = (current, size, params) => {
+  return request({
+    url: '/api/community/enterprise/list',
+    method: 'get',
+    params: {
+      ...params,
+      current,
+      size,
+    }
+  })
+}
+
+export const getDetail = (id) => {
+  return request({
+    url: '/api/community/enterprise/detail',
+    method: 'get',
+    params: {
+      id
+    }
+  })
+}
+
+export const remove = (ids) => {
+  return request({
+    url: '/api/community/enterprise/remove',
+    method: 'post',
+    params: {
+      ids,
+    }
+  })
+}
+
+export const add = (row) => {
+  return request({
+    url: '/api/community/enterprise/submit',
+    method: 'post',
+    data: row
+  })
+}
+
+export const update = (row) => {
+  return request({
+    url: '/api/community/enterprise/submit',
+    method: 'post',
+    data: row
+  })
+}
+

+ 50 - 0
src/api/community/room.js

@@ -0,0 +1,50 @@
+import request from '@/router/axios';
+
+export const getList = (current, size, params) => {
+  return request({
+    url: '/api/community/room/list',
+    method: 'get',
+    params: {
+      ...params,
+      current,
+      size,
+    }
+  })
+}
+
+export const getDetail = (id) => {
+  return request({
+    url: '/api/community/room/detail',
+    method: 'get',
+    params: {
+      id
+    }
+  })
+}
+
+export const remove = (ids) => {
+  return request({
+    url: '/api/community/room/remove',
+    method: 'post',
+    params: {
+      ids,
+    }
+  })
+}
+
+export const add = (row) => {
+  return request({
+    url: '/api/community/room/submit',
+    method: 'post',
+    data: row
+  })
+}
+
+export const update = (row) => {
+  return request({
+    url: '/api/community/room/submit',
+    method: 'post',
+    data: row
+  })
+}
+

+ 50 - 0
src/api/community/unit.js

@@ -0,0 +1,50 @@
+import request from '@/router/axios';
+
+export const getList = (current, size, params) => {
+  return request({
+    url: '/api/community/unit/list',
+    method: 'get',
+    params: {
+      ...params,
+      current,
+      size,
+    }
+  })
+}
+
+export const getDetail = (id) => {
+  return request({
+    url: '/api/community/unit/detail',
+    method: 'get',
+    params: {
+      id
+    }
+  })
+}
+
+export const remove = (ids) => {
+  return request({
+    url: '/api/community/unit/remove',
+    method: 'post',
+    params: {
+      ids,
+    }
+  })
+}
+
+export const add = (row) => {
+  return request({
+    url: '/api/community/unit/submit',
+    method: 'post',
+    data: row
+  })
+}
+
+export const update = (row) => {
+  return request({
+    url: '/api/community/unit/submit',
+    method: 'post',
+    data: row
+  })
+}
+

+ 50 - 0
src/api/person/member.js

@@ -0,0 +1,50 @@
+import request from '@/router/axios';
+
+export const getList = (current, size, params) => {
+  return request({
+    url: '/api/person/member/list',
+    method: 'get',
+    params: {
+      ...params,
+      current,
+      size,
+    }
+  })
+}
+
+export const getDetail = (id) => {
+  return request({
+    url: '/api/person/member/detail',
+    method: 'get',
+    params: {
+      id
+    }
+  })
+}
+
+export const remove = (ids) => {
+  return request({
+    url: '/api/person/member/remove',
+    method: 'post',
+    params: {
+      ids,
+    }
+  })
+}
+
+export const add = (row) => {
+  return request({
+    url: '/api/person/member/submit',
+    method: 'post',
+    data: row
+  })
+}
+
+export const update = (row) => {
+  return request({
+    url: '/api/person/member/submit',
+    method: 'post',
+    data: row
+  })
+}
+

+ 50 - 0
src/api/person/wyappmember.js

@@ -0,0 +1,50 @@
+import request from '@/router/axios';
+
+export const getList = (current, size, params) => {
+  return request({
+    url: '/api/person/wyappmember/list',
+    method: 'get',
+    params: {
+      ...params,
+      current,
+      size,
+    }
+  })
+}
+
+export const getDetail = (id) => {
+  return request({
+    url: '/api/person/wyappmember/detail',
+    method: 'get',
+    params: {
+      id
+    }
+  })
+}
+
+export const remove = (ids) => {
+  return request({
+    url: '/api/person/wyappmember/remove',
+    method: 'post',
+    params: {
+      ids,
+    }
+  })
+}
+
+export const add = (row) => {
+  return request({
+    url: '/api/person/wyappmember/submit',
+    method: 'post',
+    data: row
+  })
+}
+
+export const update = (row) => {
+  return request({
+    url: '/api/person/wyappmember/submit',
+    method: 'post',
+    data: row
+  })
+}
+

+ 104 - 0
src/components/lazy-select/lazy-select.vue

@@ -0,0 +1,104 @@
+<template>
+  <el-select
+    placeholder="请选择"
+    filterable
+    :value="model"
+    remote=true
+    :remote-method="search"
+    @change="change"
+  >
+    <el-option
+      v-for="item in options"
+      :label="item[title]"
+      :value="item[code]"
+    >
+    </el-option>
+    <el-button v-if="buttonShow"  @click="loadMore" :loading="loading" type="text" style="width: 100%">加载更多</el-button>
+  </el-select>
+</template>
+
+<script>
+  import request from '@/router/axios';
+    export default {
+        name: "lazy-select",
+        props: {
+          dicUrl: {
+            type: "String",
+            default: ''
+          },
+          size: {
+            type: "Number",
+            default: 20
+          },
+          query: {
+            type: 'Object',
+            default: {}
+          },
+          title: {
+            type: 'String',
+            default: 'title'
+          },
+          code: {
+            type: 'String',
+            default: 'code'
+          },
+          model:{
+            type: 'String',
+            default: ''
+          }
+        },
+
+        data() {
+          return {
+            buttonShow: true,
+            loading: false,
+            options: [],
+            formData: {
+              pageIndex: 1,
+              pageSize: 20,
+            }
+          };
+        },
+        async mounted() {
+          this.formData.pageSize = this.size;
+          await this.getList(this.formData);
+        },
+        methods: {
+          search(data){
+            this.options = [];
+            this.query[this.title] = data;
+            this.getList(this.formData);
+          },
+          change(value){
+            let _this = this;
+            let data = this.options.filter(x => x[_this.code] === value);
+            this.model = data[0][this.title]
+            this.$emit('change',data[0]);
+          },
+          async loadMore() {
+            this.formData.pageIndex++;
+            this.loading = true;
+            await this.getList(this.formData);
+            this.loading = false;
+          },
+          async getList(formData) {
+            let res = await request({
+              url: this.dicUrl,
+              method: 'get',
+              params: {
+                ...this.query,
+                current:formData.pageIndex,
+                size: formData.pageSize,
+              }
+            });
+            this.buttonShow = res.data.data.records.length<20? false:true;
+
+            this.options = [...this.options, ...res.data.data.records];
+          }
+        }
+    }
+</script>
+
+<style scoped>
+
+</style>

+ 3 - 3
src/config/website.js

@@ -2,15 +2,15 @@
  * 全局配置文件
  */
 export default {
-  title: "saber",
+  title: "数字社区",
   logo: "S",
   key: 'saber',//配置主键,目前用于存储
-  indexTitle: 'Saber Admin',
+  indexTitle: '数字社区平台',
   clientId: 'saber', // 客户端id
   clientSecret: 'saber_secret', // 客户端密钥
   tenantMode: true, // 是否开启租户模式
   tenantId: "000000", // 管理组租户编号
-  captchaMode: true, // 是否开启验证码模式
+  captchaMode: false, // 是否开启验证码模式
   lockPage: '/lock',
   tokenTime: 3000,
   tokenHeader: 'Blade-Auth',

+ 54 - 0
src/main.js

@@ -10,6 +10,8 @@ import store from './store';
 import {loadStyle} from './util/util'
 import * as urls from '@/config/env';
 import Element from 'element-ui';
+import lazySelect from '@/components/lazy-select/lazy-select';
+import AmapVue from '@amap/amap-vue';
 import {
   iconfontUrl,
   iconfontVersion
@@ -22,6 +24,10 @@ import thirdRegister from './components/third-register/main';
 import avueUeditor from 'avue-plugin-ueditor';
 import website from '@/config/website';
 import crudCommon from '@/mixins/crud';
+import {select} from "./api/base/region";
+import $ from 'jquery'
+import layer from "layui-layer";
+
 // 注册全局crud驱动
 window.$crudCommon = crudCommon;
 // 加载Vue拓展
@@ -30,6 +36,14 @@ Vue.use(VueAxios, axios);
 Vue.use(Element, {
   i18n: (key, value) => i18n.t(key, value)
 });
+AmapVue.config.version = '2.0';
+AmapVue.config.key = 'cbb265e2a60bbbc04a52eec4eecdeb12';
+AmapVue.config.plugins = [
+  'AMap.ToolBar',
+  'AMap.MoveAnimation',
+  'AMap.MouseTool'
+];
+Vue.use(AmapVue);
 Vue.use(window.AVUE, {
   size: 'small',
   tableSize: 'small',
@@ -41,6 +55,7 @@ Vue.component('basicContainer', basicContainer);
 Vue.component('basicBlock', basicBlock);
 Vue.component('thirdRegister', thirdRegister);
 Vue.component('avueUeditor', avueUeditor);
+Vue.component('lazySelect', lazySelect);
 // 加载相关url地址
 Object.keys(urls).forEach(key => {
   Vue.prototype[key] = urls[key];
@@ -54,6 +69,45 @@ iconfontVersion.forEach(ele => {
 
 Vue.config.productionTip = false;
 
+Vue.prototype.regionFunction = (node, resolve)=> {
+  let stop_level = 3;
+  let level = node.level;
+  let data = node.data || {}
+  let code = data.code;
+  let list = [];
+  let callback = () => {
+    resolve((list || []).map(ele => {
+      return Object.assign(ele, {
+        leaf: level >= stop_level
+      })
+    }));
+  }
+  if (level == 0) {
+    select().then(res => {
+      list = res.data.data;
+      callback()
+    })
+  }
+  if (level == 1) {
+    select(code).then(res => {
+      list = res.data.data;
+      callback()
+    })
+  } else if (level == 2) {
+    select(code).then(res => {
+      list = res.data.data;
+      callback()
+    })
+  } else if (level == 3) {
+    select(code).then(res => {
+      list = res.data.data;
+      callback()
+    })
+  }else{
+    list=[]
+    callback()
+  }
+}
 new Vue({
   router,
   store,

+ 308 - 0
src/views/community/agency.vue

@@ -0,0 +1,308 @@
+<template>
+  <basic-container>
+    <avue-crud :option="option"
+               :table-loading="loading"
+               :data="data"
+               :page.sync="page"
+               :permission="permissionList"
+               :before-open="beforeOpen"
+               v-model="form"
+               ref="crud"
+               @row-update="rowUpdate"
+               @row-save="rowSave"
+               @row-del="rowDel"
+               @search-change="searchChange"
+               @search-reset="searchReset"
+               @selection-change="selectionChange"
+               @current-change="currentChange"
+               @size-change="sizeChange"
+               @refresh-change="refreshChange"
+               @on-load="onLoad">
+      <template slot="menuLeft">
+        <el-button type="danger"
+                   size="small"
+                   icon="el-icon-delete"
+                   plain
+                   v-if="permission.agency_delete"
+                   @click="handleDelete">删 除
+        </el-button>
+      </template>
+      <template  slot="principalIdSearch">
+        <lazy-select
+          dicUrl="/api/person/member/list"
+          code="id"
+          :model="query.memberName"
+          title="memberName"
+          @change="memberSelect"
+        ></lazy-select>
+      </template>
+    </avue-crud>
+
+  </basic-container>
+</template>
+
+<script>
+  import {getList, getDetail, add, update, remove} from "@/api/community/agency";
+  import {mapGetters} from "vuex";
+  import {getDetail as getRegionDetail} from "@/api/base/region";
+  export default {
+    data() {
+      return {
+        form: {},
+        query: {
+          memberName:''
+        },
+        loading: true,
+        page: {
+          pageSize: 10,
+          currentPage: 1,
+          total: 0
+        },
+        regionDic: {},
+        selectionList: [],
+        option: {
+          searchIcon:true,
+          searchIndex:2,
+          height:'auto',
+          align: 'center',
+          calcHeight: 30,
+          tip: false,
+          searchShow: true,
+          searchMenuSpan: 6,
+          border: false,
+          index: false,
+          viewBtn: true,
+          selection: true,
+          dialogClickModal: false,
+          column: [
+            {
+              label: "社区名称",
+              search: true,
+              prop: "agencyName",
+              rules: [{
+                required: true,
+                message: "请输入社区名称",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "负责人",
+              prop: "principalId",
+              component: 'lazySelect',
+              viewDisplay: false,
+              params: {
+                dicUrl: '/api/person/member/list',
+                code: 'id',
+                title: 'memberName',
+              },
+              searchslot: true,
+              event: {
+                change: (data)=>{
+                  this.form['principalId'] = data.id;
+                  this.form['memberName'] = data.memberName;
+                }
+              },
+              hide: true,
+              search: true,
+            },
+            {
+              label: "负责人",
+              prop: "memberName",
+              editDisplay: false,
+              addDisplay: false,
+            },
+
+            {
+              label: "行政区域",
+              prop: "regionName",
+              editDisplay: false,
+              addDisplay: false,
+              rules: [{
+                required: true,
+                message: "请选择所在行政区域",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "行政区域",
+              prop: "regionId",
+              search: true,
+              type: "tree",
+              hide: true,
+              viewDisplay: false,
+              filterable: true,
+              props: {
+                label: 'name',
+                value: 'code'
+              },
+              lazy: true,
+              treeLoad: this.regionFunction,
+              rules: [{
+                required: true,
+                message: "请选择所在行政区域",
+                trigger: "blur"
+              }]
+            }
+            ,
+
+            {
+              label: "详细地址",
+              prop: "address",
+            },
+            {
+              label: "备注",
+              prop: "remark"
+            },
+          ]
+        },
+        data: []
+      };
+    },
+    computed: {
+      ...mapGetters(["permission"]),
+      permissionList() {
+        return {
+          addBtn: this.vaildData(this.permission.agency_add, false),
+          viewBtn: this.vaildData(this.permission.agency_view, false),
+          delBtn: this.vaildData(this.permission.agency_delete, false),
+          editBtn: this.vaildData(this.permission.agency_edit, false)
+        };
+      },
+      ids() {
+        let ids = [];
+        this.selectionList.forEach(ele => {
+          ids.push(ele.id);
+        });
+        return ids.join(",");
+      }
+    },
+    methods: {
+      memberSelect(data){
+        console.log(data)
+        this.query['memberName'] = data.memberName;
+      },
+       async regionDetail(code){
+         let res = await getRegionDetail(code);
+         return res.data.data.name;
+      },
+      async rowSave(row, done, loading) {
+         row.regionName = await this.regionDetail(row.regionId);
+        add(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          window.console.log(error);
+        });
+      },
+      async rowUpdate(row, index, done, loading) {
+        row.regionName = await this.regionDetail(row.regionId);
+        update(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          console.log(error);
+        });
+      },
+      rowDel(row) {
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return remove(row.id);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+          });
+      },
+      handleDelete() {
+        if (this.selectionList.length === 0) {
+          this.$message.warning("请选择至少一条数据");
+          return;
+        }
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return remove(this.ids);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+            this.$refs.crud.toggleSelection();
+          });
+      },
+      beforeOpen(done, type) {
+        if (["edit", "view"].includes(type)) {
+          getDetail(this.form.id).then(res => {
+            this.form = res.data.data;
+          });
+        }
+        done();
+      },
+      searchReset() {
+        this.query = {
+          memberName:''
+        };
+        this.onLoad(this.page);
+      },
+      searchChange(params, done) {
+        params['memberName'] = this.query['memberName']
+        this.query = params;
+        this.page.currentPage = 1;
+        this.onLoad(this.page, params);
+        done();
+      },
+      selectionChange(list) {
+        this.selectionList = list;
+      },
+      selectionClear() {
+        this.selectionList = [];
+        this.$refs.crud.toggleSelection();
+      },
+      currentChange(currentPage){
+        this.page.currentPage = currentPage;
+      },
+      sizeChange(pageSize){
+        this.page.pageSize = pageSize;
+      },
+      refreshChange() {
+        this.onLoad(this.page, this.query);
+      },
+      onLoad(page, params = {}) {
+        this.loading = true;
+        this.regionDetail(11);
+        getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
+          const data = res.data.data;
+          this.page.total = data.total;
+          this.data = data.records;
+          this.loading = false;
+          this.selectionClear();
+        });
+      }
+    }
+  };
+</script>
+
+<style>
+</style>

+ 236 - 0
src/views/community/community.vue

@@ -0,0 +1,236 @@
+<template>
+  <basic-container>
+    <avue-crud :option="option"
+               :table-loading="loading"
+               :data="data"
+               :page.sync="page"
+               :permission="permissionList"
+               :before-open="beforeOpen"
+               v-model="form"
+               ref="crud"
+               @row-update="rowUpdate"
+               @row-save="rowSave"
+               @row-del="rowDel"
+               @search-change="searchChange"
+               @search-reset="searchReset"
+               @selection-change="selectionChange"
+               @current-change="currentChange"
+               @size-change="sizeChange"
+               @refresh-change="refreshChange"
+               @on-load="onLoad">
+      <template slot="menuLeft">
+        <el-button type="danger"
+                   size="small"
+                   icon="el-icon-delete"
+                   plain
+                   v-if="permission.community_delete"
+                   @click="handleDelete">删 除
+        </el-button>
+      </template>
+    </avue-crud>
+  </basic-container>
+</template>
+
+<script>
+  import {getList, getDetail, add, update, remove} from "@/api/community/community";
+  import {mapGetters} from "vuex";
+
+  export default {
+    data() {
+      return {
+        form: {},
+        query: {},
+        loading: true,
+        page: {
+          pageSize: 10,
+          currentPage: 1,
+          total: 0
+        },
+        selectionList: [],
+        option: {
+          height:'auto',
+          calcHeight: 30,
+          tip: false,
+          searchShow: true,
+          searchMenuSpan: 6,
+          border: true,
+          index: true,
+          viewBtn: true,
+          selection: true,
+          dialogClickModal: false,
+          column: [
+            {
+              label: "小区名称",
+              prop: "communityName",
+              rules: [{
+                required: true,
+                message: "请输入小区名称",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "负责人memberId",
+              prop: "principalId",
+              rules: [{
+                required: true,
+                message: "请输入负责人memberId",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "详细地址",
+              prop: "address",
+              rules: [{
+                required: true,
+                message: "请输入详细地址",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "社区id+",
+              prop: "agencyId",
+              rules: [{
+                required: true,
+                message: "请输入社区id+",
+                trigger: "blur"
+              }]
+            },
+          ]
+        },
+        data: []
+      };
+    },
+    computed: {
+      ...mapGetters(["permission"]),
+      permissionList() {
+        return {
+          addBtn: this.vaildData(this.permission.community_add, false),
+          viewBtn: this.vaildData(this.permission.community_view, false),
+          delBtn: this.vaildData(this.permission.community_delete, false),
+          editBtn: this.vaildData(this.permission.community_edit, false)
+        };
+      },
+      ids() {
+        let ids = [];
+        this.selectionList.forEach(ele => {
+          ids.push(ele.id);
+        });
+        return ids.join(",");
+      }
+    },
+    methods: {
+      rowSave(row, done, loading) {
+        add(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          window.console.log(error);
+        });
+      },
+      rowUpdate(row, index, done, loading) {
+        update(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          console.log(error);
+        });
+      },
+      rowDel(row) {
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return remove(row.id);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+          });
+      },
+      handleDelete() {
+        if (this.selectionList.length === 0) {
+          this.$message.warning("请选择至少一条数据");
+          return;
+        }
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return remove(this.ids);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+            this.$refs.crud.toggleSelection();
+          });
+      },
+      beforeOpen(done, type) {
+        if (["edit", "view"].includes(type)) {
+          getDetail(this.form.id).then(res => {
+            this.form = res.data.data;
+          });
+        }
+        done();
+      },
+      searchReset() {
+        this.query = {};
+        this.onLoad(this.page);
+      },
+      searchChange(params, done) {
+        this.query = params;
+        this.page.currentPage = 1;
+        this.onLoad(this.page, params);
+        done();
+      },
+      selectionChange(list) {
+        this.selectionList = list;
+      },
+      selectionClear() {
+        this.selectionList = [];
+        this.$refs.crud.toggleSelection();
+      },
+      currentChange(currentPage){
+        this.page.currentPage = currentPage;
+      },
+      sizeChange(pageSize){
+        this.page.pageSize = pageSize;
+      },
+      refreshChange() {
+        this.onLoad(this.page, this.query);
+      },
+      onLoad(page, params = {}) {
+        this.loading = true;
+        getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
+          const data = res.data.data;
+          this.page.total = data.total;
+          this.data = data.records;
+          this.loading = false;
+          this.selectionClear();
+        });
+      }
+    }
+  };
+</script>
+
+<style>
+</style>

+ 290 - 0
src/views/community/enterprise.vue

@@ -0,0 +1,290 @@
+<template>
+  <basic-container>
+    <avue-crud :option="option"
+               :table-loading="loading"
+               :data="data"
+               :page.sync="page"
+               :permission="permissionList"
+               :before-open="beforeOpen"
+               v-model="form"
+               ref="crud"
+               @row-update="rowUpdate"
+               @row-save="rowSave"
+               @row-del="rowDel"
+               @search-change="searchChange"
+               @search-reset="searchReset"
+               @selection-change="selectionChange"
+               @current-change="currentChange"
+               @size-change="sizeChange"
+               @refresh-change="refreshChange"
+               @on-load="onLoad">
+      <template slot="menuLeft">
+        <el-button type="danger"
+                   size="small"
+                   icon="el-icon-delete"
+                   plain
+                   v-if="permission.enterprise_delete"
+                   @click="handleDelete">删 除
+        </el-button>
+      </template>
+    </avue-crud>
+  </basic-container>
+</template>
+
+<script>
+  import {getList, getDetail, add, update, remove} from "@/api/community/enterprise";
+  import {mapGetters} from "vuex";
+
+  export default {
+    data() {
+      return {
+        form: {},
+        query: {},
+        loading: true,
+        page: {
+          pageSize: 10,
+          currentPage: 1,
+          total: 0
+        },
+        selectionList: [],
+        option: {
+          height:'auto',
+          calcHeight: 30,
+          tip: false,
+          searchShow: true,
+          searchMenuSpan: 6,
+          border: true,
+          index: true,
+          viewBtn: true,
+          selection: true,
+          dialogClickModal: false,
+          column: [
+            {
+              label: "企业名称",
+              prop: "enterpriseName",
+              rules: [{
+                required: true,
+                message: "请输入企业名称",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "企业类型",
+              prop: "enterpriseType",
+              rules: [{
+                required: true,
+                message: "请输入企业类型",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "所属园区",
+              prop: "agencyId",
+              rules: [{
+                required: true,
+                message: "请输入所属园区",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "法定代表人",
+              prop: "representative",
+              rules: [{
+                required: true,
+                message: "请输入法定代表人",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "成立时间",
+              prop: "setupDate",
+              rules: [{
+                required: true,
+                message: "请输入成立时间",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "营业执照",
+              prop: "businessLicense",
+              rules: [{
+                required: true,
+                message: "请输入营业执照",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "统一信用代码",
+              prop: "creditCode",
+              rules: [{
+                required: true,
+                message: "请输入统一信用代码",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "办公电话",
+              prop: "officialPhone",
+              rules: [{
+                required: true,
+                message: "请输入办公电话",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "注册地址",
+              prop: "registerAddress",
+              rules: [{
+                required: true,
+                message: "请输入注册地址",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "注册资金",
+              prop: "registerCount",
+              rules: [{
+                required: true,
+                message: "请输入注册资金",
+                trigger: "blur"
+              }]
+            },
+          ]
+        },
+        data: []
+      };
+    },
+    computed: {
+      ...mapGetters(["permission"]),
+      permissionList() {
+        return {
+          addBtn: this.vaildData(this.permission.enterprise_add, false),
+          viewBtn: this.vaildData(this.permission.enterprise_view, false),
+          delBtn: this.vaildData(this.permission.enterprise_delete, false),
+          editBtn: this.vaildData(this.permission.enterprise_edit, false)
+        };
+      },
+      ids() {
+        let ids = [];
+        this.selectionList.forEach(ele => {
+          ids.push(ele.id);
+        });
+        return ids.join(",");
+      }
+    },
+    methods: {
+      rowSave(row, done, loading) {
+        add(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          window.console.log(error);
+        });
+      },
+      rowUpdate(row, index, done, loading) {
+        update(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          console.log(error);
+        });
+      },
+      rowDel(row) {
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return remove(row.id);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+          });
+      },
+      handleDelete() {
+        if (this.selectionList.length === 0) {
+          this.$message.warning("请选择至少一条数据");
+          return;
+        }
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return remove(this.ids);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+            this.$refs.crud.toggleSelection();
+          });
+      },
+      beforeOpen(done, type) {
+        if (["edit", "view"].includes(type)) {
+          getDetail(this.form.id).then(res => {
+            this.form = res.data.data;
+          });
+        }
+        done();
+      },
+      searchReset() {
+        this.query = {};
+        this.onLoad(this.page);
+      },
+      searchChange(params, done) {
+        this.query = params;
+        this.page.currentPage = 1;
+        this.onLoad(this.page, params);
+        done();
+      },
+      selectionChange(list) {
+        this.selectionList = list;
+      },
+      selectionClear() {
+        this.selectionList = [];
+        this.$refs.crud.toggleSelection();
+      },
+      currentChange(currentPage){
+        this.page.currentPage = currentPage;
+      },
+      sizeChange(pageSize){
+        this.page.pageSize = pageSize;
+      },
+      refreshChange() {
+        this.onLoad(this.page, this.query);
+      },
+      onLoad(page, params = {}) {
+        this.loading = true;
+        getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
+          const data = res.data.data;
+          this.page.total = data.total;
+          this.data = data.records;
+          this.loading = false;
+          this.selectionClear();
+        });
+      }
+    }
+  };
+</script>
+
+<style>
+</style>

+ 254 - 0
src/views/community/room.vue

@@ -0,0 +1,254 @@
+<template>
+  <basic-container>
+    <avue-crud :option="option"
+               :table-loading="loading"
+               :data="data"
+               :page.sync="page"
+               :permission="permissionList"
+               :before-open="beforeOpen"
+               v-model="form"
+               ref="crud"
+               @row-update="rowUpdate"
+               @row-save="rowSave"
+               @row-del="rowDel"
+               @search-change="searchChange"
+               @search-reset="searchReset"
+               @selection-change="selectionChange"
+               @current-change="currentChange"
+               @size-change="sizeChange"
+               @refresh-change="refreshChange"
+               @on-load="onLoad">
+      <template slot="menuLeft">
+        <el-button type="danger"
+                   size="small"
+                   icon="el-icon-delete"
+                   plain
+                   v-if="permission.room_delete"
+                   @click="handleDelete">删 除
+        </el-button>
+      </template>
+    </avue-crud>
+  </basic-container>
+</template>
+
+<script>
+  import {getList, getDetail, add, update, remove} from "@/api/community/room";
+  import {mapGetters} from "vuex";
+
+  export default {
+    data() {
+      return {
+        form: {},
+        query: {},
+        loading: true,
+        page: {
+          pageSize: 10,
+          currentPage: 1,
+          total: 0
+        },
+        selectionList: [],
+        option: {
+          height:'auto',
+          calcHeight: 30,
+          tip: false,
+          searchShow: true,
+          searchMenuSpan: 6,
+          border: true,
+          index: true,
+          viewBtn: true,
+          selection: true,
+          dialogClickModal: false,
+          column: [
+            {
+              label: "所在楼层",
+              prop: "floor",
+              rules: [{
+                required: true,
+                message: "请输入所在楼层",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "房间名称(门牌号)",
+              prop: "roomName",
+              rules: [{
+                required: true,
+                message: "请输入房间名称(门牌号)",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "所在单元名称",
+              prop: "unitId",
+              rules: [{
+                required: true,
+                message: "请输入所在单元名称",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "户主ID",
+              prop: "memberId",
+              rules: [{
+                required: true,
+                message: "请输入户主ID",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "占地面积",
+              prop: "roomSpace",
+              rules: [{
+                required: true,
+                message: "请输入占地面积",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "户型",
+              prop: "roomType",
+              rules: [{
+                required: true,
+                message: "请输入户型",
+                trigger: "blur"
+              }]
+            },
+          ]
+        },
+        data: []
+      };
+    },
+    computed: {
+      ...mapGetters(["permission"]),
+      permissionList() {
+        return {
+          addBtn: this.vaildData(this.permission.room_add, false),
+          viewBtn: this.vaildData(this.permission.room_view, false),
+          delBtn: this.vaildData(this.permission.room_delete, false),
+          editBtn: this.vaildData(this.permission.room_edit, false)
+        };
+      },
+      ids() {
+        let ids = [];
+        this.selectionList.forEach(ele => {
+          ids.push(ele.id);
+        });
+        return ids.join(",");
+      }
+    },
+    methods: {
+      rowSave(row, done, loading) {
+        add(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          window.console.log(error);
+        });
+      },
+      rowUpdate(row, index, done, loading) {
+        update(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          console.log(error);
+        });
+      },
+      rowDel(row) {
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return remove(row.id);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+          });
+      },
+      handleDelete() {
+        if (this.selectionList.length === 0) {
+          this.$message.warning("请选择至少一条数据");
+          return;
+        }
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return remove(this.ids);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+            this.$refs.crud.toggleSelection();
+          });
+      },
+      beforeOpen(done, type) {
+        if (["edit", "view"].includes(type)) {
+          getDetail(this.form.id).then(res => {
+            this.form = res.data.data;
+          });
+        }
+        done();
+      },
+      searchReset() {
+        this.query = {};
+        this.onLoad(this.page);
+      },
+      searchChange(params, done) {
+        this.query = params;
+        this.page.currentPage = 1;
+        this.onLoad(this.page, params);
+        done();
+      },
+      selectionChange(list) {
+        this.selectionList = list;
+      },
+      selectionClear() {
+        this.selectionList = [];
+        this.$refs.crud.toggleSelection();
+      },
+      currentChange(currentPage){
+        this.page.currentPage = currentPage;
+      },
+      sizeChange(pageSize){
+        this.page.pageSize = pageSize;
+      },
+      refreshChange() {
+        this.onLoad(this.page, this.query);
+      },
+      onLoad(page, params = {}) {
+        this.loading = true;
+        getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
+          const data = res.data.data;
+          this.page.total = data.total;
+          this.data = data.records;
+          this.loading = false;
+          this.selectionClear();
+        });
+      }
+    }
+  };
+</script>
+
+<style>
+</style>

+ 263 - 0
src/views/community/unit.vue

@@ -0,0 +1,263 @@
+<template>
+  <basic-container>
+    <avue-crud :option="option"
+               :table-loading="loading"
+               :data="data"
+               :page.sync="page"
+               :permission="permissionList"
+               :before-open="beforeOpen"
+               v-model="form"
+               ref="crud"
+               @row-update="rowUpdate"
+               @row-save="rowSave"
+               @row-del="rowDel"
+               @search-change="searchChange"
+               @search-reset="searchReset"
+               @selection-change="selectionChange"
+               @current-change="currentChange"
+               @size-change="sizeChange"
+               @refresh-change="refreshChange"
+               @on-load="onLoad">
+      <template slot="menuLeft">
+        <el-button type="danger"
+                   size="small"
+                   icon="el-icon-delete"
+                   plain
+                   v-if="permission.unit_delete"
+                   @click="handleDelete">删 除
+        </el-button>
+      </template>
+    </avue-crud>
+  </basic-container>
+</template>
+
+<script>
+  import {getList, getDetail, add, update, remove} from "@/api/community/unit";
+  import {mapGetters} from "vuex";
+
+  export default {
+    data() {
+      return {
+        form: {},
+        query: {},
+        loading: true,
+        page: {
+          pageSize: 10,
+          currentPage: 1,
+          total: 0
+        },
+        selectionList: [],
+        option: {
+          height:'auto',
+          calcHeight: 30,
+          tip: false,
+          searchShow: true,
+          searchMenuSpan: 6,
+          border: true,
+          index: true,
+          viewBtn: true,
+          selection: true,
+          dialogClickModal: false,
+          column: [
+            {
+              label: "所在楼栋",
+              prop: "buildingName",
+              rules: [{
+                required: true,
+                message: "请输入所在楼栋",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "单元名称",
+              prop: "unitName",
+              rules: [{
+                required: true,
+                message: "请输入单元名称",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "地面层数",
+              prop: "upFloorCount",
+              rules: [{
+                required: true,
+                message: "请输入地面层数",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "地下层数",
+              prop: "downFloorCount",
+              rules: [{
+                required: true,
+                message: "请输入地下层数",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "人员数量",
+              prop: "personCount",
+              rules: [{
+                required: true,
+                message: "请输入人员数量",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "房间数量",
+              prop: "roomCount",
+              rules: [{
+                required: true,
+                message: "请输入房间数量",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "所属小区",
+              prop: "communityId",
+              rules: [{
+                required: true,
+                message: "请输入所属小区",
+                trigger: "blur"
+              }]
+            },
+          ]
+        },
+        data: []
+      };
+    },
+    computed: {
+      ...mapGetters(["permission"]),
+      permissionList() {
+        return {
+          addBtn: this.vaildData(this.permission.unit_add, false),
+          viewBtn: this.vaildData(this.permission.unit_view, false),
+          delBtn: this.vaildData(this.permission.unit_delete, false),
+          editBtn: this.vaildData(this.permission.unit_edit, false)
+        };
+      },
+      ids() {
+        let ids = [];
+        this.selectionList.forEach(ele => {
+          ids.push(ele.id);
+        });
+        return ids.join(",");
+      }
+    },
+    methods: {
+      rowSave(row, done, loading) {
+        add(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          window.console.log(error);
+        });
+      },
+      rowUpdate(row, index, done, loading) {
+        update(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          console.log(error);
+        });
+      },
+      rowDel(row) {
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return remove(row.id);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+          });
+      },
+      handleDelete() {
+        if (this.selectionList.length === 0) {
+          this.$message.warning("请选择至少一条数据");
+          return;
+        }
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return remove(this.ids);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+            this.$refs.crud.toggleSelection();
+          });
+      },
+      beforeOpen(done, type) {
+        if (["edit", "view"].includes(type)) {
+          getDetail(this.form.id).then(res => {
+            this.form = res.data.data;
+          });
+        }
+        done();
+      },
+      searchReset() {
+        this.query = {};
+        this.onLoad(this.page);
+      },
+      searchChange(params, done) {
+        this.query = params;
+        this.page.currentPage = 1;
+        this.onLoad(this.page, params);
+        done();
+      },
+      selectionChange(list) {
+        this.selectionList = list;
+      },
+      selectionClear() {
+        this.selectionList = [];
+        this.$refs.crud.toggleSelection();
+      },
+      currentChange(currentPage){
+        this.page.currentPage = currentPage;
+      },
+      sizeChange(pageSize){
+        this.page.pageSize = pageSize;
+      },
+      refreshChange() {
+        this.onLoad(this.page, this.query);
+      },
+      onLoad(page, params = {}) {
+        this.loading = true;
+        getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
+          const data = res.data.data;
+          this.page.total = data.total;
+          this.data = data.records;
+          this.loading = false;
+          this.selectionClear();
+        });
+      }
+    }
+  };
+</script>
+
+<style>
+</style>

+ 180 - 0
src/views/grid/divide.vue

@@ -0,0 +1,180 @@
+<template>
+    <div class="full" >
+      <div style="height: 100%;width: 100%;background: rgba(0,0,0,0.1);position: relative;top: 0px">
+        <amap
+          ref="gridMap"
+          cache-key="home-map"
+          map-style="amap://styles/whitesmoke"
+          :zoom="17"
+          :center="[106.20369238257405,38.472071877817285]"
+          :extraOptions="options"
+          view-mode="3D"
+        >
+          <amap-mouse-tool
+            :mode="mode"
+            :clear-when-close="true"
+            @draw="onDraw"
+          />
+
+          <amap-polygon
+            v-if="polygon"
+            :path.sync="polygon"
+            :fill-opacity="0.5"
+            :fillColor = 'form.gridColor'
+            :strokeColor = 'form.gridColor'
+          />
+
+        </amap>
+        <div v-if="mode=='none'" class="tools-bar">
+          <el-button style="margin: 20px" @click="paint">新建网格区域</el-button>
+        </div>
+
+        <div v-else class="tools-bar" style="background: rgba(150,56,56,0.5)">
+          <el-button style="margin: 20px" @click="finish">绘制完成</el-button>
+          <el-button style="margin: 20px" @click="reset">重置</el-button>
+          <el-button style="margin: 20px" @click="cancel">退出</el-button>
+        </div>
+
+        <el-dialog :visible.sync="bingVisible"
+                   :close-on-press-escape='false'
+                   :close-on-click-modal="false"
+                   :append-to-body="true"
+                   top="25vh"
+        >
+          <avue-form ref="form" v-model="form" :option="option" @submit="submit">
+          </avue-form>
+        </el-dialog>
+
+      </div>
+    </div>
+</template>
+<script>
+
+  export default {
+    data() {
+      return {
+        form:{
+        },
+        polygon: [],
+        bingVisible: false,
+        mode: 'none',
+        skyColor: 'rgb(72,203,243)',
+        options: {
+        }
+      };
+    },
+    mounted() {
+      this.mode = 'none';
+    },
+    computed: {
+      option(){
+        return {
+          size: 'mini',
+          submitText: '完成',
+          column: [
+            {
+              label: '网格名称',
+              prop: 'gridName',
+              rules: [{
+                required: true,
+                message: "请输入网格名称",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: '网格颜色',
+              prop: 'gridColor',
+              type: 'color',
+              rules: [{
+                required: true,
+                message: "请输入网格名称",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: '网格员',
+              prop: 'gridPerson',
+              // component: 'lazySelect',
+              // params: {
+              //   dicUrl: '/api/person/member/list',
+              //   code: 'id',
+              //   title: 'memberName',
+              // },
+              // event: {
+              //   change: (data)=>{
+              //     this.form['gridPerson'] = data.id;
+              //   }
+              // },
+              type: 'select',
+              dicData: [
+                {label: '网格员1',value: "1"},
+                {label: '网格员2',value: "2"},
+              ],
+              rules: [{
+                required: true,
+                message: "请选择网格管理员",
+                trigger: "blur"
+              }]
+            }
+          ],
+        }
+      }
+    },
+    methods: {
+      onDraw(type, res) {
+        this.polygon = res;
+        this.mode = 'painting'
+      },
+      paint(){
+        this.mode = 'polygon';
+        this.polygon =  [];
+        this.form = {
+          gridColor : "#5abbec"
+        }
+      },
+      cancel(){
+        this.mode = 'none';
+        this.polygon =  [];
+      },
+      finish(){
+        if(this.polygon.length == 0){
+          layer.msg("请先绘制网格区域!")
+          return
+        }
+        this.bingVisible = true;
+      },
+      reset(){
+        this.polygon = [];
+        this.mode = 'polygon'
+      },
+      submit (loading,done) {
+        layer.msg("添加网格成功!");
+        this.mode = 'none';
+        done();
+        this.bingVisible = false;
+      },
+    },
+
+  };
+</script>
+
+<style scoped>
+  .full{
+    margin: 0;
+    padding: 0px;
+    width: 100%;
+    height: 100%;
+  }
+  .tools-bar{
+    width: 100%;
+    height: 80px;
+    background: rgba(0,0,0,0.5);
+    position: absolute;
+    top: 0;
+  }
+  .center{
+    display: flex;
+    align-items: center;
+    justify-content: center;
+  }
+</style>

+ 274 - 0
src/views/person/member.vue

@@ -0,0 +1,274 @@
+<template>
+  <basic-container>
+    <avue-crud :option="option"
+               :table-loading="loading"
+               :data="data"
+               :page.sync="page"
+               :permission="permissionList"
+               :before-open="beforeOpen"
+               v-model="form"
+               ref="crud"
+               @row-update="rowUpdate"
+               @row-save="rowSave"
+               @row-del="rowDel"
+               @search-change="searchChange"
+               @search-reset="searchReset"
+               @selection-change="selectionChange"
+               @current-change="currentChange"
+               @size-change="sizeChange"
+               @refresh-change="refreshChange"
+               @on-load="onLoad">
+      <template slot="menuLeft">
+        <el-button type="danger"
+                   size="small"
+                   icon="el-icon-delete"
+                   plain
+                   v-if="permission.member_delete"
+                   @click="handleDelete">删 除
+        </el-button>
+      </template>
+    </avue-crud>
+  </basic-container>
+</template>
+
+<script>
+  import {getList, getDetail, add, update, remove} from "@/api/person/member";
+  import {mapGetters} from "vuex";
+
+  export default {
+    data() {
+      return {
+        form: {},
+        query: {},
+        loading: true,
+        page: {
+          pageSize: 10,
+          currentPage: 1,
+          total: 0
+        },
+        selectionList: [],
+        option: {
+          height:'auto',
+          calcHeight: 30,
+          tip: false,
+          searchShow: true,
+          searchMenuSpan: 6,
+          border: true,
+          index: true,
+          viewBtn: true,
+          selection: true,
+          dialogClickModal: false,
+          column: [
+            {
+              label: "成员姓名",
+              prop: "memberName",
+              rules: [{
+                required: true,
+                message: "请输入成员姓名",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "成员手机号码",
+              prop: "memberPhone",
+              rules: [{
+                required: true,
+                message: "请输入成员手机号码",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "证件类型",
+              prop: "certificateType",
+              type: "select",
+              dicUrl: "/api/blade-system/dict-biz/dictionary?code=certificate-type",
+              props: {
+                label: "dictValue",
+                value: "dictKey"
+              },
+              search: true,
+            },
+            {
+              label: "证件号码",
+              prop: "certificateNum",
+            },
+            {
+              label: "成员性别",
+              prop: "memberGender",
+              type: "select",
+              dicData: [
+                {label: '男',value: '男'},
+                {label: '女',value: '女'},
+              ],
+              search: true,
+            },
+            {
+              label: "成员标签",
+              type: "select",
+              prop: "type",
+              dicUrl: "/api/blade-system/dict-biz/dictionary?code=person-tag",
+              props: {
+                label: "dictValue",
+                value: "dictKey"
+              },
+              search: true,
+            },
+            {
+              label: "成员国籍",
+              prop: "nationality",
+              type: "select",
+              dicUrl: "/api/blade-system/dict-biz/dictionary?code=nationality",
+              props: {
+                label: "dictValue",
+                value: "dictKey"
+              },
+              search: true,
+            },
+            {
+              label: "所在住址",
+              prop: "address",
+            },
+            {
+              label: "年龄",
+              prop: "age",
+              type: "number"
+            },
+          ]
+        },
+        data: []
+      };
+    },
+    computed: {
+      ...mapGetters(["permission"]),
+      permissionList() {
+        return {
+          addBtn: this.vaildData(this.permission.member_add, false),
+          viewBtn: this.vaildData(this.permission.member_view, false),
+          delBtn: this.vaildData(this.permission.member_delete, false),
+          editBtn: this.vaildData(this.permission.member_edit, false)
+        };
+      },
+      ids() {
+        let ids = [];
+        this.selectionList.forEach(ele => {
+          ids.push(ele.id);
+        });
+        return ids.join(",");
+      }
+    },
+    methods: {
+      rowSave(row, done, loading) {
+        add(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          window.console.log(error);
+        });
+      },
+      rowUpdate(row, index, done, loading) {
+        update(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          console.log(error);
+        });
+      },
+      rowDel(row) {
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return remove(row.id);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+          });
+      },
+      handleDelete() {
+        if (this.selectionList.length === 0) {
+          this.$message.warning("请选择至少一条数据");
+          return;
+        }
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return remove(this.ids);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+            this.$refs.crud.toggleSelection();
+          });
+      },
+      beforeOpen(done, type) {
+        if (["edit", "view"].includes(type)) {
+          getDetail(this.form.id).then(res => {
+            this.form = res.data.data;
+          });
+        }
+        done();
+      },
+      searchReset() {
+        this.query = {};
+        this.onLoad(this.page);
+      },
+      searchChange(params, done) {
+        this.query = params;
+        this.page.currentPage = 1;
+        this.onLoad(this.page, params);
+        done();
+      },
+      selectionChange(list) {
+        this.selectionList = list;
+      },
+      selectionClear() {
+        this.selectionList = [];
+        this.$refs.crud.toggleSelection();
+      },
+      currentChange(currentPage){
+        this.page.currentPage = currentPage;
+      },
+      sizeChange(pageSize){
+        this.page.pageSize = pageSize;
+      },
+      refreshChange() {
+        this.onLoad(this.page, this.query);
+      },
+      onLoad(page, params = {}) {
+        this.loading = true;
+        getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
+          const data = res.data.data;
+          this.page.total = data.total;
+          this.data = data.records;
+          this.loading = false;
+          this.selectionClear();
+        });
+      }
+    }
+  };
+</script>
+
+<style>
+</style>

+ 254 - 0
src/views/person/wyappmember.vue

@@ -0,0 +1,254 @@
+<template>
+  <basic-container>
+    <avue-crud :option="option"
+               :table-loading="loading"
+               :data="data"
+               :page.sync="page"
+               :permission="permissionList"
+               :before-open="beforeOpen"
+               v-model="form"
+               ref="crud"
+               @row-update="rowUpdate"
+               @row-save="rowSave"
+               @row-del="rowDel"
+               @search-change="searchChange"
+               @search-reset="searchReset"
+               @selection-change="selectionChange"
+               @current-change="currentChange"
+               @size-change="sizeChange"
+               @refresh-change="refreshChange"
+               @on-load="onLoad">
+      <template slot="menuLeft">
+        <el-button type="danger"
+                   size="small"
+                   icon="el-icon-delete"
+                   plain
+                   v-if="permission.wyappmember_delete"
+                   @click="handleDelete">删 除
+        </el-button>
+      </template>
+    </avue-crud>
+  </basic-container>
+</template>
+
+<script>
+  import {getList, getDetail, add, update, remove} from "@/api/person/wyappmember";
+  import {mapGetters} from "vuex";
+
+  export default {
+    data() {
+      return {
+        form: {},
+        query: {},
+        loading: true,
+        page: {
+          pageSize: 10,
+          currentPage: 1,
+          total: 0
+        },
+        selectionList: [],
+        option: {
+          height:'auto',
+          calcHeight: 30,
+          tip: false,
+          searchShow: true,
+          searchMenuSpan: 6,
+          border: true,
+          index: true,
+          viewBtn: true,
+          selection: true,
+          dialogClickModal: false,
+          column: [
+            {
+              label: "成员属性ID",
+              prop: "memberId",
+              rules: [{
+                required: true,
+                message: "请输入成员属性ID",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "家庭户主ID",
+              prop: "headId",
+              rules: [{
+                required: true,
+                message: "请输入家庭户主ID",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "房间ID",
+              prop: "roomId",
+              rules: [{
+                required: true,
+                message: "请输入房间ID",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "物业小程序openid",
+              prop: "openid",
+              rules: [{
+                required: true,
+                message: "请输入物业小程序openid",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "认证状态",
+              prop: "certificationStatus",
+              rules: [{
+                required: true,
+                message: "请输入认证状态",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "启用状态",
+              prop: "enableStatus",
+              rules: [{
+                required: true,
+                message: "请输入启用状态",
+                trigger: "blur"
+              }]
+            },
+          ]
+        },
+        data: []
+      };
+    },
+    computed: {
+      ...mapGetters(["permission"]),
+      permissionList() {
+        return {
+          addBtn: this.vaildData(this.permission.wyappmember_add, false),
+          viewBtn: this.vaildData(this.permission.wyappmember_view, false),
+          delBtn: this.vaildData(this.permission.wyappmember_delete, false),
+          editBtn: this.vaildData(this.permission.wyappmember_edit, false)
+        };
+      },
+      ids() {
+        let ids = [];
+        this.selectionList.forEach(ele => {
+          ids.push(ele.id);
+        });
+        return ids.join(",");
+      }
+    },
+    methods: {
+      rowSave(row, done, loading) {
+        add(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          window.console.log(error);
+        });
+      },
+      rowUpdate(row, index, done, loading) {
+        update(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          console.log(error);
+        });
+      },
+      rowDel(row) {
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return remove(row.id);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+          });
+      },
+      handleDelete() {
+        if (this.selectionList.length === 0) {
+          this.$message.warning("请选择至少一条数据");
+          return;
+        }
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return remove(this.ids);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+            this.$refs.crud.toggleSelection();
+          });
+      },
+      beforeOpen(done, type) {
+        if (["edit", "view"].includes(type)) {
+          getDetail(this.form.id).then(res => {
+            this.form = res.data.data;
+          });
+        }
+        done();
+      },
+      searchReset() {
+        this.query = {};
+        this.onLoad(this.page);
+      },
+      searchChange(params, done) {
+        this.query = params;
+        this.page.currentPage = 1;
+        this.onLoad(this.page, params);
+        done();
+      },
+      selectionChange(list) {
+        this.selectionList = list;
+      },
+      selectionClear() {
+        this.selectionList = [];
+        this.$refs.crud.toggleSelection();
+      },
+      currentChange(currentPage){
+        this.page.currentPage = currentPage;
+      },
+      sizeChange(pageSize){
+        this.page.pageSize = pageSize;
+      },
+      refreshChange() {
+        this.onLoad(this.page, this.query);
+      },
+      onLoad(page, params = {}) {
+        this.loading = true;
+        getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
+          const data = res.data.data;
+          this.page.total = data.total;
+          this.data = data.records;
+          this.loading = false;
+          this.selectionClear();
+        });
+      }
+    }
+  };
+</script>
+
+<style>
+</style>

+ 10 - 0
vue.config.js

@@ -1,3 +1,4 @@
+const webpack = require('webpack')
 module.exports = {
   //路径前缀
   publicPath: "/",
@@ -35,5 +36,14 @@ module.exports = {
         }
       }
     }
+  },
+  configureWebpack: {
+    plugins: [
+      new webpack.ProvidePlugin({
+        $:"jquery",
+        jQuery:"jquery",
+        "windows.jQuery":"jquery"
+      })
+    ]
   }
 };