Browse Source

Project Init

yigeren911 2 years ago
parent
commit
3e12a66882

+ 1 - 1
.editorconfig

@@ -4,7 +4,7 @@ root = true
 [*]
 charset = utf-8
 indent_style = space
-indent_size = 4
+indent_size = 2
 end_of_line = lf
 insert_final_newline = true
 trim_trailing_whitespace = true

+ 1 - 1
.env.development

@@ -5,6 +5,6 @@ ENV = 'development'
 VITE_BASE_PATH = './'
 
 # 本地环境接口地址 - 尾部无需带'/'
-VITE_AXIOS_BASE_URL = 'http://admin.baoxiaojia.dingsenhulian.com'
+VITE_AXIOS_BASE_URL = 'http://192.168.130.199:7001'
 
 SOCKET_OTC='ws:39.103.154.113:1070/ws'

+ 1 - 1
.env.production

@@ -8,7 +8,7 @@ VITE_BASE_PATH = '/'
 VITE_OUT_DIR = 'dist'
 
 # 线上环境接口地址 - 'getCurrentDomain:表示获取当前域名'
-VITE_AXIOS_BASE_URL = 'http://admin.baoxiaojia.dingsenhulian.com'
+VITE_AXIOS_BASE_URL = 'http://39.103.154.113:7001'
 
 SOCKET_OTC='ws:127.0.0.1:1070/ws'
 

+ 1 - 1
.gitignore

@@ -1,2 +1,2 @@
 node_modules
-node_modules
+dist

+ 49 - 41
src/api/controllerUrls.ts

@@ -11,45 +11,53 @@
  * 通常将表格的控制器URL定义在此处
  * 然后就可以使用/@/api/common中的baTableApi类生成各个操作的url以供table进行增删改查
  */
-export const baseUrl = import.meta.env.VITE_AXIOS_BASE_URL //项目后台地址
-export const sysMenu = '/sysMenu/'
-export const authAdmin = '/sysAccount/'
-export const sysOrg = '/enterpriseOrg/'
-export const sysPos = '/enterprisePos/'
-export const sysOperationLog = '/sysOperationLog/'
-export const authGroup = '/sysRole/'
-export const sysApp = '/sysApp/'
-export const enterpriseEmployee = '/enterpriseEmployee/'
-export const enterpriseEmployeeAnnex = '/enterpriseEmployeeAnnex/'
-export const routineAttachment = '/index.php/admin/routine.attachment/'
-export const userUser = '/index.php/admin/user.user/'
-export const userGroup = '/index.php/admin/user.group/'
-export const userRule = '/index.php/admin/user.rule/'
-export const userScoreLog = '/index.php/admin/user.scoreLog/'
-export const userMoneyLog = '/index.php/admin/user.moneyLog/'
-export const securityDataRecycle = '/sysSecurityDataRecycle/'
-export const securityDataRecycleLog = '/sysSecurityDataRecycleLog/'
-export const securitySensitiveData = '/SecuritySensitiveData/'
-export const securitySensitiveDataLog = '/index.php/admin/security.sensitiveDataLog/'
-export const sysConfig = '/sysConfig/' //关于我们
-export const document = '/document/' //文档管理
-export const advertisement = '/ad/' //广告管理
-export const illustration = '/help/type/' //帮助清单
-export const classification = '/help/' //帮助分类
-export const coupon = '/coupon/' //优惠卷
-export const recommend = '/recommend/' //好物
-export const recommendPartner = '/recommend/partner/' //好物伙伴
-export const product = '/product/' //智由屏
-export const productVersion = '/upgrade/version/' //产品版本管理
-export const versionRelease='/upgrade/version/release' //产品版本发布
-export const member = '/member/' //用户管理
-export const feedback = '/feedback/' //意见建议
-export const equipment = '/equipment/' //设备列表
-export const order = '/order/' //订单管理
-export const orderExpress='/order/express/'
-export const notice='/notice/' //消息管理
-export const statistics='/statistics/' //控制台数据统计
-export const orderRefund='/order/refund/' //退款申请
-export const moments='/moments/' //圈子管理
-export const dataScreen='/statistics/view/' //数据大屏用户管理
+export const baseUrl = import.meta.env.VITE_AXIOS_BASE_URL; //项目后台地址
+export const sysMenu = "/sysMenu/";
+export const authAdmin = "/sysAccount/";
+export const sysOrg = "/enterpriseOrg/";
+export const sysPos = "/enterprisePos/";
+export const sysOperationLog = "/sysOperationLog/";
+export const authGroup = "/sysRole/";
+export const sysApp = "/sysApp/";
+export const enterpriseEmployee = "/enterpriseEmployee/";
+export const enterpriseEmployeeAnnex = "/enterpriseEmployeeAnnex/";
+export const routineAttachment = "/index.php/admin/routine.attachment/";
+export const userUser = "/index.php/admin/user.user/";
+export const userGroup = "/index.php/admin/user.group/";
+export const userRule = "/index.php/admin/user.rule/";
+export const userScoreLog = "/index.php/admin/user.scoreLog/";
+export const userMoneyLog = "/index.php/admin/user.moneyLog/";
+export const securityDataRecycle = "/sysSecurityDataRecycle/";
+export const securityDataRecycleLog = "/sysSecurityDataRecycleLog/";
+export const securitySensitiveData = "/SecuritySensitiveData/";
+export const securitySensitiveDataLog = "/index.php/admin/security.sensitiveDataLog/";
+export const sysConfig = "/sysConfig/"; //关于我们
+export const document = "/document/"; //文档管理
+export const advertisement = "/ad/"; //广告管理
+export const illustration = "/help/type/"; //帮助清单
+export const classification = "/help/"; //帮助分类
+export const coupon = "/coupon/"; //优惠卷
+export const recommend = "/recommend/"; //好物
+export const recommendPartner = "/recommend/partner/"; //好物伙伴
+export const product = "/product/"; //智由屏
+export const productVersion = "/upgrade/version/"; //产品版本管理
+export const versionRelease = "/upgrade/version/release"; //产品版本发布
+export const member = "/member/"; //用户管理
+export const feedback = "/feedback/"; //意见建议
+export const equipment = "/equipment/"; //设备列表
+export const order = "/order/"; //订单管理
+export const orderExpress = "/order/express/";
+export const notice = "/notice/"; //消息管理
+export const statistics = "/statistics/"; //控制台数据统计
+export const orderRefund = "/order/refund/"; //退款申请
+export const moments = "/moments/"; //圈子管理
+export const dataScreen = "/statistics/view/"; //数据大屏用户管理
+
+
+export const district_list = "/common/district"; //获取区县列表
+export const community_list = "/common/community"; //获取小区列表
+
+
+export const community = "/community/"; //小区管理
+export const building = "/community/building/"; //楼宇管理
 

+ 0 - 220
src/views/backend/enterprise/community/popupForm.vue

@@ -1,220 +0,0 @@
-<template>
-    <!-- 对话框表单 -->
-    <el-dialog custom-class="ba-operate-dialog" :close-on-click-modal="false"
-               :model-value="baTable.form.operate ? true : false" @close="baTable.toggleForm">
-        <template #header>
-            <div class="title" v-drag="['.ba-operate-dialog', '.el-dialog__header']" v-zoom="'.ba-operate-dialog'">
-                {{ baTable.form.operate ? baTable.form.operate == 'edit' ? '编辑' : '添加' : '无标题' }}
-            </div>
-        </template>
-        <el-scrollbar v-loading="baTable.form.loading" class="ba-table-form-scrollbar">
-            <div class="ba-operate-form" :class="'ba-' + baTable.form.operate + '-form'"
-                 :style="'width: calc(100% - ' + baTable.form.labelWidth! / 2 + 'px)'">
-                <el-form ref="formRef" @keyup.enter="baTable.onSubmit(formRef)" :model="baTable.form.items"
-                         label-position="right" :label-width="baTable.form.labelWidth + 'px'" :rules="rules"
-                         v-if="!baTable.form.loading">
-                    <el-form-item prop="adTitle" label="广告标题">
-                        <el-input v-model="baTable.form.items!.adTitle"></el-input>
-                    </el-form-item>
-                    <el-form-item prop="sceneType" label="场景">
-                        <el-select v-model="baTable.form.items!.sceneType" placeholder="请选择场景" style="width: 100%"
-                                   clearable>
-                            <el-option label="开机" :value="0"/>
-                            <el-option label="轮播" :value="1"/>
-                        </el-select>
-                    </el-form-item>
-                    <el-form-item prop="adType" label="类型">
-                        <el-select v-model="baTable.form.items!.adType" placeholder="请选择类型" style="width: 100%"
-                                   clearable
-                                   @change="onChange">
-                            <el-option label="展示" :value="0"/>
-                            <el-option label="推广" :value="1"/>
-                            <el-option label="好物" :value="2"/>
-                        </el-select>
-                    </el-form-item>
-                    <el-form-item prop="documentId" label="关联" v-if="baTable.form.items.adType>0">
-                        <el-select v-model="baTable.form.items!.documentId" placeholder="请选择关联" style="width: 100%"
-                                   clearable
-                                   filterable>
-                            <el-option v-for="(item,index) in datas.selectList" :label="item.label" :value="item.value"
-                                       :key="index"/>
-                        </el-select>
-                    </el-form-item>
-                    <el-form-item prop="adStatus" label="状态">
-                        <el-select v-model="baTable.form.items!.adStatus" placeholder="请选择状态" style="width: 100%"
-                                   clearable>
-                            <el-option label="下架" :value="1"/>
-                            <el-option label="上架" :value="0"/>
-                        </el-select>
-                    </el-form-item>
-                    <el-form-item prop="screenDisplayHorizontalUrl" label="大屏横屏展示"
-                                  v-if="baTable.form.items!.sceneType==0">
-                        <pictureUpload v-model:fileUrl="baTable.form.items!.screenDisplayHorizontalUrl"></pictureUpload>
-                    </el-form-item>
-                    <el-form-item prop="screenDisplayVerticalUrl" label="大屏竖屏展示"
-                                  v-if="baTable.form.items!.sceneType==0">
-                        <pictureUpload v-model:fileUrl="baTable.form.items!.screenDisplayVerticalUrl"></pictureUpload>
-                    </el-form-item>
-                    <el-form-item prop="screenDisplayHorizontalUrl" label="大屏轮播展示"
-                                  v-if="baTable.form.items!.sceneType==1">
-                        <pictureUpload v-model:fileUrl="baTable.form.items!.screenDisplayHorizontalUrl"></pictureUpload>
-                    </el-form-item>
-                    <el-form-item prop="appDisplayUrl" label="移动APP展示">
-                        <pictureUpload v-model:fileUrl="baTable.form.items!.appDisplayUrl"></pictureUpload>
-                    </el-form-item>
-                    <div style="font-size: 10px;color: #92969a;margin-left: 150px">
-                        仅限jpg/png格式文件,大小不超过1MB
-                    </div>
-                </el-form>
-            </div>
-        </el-scrollbar>
-        <template #footer>
-            <div :style="'width: calc(100% - ' + baTable.form.labelWidth! / 1.8 + 'px)'">
-                <el-button @click="baTable.toggleForm('')">取消</el-button>
-                <el-button v-blur :loading="baTable.form.submitLoading" @click="baTable.onSubmit(formRef)"
-                           type="primary">
-                    {{ baTable.form.operateIds && baTable.form.operateIds.length > 1 ? '保存并编辑下一项' : '保存' }}
-                </el-button>
-            </div>
-        </template>
-    </el-dialog>
-</template>
-
-<script setup lang="ts">
-import {ref, reactive, inject, onMounted, watch} from 'vue'
-
-import type baTableClass from '/@/utils/baTable'
-import {regularPassword, validatorAccount, validatorMobile} from '/@/utils/validate'
-import type {ElForm, FormItemRule} from 'element-plus'
-import FormItem from '/@/components/formItem/index.vue'
-import {getOrgTree, getEmployees} from '/@/api/backend/auth/account'
-import {authGroup, sysConfig} from '/@/api/controllerUrls'
-import editor from '/@/components/editor/index.vue'
-import request from '/@/api/request'
-import {ElNotification} from 'element-plus/es'
-import {document} from '/@/api/controllerUrls'
-import pictureUpload from '/@/components/pictureUpload/index.vue'
-import {getRecommendList} from '/@/api/backend/enterprise/advertisement'
-
-const formRef = ref<InstanceType<typeof ElForm>>()
-const baTable = inject('baTable') as baTableClass
-
-onMounted(() => {
-    getDocList()
-})
-
-let datas = reactive({
-    selectList: [],
-})
-
-function getDocList() {
-    request.index(document, undefined, 'list').then((res) => {
-        datas.selectList = []
-        baTable.form.items!.documentId = ''
-        res.data.map((item: any) => {
-            let selectItem = {
-                label: item.documentTitle,
-                value: item.id,
-            }
-            datas.selectList.push(selectItem)
-        })
-
-    })
-}
-
-const onChange = (val: any) => {
-    if (val === 1) {
-        getDocList()
-    }
-
-    if (val === 2) {
-        getRecommendList().then((res) => {
-            datas.selectList = []
-            baTable.form.items!.documentId = ''
-            res.data.map((item: any) => {
-                let selectItem = {
-                    label: item.recommendTitle,
-                    value: item.id,
-                }
-
-                datas.selectList.push(selectItem)
-            })
-        })
-    }
-}
-
-const rules: Partial<Record<string, FormItemRule[]>> = reactive({
-    adTitle: [
-        {
-            required: true,
-            message: '请输入标题',
-            trigger: 'blur',
-        },
-    ],
-    sceneType: [
-        {
-            required: true,
-            message: '请选择场景',
-            trigger: 'blur',
-        },
-    ],
-    adType: [
-        {
-            required: true,
-            message: '请选择类型',
-            trigger: 'blur',
-        },
-    ],
-    documentId: [
-        {
-            required: true,
-            message: '请选择关联',
-            trigger: 'blur',
-        },
-    ],
-    adStatus: [
-        {
-            required: true,
-            message: '请选择状态',
-            trigger: 'blur',
-        },
-    ],
-})
-</script>
-
-<style scoped lang="scss">
-.avatar-uploader {
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    position: relative;
-    border-radius: var(--el-border-radius-small);
-    box-shadow: var(--el-box-shadow-light);
-    border: 1px dashed var(--color-sub-1);
-    cursor: pointer;
-    overflow: hidden;
-    width: 110px;
-    height: 110px;
-}
-
-.avatar-uploader:hover {
-    border-color: var(--color-primary);
-}
-
-.avatar {
-    width: 110px;
-    height: 110px;
-    display: block;
-}
-
-.image-slot {
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    height: 100%;
-}
-</style>
-
-function getRecommendList() {
-throw new Error('Function not implemented.')
-}

+ 80 - 0
src/views/backend/enterprise/project/building/index.vue

@@ -0,0 +1,80 @@
+<template>
+    <div class="default-main ">
+        <el-alert class="ba-table-alert" v-if="baTable.table.remark" :title="baTable.table.remark" type="info"
+                  show-icon/>
+        <el-row>
+            <el-col :span="24">
+
+                <!-- 表格顶部菜单 -->
+                <TableHeader :buttons="['refresh', 'add', 'edit', 'delete', 'comSearch']"
+                             quick-search-placeholder="通过标题模糊搜索"
+                             @action="baTable.onTableHeaderAction"/>
+                <!-- 表格 -->
+                <!-- 要使用`el-table`组件原有的属性,直接加在Table标签上即可 -->
+                <Table @action="baTable.onTableAction"/>
+
+            </el-col>
+        </el-row>
+
+        <!-- 表单 -->
+        <PopupForm ref="formRef"/>
+
+    </div>
+</template>
+
+<script setup lang="ts">
+import {ref, onMounted, provide} from 'vue'
+import { building } from "/@/api/controllerUrls";
+import Table from '/@/components/table/index.vue'
+import TableHeader from '/@/components/table/header/index.vue'
+import {defaultOptButtons} from '/@/components/table'
+import PopupForm from './popupForm.vue'
+import {baTableApi} from '/@/api/common'
+import baTableClass from '/@/utils/baTable'
+
+
+const baTable = new baTableClass(
+    new baTableApi(building),
+    {
+        dblClickNotEditColumn: [undefined, 'status'],
+        column: [
+            {type: 'selection', align: 'center', operator: false},
+            {label: '小区名称', prop: 'communityName', align: 'left', operator: 'LIKE'},
+            {label: '楼号', prop: 'buildingNumber', align: 'center', operator: false},
+            { label: "现有车位", prop: "carportCount", align: "center",width:"100", operator: false },
+            { label: "剩余车位", prop: "carportReminderCount", align: "center",width:"100", operator: false },
+            { label: "现有车库", prop: "garageCount", align: "center",width:"100", operator: false },
+            { label: "剩余车库", prop: "garageReminderCount", align: "center",width:"100", operator: false },
+            {label: '创建人', prop: 'creatorName', align: 'center', width: '120', operator: false},
+            {label: '创建时间', prop: 'createTime', align: 'center', width: '160', operator: false},
+            {
+                label: '操作',
+                align: 'center',
+                width: '160',
+                render: 'buttons',
+                buttons: defaultOptButtons(),
+                operator: false
+            },
+        ],
+    },
+    {
+        defaultItems: {},
+    },
+    {
+        // 获得编辑数据后
+        requestEdit: () => {
+            if (baTable.form.items && !baTable.form.items.icon) baTable.form.items.icon = 'el-icon-Minus'
+        },
+    }
+)
+
+provide('baTable', baTable)
+
+onMounted(() => {
+    baTable.mount()
+    baTable.getIndex()
+})
+</script>
+
+
+<style scoped lang="scss"></style>

+ 122 - 0
src/views/backend/enterprise/project/building/popupForm.vue

@@ -0,0 +1,122 @@
+<template>
+  <!-- 对话框表单 -->
+  <el-dialog custom-class="ba-operate-dialog" :close-on-click-modal="false"
+             :model-value="baTable.form.operate ? true : false" @close="baTable.toggleForm"
+             width="30%"
+  >
+    <template #header>
+      <div class="title" v-drag="['.ba-operate-dialog', '.el-dialog__header']" v-zoom="'.ba-operate-dialog'">
+        {{ baTable.form.operate ? baTable.form.operate == "edit" ? "编辑" : "添加" : "无标题" }}
+      </div>
+    </template>
+    <el-scrollbar v-loading="baTable.form.loading">
+      <div class="ba-operate-form" :class="'ba-' + baTable.form.operate + '-form'"
+           style="width: calc(100% - 40px);margin-bottom: 40px;">
+        <el-form ref="formRef" @keyup.enter="baTable.onSubmit(formRef)" :model="baTable.form.items"
+                 label-position="right" :label-width="'80px'" :rules="rules"
+                 v-if="!baTable.form.loading">
+          <el-form-item prop="communityId" label="小区名称">
+            <el-select v-model="baTable.form.items!.communityId" placeholder="请选择" style="width: 100%"
+                       clearable>
+              <el-option :label="item.communityName" :value="item.id"
+                         v-for="item in communityList" />
+            </el-select>
+          </el-form-item>
+          <el-form-item prop="buildingNumber" label="楼号">
+            <el-input v-model="baTable.form.items!.buildingNumber" placeholder="请输入"></el-input>
+          </el-form-item>
+        </el-form>
+      </div>
+    </el-scrollbar>
+    <template #footer>
+      <div :style="'width: calc(100% - ' + baTable.form.labelWidth! / 1.8 + 'px)'">
+        <el-button @click="baTable.toggleForm('')">取消</el-button>
+        <el-button v-blur :loading="baTable.form.submitLoading" @click="baTable.onSubmit(formRef)"
+                   type="primary">
+          {{ baTable.form.operateIds && baTable.form.operateIds.length > 1 ? "保存并编辑下一项" : "保存" }}
+        </el-button>
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup lang="ts">
+import { ref, reactive, inject, onMounted } from "vue";
+
+import type baTableClass from "/@/utils/baTable";
+import type { ElForm, FormItemRule } from "element-plus";
+import FormItem from "/@/components/formItem/index.vue";
+import { community_list, district, orderExpress } from "/@/api/controllerUrls";
+import { ElNotification } from "element-plus/es";
+import request from "/@/api/request";
+
+const formRef = ref<InstanceType<typeof ElForm>>();
+const baTable = inject("baTable") as baTableClass;
+
+
+const rules: Partial<Record<string, FormItemRule[]>> = reactive({
+  communityId: [
+    {
+      required: true,
+      message: "请选择",
+      trigger: "blur"
+    }
+  ],
+  buildingNumber: [
+    {
+      required: true,
+      message: "请输入",
+      trigger: "blur"
+    }
+  ],
+});
+
+onMounted(() => {
+  getInitData();
+});
+
+//区县列表
+let communityList = ref([]);
+
+function getInitData() {
+  request.index(community_list, {}, "").then((res: any) => {
+    if (res.code == 1) {
+      communityList.value = res.data;
+    }
+  });
+}
+
+</script>
+
+<style scoped lang="scss">
+.avatar-uploader {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  position: relative;
+  border-radius: var(--el-border-radius-small);
+  box-shadow: var(--el-box-shadow-light);
+  border: 1px dashed var(--color-sub-1);
+  cursor: pointer;
+  overflow: hidden;
+  width: 110px;
+  height: 110px;
+}
+
+.avatar-uploader:hover {
+  border-color: var(--color-primary);
+}
+
+.avatar {
+  width: 110px;
+  height: 110px;
+  display: block;
+}
+
+.image-slot {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  height: 100%;
+}
+</style>

+ 15 - 50
src/views/backend/enterprise/community/index.vue → src/views/backend/enterprise/project/community/index.vue

@@ -1,9 +1,10 @@
 <template>
-    <div class="default-main ba-table-box">
+    <div class="default-main ">
         <el-alert class="ba-table-alert" v-if="baTable.table.remark" :title="baTable.table.remark" type="info"
                   show-icon />
         <el-row>
             <el-col :span="24">
+
                 <!-- 表格顶部菜单 -->
                 <TableHeader :buttons="['refresh', 'add', 'edit', 'delete', 'comSearch']"
                              quick-search-placeholder="通过标题模糊搜索"
@@ -21,60 +22,29 @@
     </div>
 </template>
 
-<script setup>
+<script setup lang="ts">
 import { ref, onMounted, provide } from "vue";
-import { advertisement, document } from "/@/api/controllerUrls";
+import { community } from "/@/api/controllerUrls";
 import Table from "/@/components/table/index.vue";
 import TableHeader from "/@/components/table/header/index.vue";
+import { defaultOptButtons } from "/@/components/table";
 import PopupForm from "./popupForm.vue";
 import { baTableApi } from "/@/api/common";
 import baTableClass from "/@/utils/baTable";
-import { defaultOptButtons } from "/@/components/table";
 
 
 const baTable = new baTableClass(
-    new baTableApi(advertisement),
+    new baTableApi(community),
     {
         dblClickNotEditColumn: [undefined, "status"],
         column: [
             { type: "selection", align: "center", operator: false },
-            { label: "标题", prop: "adTitle", align: "left", operator: "LIKE" },
-            {
-                label: "场景",
-                prop: "sceneType",
-                align: "center",
-                width: "120",
-                render: "tag",
-                operator: "=",
-                replaceValue: { 0: "开机", 1: "轮播" }
-            },
-            {
-                label: "类型",
-                prop: "adType",
-                align: "center",
-                width: "120",
-                render: "tag",
-                operator: "=",
-                custom: { 0: "", 1: "", 2: "" },
-                replaceValue: { 0: "展示", 1: "推广", 2: "好物" }
-            },
-            {
-                label: "曝光量",
-                prop: "viewCount",
-                align: "center",
-                width: "120",
-                operator: false
-            },
-            {
-                label: "是否上架",
-                prop: "adStatus",
-                align: "center",
-                width: "120",
-                render: "tag",
-                operator: "=",
-                custom: { 0: "success", 1: "info" },
-                replaceValue: { 0: "上架", 1: "下架" }
-            },
+            { label: "小区名称", prop: "communityName", align: "left", operator: "LIKE" },
+            { label: "所在区(县)", prop: "districtName", align: "center", operator: false },
+            { label: "现有车位", prop: "carportCount", align: "center",width:"100", operator: false },
+            { label: "剩余车位", prop: "carportReminderCount", align: "center",width:"100", operator: false },
+            { label: "现有车库", prop: "garageCount", align: "center",width:"100", operator: false },
+            { label: "剩余车库", prop: "garageReminderCount", align: "center",width:"100", operator: false },
             { label: "创建人", prop: "creatorName", align: "center", width: "120", operator: false },
             { label: "创建时间", prop: "createTime", align: "center", width: "160", operator: false },
             {
@@ -88,9 +58,7 @@ const baTable = new baTableClass(
         ]
     },
     {
-        defaultItems: {
-            sceneType: 0
-        }
+        defaultItems: {}
     },
     {
         // 获得编辑数据后
@@ -100,16 +68,13 @@ const baTable = new baTableClass(
     }
 );
 
-
 provide("baTable", baTable);
+
 onMounted(() => {
     baTable.mount();
     baTable.getIndex();
 });
-
-
 </script>
 
-<style scoped>
 
-</style>
+<style scoped lang="scss"></style>

+ 124 - 0
src/views/backend/enterprise/project/community/popupForm.vue

@@ -0,0 +1,124 @@
+<template>
+  <!-- 对话框表单 -->
+  <el-dialog custom-class="ba-operate-dialog" :close-on-click-modal="false"
+             :model-value="baTable.form.operate ? true : false" @close="baTable.toggleForm"
+             width="30%"
+  >
+    <template #header>
+      <div class="title" v-drag="['.ba-operate-dialog', '.el-dialog__header']" v-zoom="'.ba-operate-dialog'">
+        {{ baTable.form.operate ? baTable.form.operate == "edit" ? "编辑" : "添加" : "无标题" }}
+      </div>
+    </template>
+    <el-scrollbar v-loading="baTable.form.loading">
+      <div class="ba-operate-form" :class="'ba-' + baTable.form.operate + '-form'"
+           style="width: calc(100% - 40px);margin-bottom: 40px;">
+        <el-form ref="formRef" @keyup.enter="baTable.onSubmit(formRef)" :model="baTable.form.items"
+                 label-position="right" :label-width="'100px'" :rules="rules"
+                 v-if="!baTable.form.loading">
+          <el-form-item prop="communityName" label="小区名称">
+            <el-input v-model="baTable.form.items!.communityName" placeholder="请输入"></el-input>
+          </el-form-item>
+          <el-form-item prop="districtId" label="所在区(县)">
+            <el-select v-model="baTable.form.items!.districtId" placeholder="请选择" style="width: 100%" clearable>
+              <el-option :label="item.districtName" :value="item.id" v-for="item in districtList" />
+            </el-select>
+          </el-form-item>
+        </el-form>
+      </div>
+    </el-scrollbar>
+    <template #footer>
+      <div :style="'width: calc(100% - ' + baTable.form.labelWidth! / 1.8 + 'px)'">
+        <el-button @click="baTable.toggleForm('')">取消</el-button>
+        <el-button v-blur :loading="baTable.form.submitLoading" @click="baTable.onSubmit(formRef)" type="primary">
+          {{ baTable.form.operateIds && baTable.form.operateIds.length > 1 ? "保存并编辑下一项" : "保存" }}
+        </el-button>
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup lang="ts">
+import { ref, reactive, inject, onActivated, onMounted, watch } from "vue";
+
+import type baTableClass from "/@/utils/baTable";
+import type { ElForm, FormItemRule } from "element-plus";
+import FormItem from "/@/components/formItem/index.vue";
+import { district_list, moments, orderExpress } from "/@/api/controllerUrls";
+import { ElNotification } from "element-plus/es";
+import request from "/@/api/request";
+
+const formRef = ref<InstanceType<typeof ElForm>>();
+const baTable = inject("baTable") as baTableClass;
+
+
+const rules: Partial<Record<string, FormItemRule[]>> = reactive({
+  communityName: [
+    {
+      required: true,
+      message: "请输入",
+      trigger: "blur"
+    }
+  ],
+  districtId: [
+    {
+      required: true,
+      message: "请选择",
+      trigger: "blur"
+    }
+  ]
+});
+
+onMounted(() => {
+  getInitData();
+});
+
+watch(() => baTable.form.operate, () => {
+  getInitData();
+});
+
+//区县列表
+let districtList = ref([]);
+
+function getInitData() {
+  request.index(district_list, {}, "").then((res: any) => {
+    if (res.code == 1) {
+      districtList.value = res.data;
+    }
+  });
+}
+
+
+</script>
+
+<style scoped lang="scss">
+.avatar-uploader {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  position: relative;
+  border-radius: var(--el-border-radius-small);
+  box-shadow: var(--el-box-shadow-light);
+  border: 1px dashed var(--color-sub-1);
+  cursor: pointer;
+  overflow: hidden;
+  width: 110px;
+  height: 110px;
+}
+
+.avatar-uploader:hover {
+  border-color: var(--color-primary);
+}
+
+.avatar {
+  width: 110px;
+  height: 110px;
+  display: block;
+}
+
+.image-slot {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  height: 100%;
+}
+</style>

+ 78 - 0
src/views/backend/enterprise/project/map/index.vue

@@ -0,0 +1,78 @@
+<template>
+    <div class="default-main ">
+        <el-alert class="ba-table-alert" v-if="baTable.table.remark" :title="baTable.table.remark" type="info"
+                  show-icon/>
+        <el-row>
+            <el-col :span="24">
+
+                <!-- 表格顶部菜单 -->
+                <TableHeader :buttons="['refresh', 'add', 'edit', 'delete', 'comSearch']"
+                             quick-search-placeholder="通过标题模糊搜索"
+                             @action="baTable.onTableHeaderAction"/>
+                <!-- 表格 -->
+                <!-- 要使用`el-table`组件原有的属性,直接加在Table标签上即可 -->
+                <Table @action="baTable.onTableAction"/>
+
+            </el-col>
+        </el-row>
+
+        <!-- 表单 -->
+        <PopupForm ref="formRef"/>
+
+    </div>
+</template>
+
+<script setup lang="ts">
+import {ref, onMounted, provide} from 'vue'
+import {orderExpress} from '/@/api/controllerUrls'
+import Table from '/@/components/table/index.vue'
+import TableHeader from '/@/components/table/header/index.vue'
+import {defaultOptButtons} from '/@/components/table'
+import PopupForm from './popupForm.vue'
+import {baTableApi} from '/@/api/common'
+import baTableClass from '/@/utils/baTable'
+
+
+const baTable = new baTableClass(
+    new baTableApi(orderExpress),
+    {
+        dblClickNotEditColumn: [undefined, 'status'],
+        column: [
+            {type: 'selection', align: 'center', operator: false},
+            {label: '所在区(县)', prop: 'expressName', align: 'left', operator: 'LIKE'},
+            {label: '小区名称', prop: 'expressName', align: 'left', operator: 'LIKE'},
+            {label: '楼号', prop: 'expressTypeName', align: 'center', operator: false},
+            {label: '地图', prop: 'expressTypeName', align: 'center', operator: false},
+            {label: '创建人', prop: 'creatorName', align: 'center', width: '120', operator: false},
+            {label: '创建时间', prop: 'createTime', align: 'center', width: '160', operator: false},
+            {
+                label: '操作',
+                align: 'center',
+                width: '160',
+                render: 'buttons',
+                buttons: defaultOptButtons(),
+                operator: false
+            },
+        ],
+    },
+    {
+        defaultItems: {},
+    },
+    {
+        // 获得编辑数据后
+        requestEdit: () => {
+            if (baTable.form.items && !baTable.form.items.icon) baTable.form.items.icon = 'el-icon-Minus'
+        },
+    }
+)
+
+provide('baTable', baTable)
+
+onMounted(() => {
+    baTable.mount()
+    baTable.getIndex()
+})
+</script>
+
+
+<style scoped lang="scss"></style>

+ 116 - 0
src/views/backend/enterprise/project/map/popupForm.vue

@@ -0,0 +1,116 @@
+<template>
+  <!-- 对话框表单 -->
+  <el-dialog custom-class="ba-operate-dialog" :close-on-click-modal="false"
+    :model-value="baTable.form.operate ? true : false" @close="baTable.toggleForm"
+    width="30%"
+    >
+    <template #header>
+      <div class="title" v-drag="['.ba-operate-dialog', '.el-dialog__header']" v-zoom="'.ba-operate-dialog'">
+        {{ baTable.form.operate ? baTable.form.operate == 'edit' ? '编辑' : '添加' : '无标题' }}
+      </div>
+    </template>
+    <el-scrollbar v-loading="baTable.form.loading">
+      <div class="ba-operate-form" :class="'ba-' + baTable.form.operate + '-form'"
+        style="width: calc(100% - 40px);margin-bottom: 40px;">
+        <el-form ref="formRef" @keyup.enter="baTable.onSubmit(formRef)" :model="baTable.form.items"
+          label-position="right" :label-width="'80px'" :rules="rules"
+          v-if="!baTable.form.loading">
+          <el-form-item prop="expressName" label="名称">
+            <el-input v-model="baTable.form.items!.expressName" placeholder="请输入标题"></el-input>
+          </el-form-item>
+          <el-form-item prop="expressType" label="类型">
+            <el-select v-model="baTable.form.items!.expressType" placeholder="请选择类型" style="width: 100%" clearable>
+              <el-option label="快递公司" :value='0' />
+              <el-option label="物流公司" :value='1' />
+            </el-select>
+          </el-form-item>
+          <el-form-item prop="expressStatus" label="状态">
+            <el-select v-model="baTable.form.items!.expressStatus" placeholder="请选择状态" style="width: 100%" clearable>
+              <el-option label="正常" :value='0' />
+              <el-option label="启用" :value='1' />
+            </el-select>
+          </el-form-item>
+        </el-form>
+      </div>
+    </el-scrollbar>
+    <template #footer>
+      <div :style="'width: calc(100% - ' + baTable.form.labelWidth! / 1.8 + 'px)'">
+        <el-button @click="baTable.toggleForm('')">取消</el-button>
+        <el-button v-blur :loading="baTable.form.submitLoading" @click="baTable.onSubmit(formRef)" type="primary">
+          {{ baTable.form.operateIds && baTable.form.operateIds.length > 1 ? '保存并编辑下一项' : '保存' }}
+        </el-button>
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup lang="ts">
+import { ref, reactive, inject } from 'vue'
+
+import type baTableClass from '/@/utils/baTable'
+import type { ElForm, FormItemRule } from 'element-plus'
+import FormItem from '/@/components/formItem/index.vue'
+import { orderExpress } from '/@/api/controllerUrls'
+import { ElNotification } from 'element-plus/es'
+
+const formRef = ref<InstanceType<typeof ElForm>>()
+const baTable = inject('baTable') as baTableClass
+
+
+const rules: Partial<Record<string, FormItemRule[]>> = reactive({
+    expressName: [
+        {
+            required: true,
+            message: '请输入名称',
+            trigger: 'blur',
+        },
+    ],
+    expressType: [
+        {
+            required: true,
+            message: '请选择类型',
+            trigger: 'blur',
+        },
+    ],
+    expressStatus: [
+        {
+            required: true,
+            message: '请选择状态',
+            trigger: 'blur',
+        },
+    ],
+})
+</script>
+
+<style scoped lang="scss">
+.avatar-uploader {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    position: relative;
+    border-radius: var(--el-border-radius-small);
+    box-shadow: var(--el-box-shadow-light);
+    border: 1px dashed var(--color-sub-1);
+    cursor: pointer;
+    overflow: hidden;
+    width: 110px;
+    height: 110px;
+}
+
+.avatar-uploader:hover {
+    border-color: var(--color-primary);
+}
+
+.avatar {
+    width: 110px;
+    height: 110px;
+    display: block;
+}
+
+.image-slot {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    height: 100%;
+}
+</style>

+ 79 - 0
src/views/backend/enterprise/project/parking/index.vue

@@ -0,0 +1,79 @@
+<template>
+  <div class="default-main ">
+    <el-alert class="ba-table-alert" v-if="baTable.table.remark" :title="baTable.table.remark" type="info"
+              show-icon />
+    <el-row>
+      <el-col :span="24">
+
+        <!-- 表格顶部菜单 -->
+        <TableHeader :buttons="['refresh', 'add', 'edit', 'delete', 'comSearch']"
+                     quick-search-placeholder="通过标题模糊搜索"
+                     @action="baTable.onTableHeaderAction" />
+        <!-- 表格 -->
+        <!-- 要使用`el-table`组件原有的属性,直接加在Table标签上即可 -->
+        <Table @action="baTable.onTableAction" />
+      </el-col>
+    </el-row>
+
+    <!-- 表单 -->
+    <PopupForm ref="formRef" />
+
+  </div>
+</template>
+
+<script setup lang="ts">
+import { ref, onMounted, provide } from "vue";
+import { orderExpress } from "/@/api/controllerUrls";
+import Table from "/@/components/table/index.vue";
+import TableHeader from "/@/components/table/header/index.vue";
+import { defaultOptButtons } from "/@/components/table";
+import PopupForm from "./popupForm.vue";
+import { baTableApi } from "/@/api/common";
+import baTableClass from "/@/utils/baTable";
+
+
+const tableRef = ref();
+const baTable = new baTableClass(
+  new baTableApi(orderExpress),
+  {
+    dblClickNotEditColumn: [undefined, "status"],
+    column: [
+      { label: "小区名称", prop: "communityName", align: "left", operator: "LIKE" },
+      { label: "楼号", prop: "buildingNumber", align: "center", operator: false },
+      { label: "现有车位", prop: "carportCount", align: "center", width: "100", operator: false },
+      { label: "剩余车位", prop: "carportReminderCount", align: "center", width: "100", operator: false },
+      { label: "现有车库", prop: "garageCount", align: "center", width: "100", operator: false },
+      { label: "剩余车库", prop: "garageReminderCount", align: "center", width: "100", operator: false },
+      { label: "创建人", prop: "creatorName", align: "center", width: "120", operator: false },
+      { label: "创建时间", prop: "createTime", align: "center", width: "160", operator: false },
+      {
+        label: "操作",
+        align: "center",
+        width: "160",
+        render: "buttons",
+        buttons: defaultOptButtons(),
+        operator: false
+      }
+    ]
+  },
+  {
+    defaultItems: {}
+  },
+  {
+    // 获得编辑数据后
+    requestEdit: () => {
+      if (baTable.form.items && !baTable.form.items.icon) baTable.form.items.icon = "el-icon-Minus";
+    }
+  }
+);
+
+provide("baTable", baTable);
+
+onMounted(() => {
+  baTable.mount();
+  baTable.getIndex();
+});
+</script>
+
+
+<style scoped lang="scss"></style>

+ 116 - 0
src/views/backend/enterprise/project/parking/popupForm.vue

@@ -0,0 +1,116 @@
+<template>
+  <!-- 对话框表单 -->
+  <el-dialog custom-class="ba-operate-dialog" :close-on-click-modal="false"
+    :model-value="baTable.form.operate ? true : false" @close="baTable.toggleForm"
+    width="30%"
+    >
+    <template #header>
+      <div class="title" v-drag="['.ba-operate-dialog', '.el-dialog__header']" v-zoom="'.ba-operate-dialog'">
+        {{ baTable.form.operate ? baTable.form.operate == 'edit' ? '编辑' : '添加' : '无标题' }}
+      </div>
+    </template>
+    <el-scrollbar v-loading="baTable.form.loading">
+      <div class="ba-operate-form" :class="'ba-' + baTable.form.operate + '-form'"
+        style="width: calc(100% - 40px);margin-bottom: 40px;">
+        <el-form ref="formRef" @keyup.enter="baTable.onSubmit(formRef)" :model="baTable.form.items"
+          label-position="right" :label-width="'80px'" :rules="rules"
+          v-if="!baTable.form.loading">
+          <el-form-item prop="expressName" label="名称">
+            <el-input v-model="baTable.form.items!.expressName" placeholder="请输入标题"></el-input>
+          </el-form-item>
+          <el-form-item prop="expressType" label="类型">
+            <el-select v-model="baTable.form.items!.expressType" placeholder="请选择类型" style="width: 100%" clearable>
+              <el-option label="快递公司" :value='0' />
+              <el-option label="物流公司" :value='1' />
+            </el-select>
+          </el-form-item>
+          <el-form-item prop="expressStatus" label="状态">
+            <el-select v-model="baTable.form.items!.expressStatus" placeholder="请选择状态" style="width: 100%" clearable>
+              <el-option label="正常" :value='0' />
+              <el-option label="启用" :value='1' />
+            </el-select>
+          </el-form-item>
+        </el-form>
+      </div>
+    </el-scrollbar>
+    <template #footer>
+      <div :style="'width: calc(100% - ' + baTable.form.labelWidth! / 1.8 + 'px)'">
+        <el-button @click="baTable.toggleForm('')">取消</el-button>
+        <el-button v-blur :loading="baTable.form.submitLoading" @click="baTable.onSubmit(formRef)" type="primary">
+          {{ baTable.form.operateIds && baTable.form.operateIds.length > 1 ? '保存并编辑下一项' : '保存' }}
+        </el-button>
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup lang="ts">
+import { ref, reactive, inject } from 'vue'
+
+import type baTableClass from '/@/utils/baTable'
+import type { ElForm, FormItemRule } from 'element-plus'
+import FormItem from '/@/components/formItem/index.vue'
+import { orderExpress } from '/@/api/controllerUrls'
+import { ElNotification } from 'element-plus/es'
+
+const formRef = ref<InstanceType<typeof ElForm>>()
+const baTable = inject('baTable') as baTableClass
+
+
+const rules: Partial<Record<string, FormItemRule[]>> = reactive({
+    expressName: [
+        {
+            required: true,
+            message: '请输入名称',
+            trigger: 'blur',
+        },
+    ],
+    expressType: [
+        {
+            required: true,
+            message: '请选择类型',
+            trigger: 'blur',
+        },
+    ],
+    expressStatus: [
+        {
+            required: true,
+            message: '请选择状态',
+            trigger: 'blur',
+        },
+    ],
+})
+</script>
+
+<style scoped lang="scss">
+.avatar-uploader {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    position: relative;
+    border-radius: var(--el-border-radius-small);
+    box-shadow: var(--el-box-shadow-light);
+    border: 1px dashed var(--color-sub-1);
+    cursor: pointer;
+    overflow: hidden;
+    width: 110px;
+    height: 110px;
+}
+
+.avatar-uploader:hover {
+    border-color: var(--color-primary);
+}
+
+.avatar {
+    width: 110px;
+    height: 110px;
+    display: block;
+}
+
+.image-slot {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    height: 100%;
+}
+</style>