Merge remote-tracking branch 'origin/main'
| 
						 | 
					@ -1,3 +1,7 @@
 | 
				
			||||||
# 配置文档参考 https://taro-docs.jd.com/docs/next/env-mode-config
 | 
					# 配置文档参考 https://taro-docs.jd.com/docs/next/env-mode-config
 | 
				
			||||||
TARO_APP_ID="wx0acd1c4fcf94bdd3"
 | 
					TARO_APP_ID="wx0acd1c4fcf94bdd3"
 | 
				
			||||||
TARO_APP_BASE_API="https://www.hnjinglian.cn:5678"
 | 
					TARO_APP_BASE_API="http://172.10.10.93:8765"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# minio
 | 
				
			||||||
 | 
					TARO_APP_MINIO_URL=http://118.253.177.137:9000
 | 
				
			||||||
 | 
					TARO_APP_MINIO_BUCKET=police-security-dev
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,2 +1,6 @@
 | 
				
			||||||
# TARO_APP_ID="wx0acd1c4fcf94bdd3"
 | 
					# TARO_APP_ID="wx0acd1c4fcf94bdd3"
 | 
				
			||||||
TARO_APP_BASE_API="https://www.hnjinglian.cn:5678"
 | 
					TARO_APP_BASE_API="https://www.hnjinglian.cn:5678"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# minio
 | 
				
			||||||
 | 
					TARO_APP_MINIO_URL=https://www.hnjinglian.cn:9002
 | 
				
			||||||
 | 
					TARO_APP_MINIO_BUCKET=police-security
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1 +0,0 @@
 | 
				
			||||||
# TARO_APP_ID="测试环境下的小程序appid"
 | 
					 | 
				
			||||||
| 
		 Before Width: | Height: | Size: 500 KiB  | 
| 
		 Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 30 KiB  | 
| 
		 After Width: | Height: | Size: 37 KiB  | 
| 
		 After Width: | Height: | Size: 38 KiB  | 
| 
		 After Width: | Height: | Size: 31 KiB  | 
| 
		 After Width: | Height: | Size: 32 KiB  | 
| 
		 After Width: | Height: | Size: 35 KiB  | 
| 
		 After Width: | Height: | Size: 35 KiB  | 
| 
						 | 
					@ -20,7 +20,7 @@ export const MINI_PROGRAM_USER_CONFIG: Record<MiniProgramUserIdentity, UserConfi
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        pagePath: 'pages/police/mine/index',
 | 
					        pagePath: 'pages/police/mine/index',
 | 
				
			||||||
        text: '警察我的',
 | 
					        text: '我的',
 | 
				
			||||||
        iconPath: "assets/mine/my.png",
 | 
					        iconPath: "assets/mine/my.png",
 | 
				
			||||||
        selectedIconPath: "assets/mine/my-active.png"
 | 
					        selectedIconPath: "assets/mine/my-active.png"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
| 
						 | 
					@ -37,7 +37,7 @@ export const MINI_PROGRAM_USER_CONFIG: Record<MiniProgramUserIdentity, UserConfi
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        pagePath: 'pages/projectManager/mine/index',
 | 
					        pagePath: 'pages/projectManager/mine/index',
 | 
				
			||||||
        text: '项目经理我的',
 | 
					        text: '我的',
 | 
				
			||||||
        iconPath: "assets/mine/my.png",
 | 
					        iconPath: "assets/mine/my.png",
 | 
				
			||||||
        selectedIconPath: "assets/mine/my-active.png"
 | 
					        selectedIconPath: "assets/mine/my-active.png"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,47 +1,76 @@
 | 
				
			||||||
 | 
					.nameTitle {
 | 
				
			||||||
 | 
					  position: absolute;
 | 
				
			||||||
 | 
					  top: 277rpx;
 | 
				
			||||||
 | 
					  left: 55px;
 | 
				
			||||||
 | 
					  height: 125rpx;
 | 
				
			||||||
 | 
					  background-color: #fff;
 | 
				
			||||||
 | 
					  width: 650rpx;
 | 
				
			||||||
 | 
					  border-radius: 12rpx;
 | 
				
			||||||
 | 
					  box-shadow: 0px 10px 10px -4px #e3e3e3;
 | 
				
			||||||
 | 
					  display: flex;
 | 
				
			||||||
 | 
					  justify-content: space-between;
 | 
				
			||||||
 | 
					  align-items: center;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .itemSchool {
 | 
				
			||||||
 | 
					    border-right: solid 1.5rpx #dadada;
 | 
				
			||||||
 | 
					    display: flex;
 | 
				
			||||||
 | 
					    flex-direction: column;
 | 
				
			||||||
 | 
					    align-items: center;
 | 
				
			||||||
 | 
					    width: 25%;
 | 
				
			||||||
 | 
					    font-size: 24px
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .itemSchool text:nth-child(1) {
 | 
				
			||||||
 | 
					    margin-bottom: 10rpx;
 | 
				
			||||||
 | 
					    color: #898a8a;
 | 
				
			||||||
 | 
					    margin-left: -8px;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					.nameTitle .itemSchool:nth-child(4) {
 | 
				
			||||||
 | 
					  border-right: none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
.swiperDemoItem {
 | 
					.swiperDemoItem {
 | 
				
			||||||
  color: #3886d0;
 | 
					  color: #3886d0;
 | 
				
			||||||
  display: flex;
 | 
					  display: flex;
 | 
				
			||||||
  padding: 20px 0 0 50px;
 | 
					  padding: 20px 0 0 50px;
 | 
				
			||||||
  overflow: hidden;
 | 
					  overflow: hidden;
 | 
				
			||||||
  height: 70rpx;
 | 
					  height: 70rpx;
 | 
				
			||||||
 | 
					  margin-top: 70px;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  .swiperDemoIndex {
 | 
					  .swiperDemoIndex {
 | 
				
			||||||
    width: 15px;
 | 
					    width: 15px;
 | 
				
			||||||
    height: 45px;
 | 
					    height: 45px;
 | 
				
			||||||
    background-image: linear-gradient(to bottom, #5d9cf9, #317ad9);
 | 
					    background-image: linear-gradient(to bottom, #5d9cf9, #317ad9);
 | 
				
			||||||
    //background: rgb();
 | 
					 | 
				
			||||||
    border-radius: 20px;
 | 
					    border-radius: 20px;
 | 
				
			||||||
    margin-right: 15px;
 | 
					    margin-right: 15px;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					.Module {
 | 
				
			||||||
.subModule {
 | 
					  background-color: #fff;
 | 
				
			||||||
 | 
					  overflow: hidden;
 | 
				
			||||||
 | 
					  .subModule {
 | 
				
			||||||
    display: flex;
 | 
					    display: flex;
 | 
				
			||||||
    align-items: center;
 | 
					    align-items: center;
 | 
				
			||||||
    flex-wrap: wrap;
 | 
					    flex-wrap: wrap;
 | 
				
			||||||
  margin-right: -3px;
 | 
					 | 
				
			||||||
  margin-left: -1px;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .subModuleItem {
 | 
					    .subModuleItem {
 | 
				
			||||||
    width: 33%;
 | 
					      width: 246rpx;
 | 
				
			||||||
    height: 180rpx;
 | 
					      height: 140rpx;
 | 
				
			||||||
      display: flex;
 | 
					      display: flex;
 | 
				
			||||||
      flex-direction: column;
 | 
					      flex-direction: column;
 | 
				
			||||||
      align-items: center;
 | 
					      align-items: center;
 | 
				
			||||||
      justify-content: center;
 | 
					      justify-content: center;
 | 
				
			||||||
      padding-bottom: 10rpx;
 | 
					      padding-bottom: 10rpx;
 | 
				
			||||||
    border: 1px solid #ccc;
 | 
					 | 
				
			||||||
    border-left: 0;
 | 
					 | 
				
			||||||
    margin-top: -1px;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      .subModuleIndex {
 | 
					      .subModuleIndex {
 | 
				
			||||||
      width: 65rpx;
 | 
					        width: 45rpx;
 | 
				
			||||||
      height: 65rpx;
 | 
					        height: 45rpx;
 | 
				
			||||||
 | 
					 | 
				
			||||||
        image {
 | 
					        image {
 | 
				
			||||||
          width: 100%;
 | 
					          width: 100%;
 | 
				
			||||||
          height: 100%;
 | 
					          height: 100%;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,47 @@
 | 
				
			||||||
 | 
					.swiperDemoItem {
 | 
				
			||||||
 | 
					  color: #3886d0;
 | 
				
			||||||
 | 
					  display: flex;
 | 
				
			||||||
 | 
					  padding: 20px 0 0 50px;
 | 
				
			||||||
 | 
					  overflow: hidden;
 | 
				
			||||||
 | 
					  height: 70rpx;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .swiperDemoIndex {
 | 
				
			||||||
 | 
					    width: 15px;
 | 
				
			||||||
 | 
					    height: 45px;
 | 
				
			||||||
 | 
					    background-image: linear-gradient(to bottom, #5d9cf9, #317ad9);
 | 
				
			||||||
 | 
					    //background: rgb();
 | 
				
			||||||
 | 
					    border-radius: 20px;
 | 
				
			||||||
 | 
					    margin-right: 15px;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.subModule {
 | 
				
			||||||
 | 
					  display: flex;
 | 
				
			||||||
 | 
					  align-items: center;
 | 
				
			||||||
 | 
					  flex-wrap: wrap;
 | 
				
			||||||
 | 
					  margin-right: -3px;
 | 
				
			||||||
 | 
					  margin-left: -1px;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .subModuleItem {
 | 
				
			||||||
 | 
					    width: 33%;
 | 
				
			||||||
 | 
					    height: 180rpx;
 | 
				
			||||||
 | 
					    display: flex;
 | 
				
			||||||
 | 
					    flex-direction: column;
 | 
				
			||||||
 | 
					    align-items: center;
 | 
				
			||||||
 | 
					    justify-content: center;
 | 
				
			||||||
 | 
					    padding-bottom: 10rpx;
 | 
				
			||||||
 | 
					    border: 1px solid #ccc;
 | 
				
			||||||
 | 
					    border-left: 0;
 | 
				
			||||||
 | 
					    margin-top: -1px;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .subModuleIndex {
 | 
				
			||||||
 | 
					      width: 65rpx;
 | 
				
			||||||
 | 
					      height: 65rpx;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      image {
 | 
				
			||||||
 | 
					        width: 100%;
 | 
				
			||||||
 | 
					        height: 100%;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -3,56 +3,119 @@
 | 
				
			||||||
    <view class="swiperDemo">
 | 
					    <view class="swiperDemo">
 | 
				
			||||||
      <nut-swiper ref="swiperRef" pagination-visible pagination-color="#e53e31" :auto-play="3000" :init-page="0">
 | 
					      <nut-swiper ref="swiperRef" pagination-visible pagination-color="#e53e31" :auto-play="3000" :init-page="0">
 | 
				
			||||||
        <nut-swiper-item v-for="(item, index) in list" :key="index" style="height: 180px">
 | 
					        <nut-swiper-item v-for="(item, index) in list" :key="index" style="height: 180px">
 | 
				
			||||||
          <image src="@/assets/images/01.png" alt="" style="height: 100%; width: 100%" draggable="false"/>
 | 
					          <image :src="item" alt="" style="height: 100%; width: 100%" draggable="false"/>
 | 
				
			||||||
 | 
					          <view>1123</view>
 | 
				
			||||||
        </nut-swiper-item>
 | 
					        </nut-swiper-item>
 | 
				
			||||||
      </nut-swiper>
 | 
					      </nut-swiper>
 | 
				
			||||||
    </view>
 | 
					    </view>
 | 
				
			||||||
 | 
					    <view class="nameTitle">
 | 
				
			||||||
 | 
					      <view class="itemSchool" >
 | 
				
			||||||
 | 
					        <text>单位数量</text>
 | 
				
			||||||
 | 
					        <text
 | 
				
			||||||
 | 
					            style=" white-space: nowrap;overflow: hidden;text-overflow: ellipsis;width: 80px;text-align: center">{{numberStatistics.enterprisesUnitCount}}</text>
 | 
				
			||||||
 | 
					      </view>
 | 
				
			||||||
 | 
					      <view class="itemSchool">
 | 
				
			||||||
 | 
					        <text>服务项目</text>
 | 
				
			||||||
 | 
					        <text>
 | 
				
			||||||
 | 
					          {{numberStatistics.serviceProjectCount}}
 | 
				
			||||||
 | 
					        </text>
 | 
				
			||||||
 | 
					      </view>
 | 
				
			||||||
 | 
					      <view class="itemSchool">
 | 
				
			||||||
 | 
					        <text>有保安证人员</text>
 | 
				
			||||||
 | 
					        <text>{{numberStatistics.securityUserCount}}</text>
 | 
				
			||||||
 | 
					      </view>
 | 
				
			||||||
 | 
					      <view class="itemSchool">
 | 
				
			||||||
 | 
					        <text>无保安证人员</text>
 | 
				
			||||||
 | 
					        <text>{{numberStatistics.noCardSecurityUserCount}}</text>
 | 
				
			||||||
 | 
					      </view>
 | 
				
			||||||
 | 
					    </view>
 | 
				
			||||||
    <view class="swiperDemoItem">
 | 
					    <view class="swiperDemoItem">
 | 
				
			||||||
      <view class="swiperDemoIndex"></view>
 | 
					      <view class="swiperDemoIndex"></view>
 | 
				
			||||||
      <view>请选择</view>
 | 
					      <view>请选择</view>
 | 
				
			||||||
    </view>
 | 
					    </view>
 | 
				
			||||||
    <!--九宫格-->
 | 
					    <!--九宫格-->
 | 
				
			||||||
    <view>
 | 
					    <view class="Module">
 | 
				
			||||||
      <view class="subModule">
 | 
					      <view class="subModule" >
 | 
				
			||||||
        <view class="subModuleItem" v-for="item in subModuleList" :key="item.id" @click="subNavigation(item.url)">
 | 
					        <view class="subModuleItem" v-for="item in subModuleList" :key="item.id"
 | 
				
			||||||
 | 
					              @click="subNavigation(item.url)">
 | 
				
			||||||
          <view class="subModuleIndex">
 | 
					          <view class="subModuleIndex">
 | 
				
			||||||
            <image :src="item.icon"></image>
 | 
					            <image :src="item.icon"></image>
 | 
				
			||||||
          </view>
 | 
					          </view>
 | 
				
			||||||
          <view style=" font-size: 12px;color: #414141;margin-top: 9px">{{ item.name }}</view>
 | 
					          <view style=" font-size: 12px;color: #414141;margin-top: 5px">{{item.name}}</view>
 | 
				
			||||||
        </view>
 | 
					        </view>
 | 
				
			||||||
      </view>
 | 
					      </view>
 | 
				
			||||||
    </view>
 | 
					    </view>
 | 
				
			||||||
 | 
					    <view style="background-color: #e9eef4;height: 15rpx"></view>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  </view>
 | 
					  </view>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
<script setup lang="ts">
 | 
					<script setup lang="ts">
 | 
				
			||||||
import {ref} from 'vue'
 | 
					import {onMounted, ref} from 'vue'
 | 
				
			||||||
import Taro from "@tarojs/taro";
 | 
					import Taro from "@tarojs/taro";
 | 
				
			||||||
import icon from '@/assets/images/project.png'
 | 
					import icon from '@/assets/images/project.png'
 | 
				
			||||||
 | 
					import icon01 from '@/assets/images/回单.jpg'
 | 
				
			||||||
 | 
					import icon02 from '@/assets/images/工单.jpg'
 | 
				
			||||||
 | 
					import icon03 from '@/assets/images/排名.jpg'
 | 
				
			||||||
 | 
					import icon04 from '@/assets/images/法制宣传.jpg'
 | 
				
			||||||
 | 
					import icon06 from '@/assets/images/警保风采.jpg'
 | 
				
			||||||
import './index.scss'
 | 
					import './index.scss'
 | 
				
			||||||
 | 
					import api from "@/request";
 | 
				
			||||||
const list = ref(['https://storage.360buyimg.com/jdc-article/NutUItaro34.jpg',])
 | 
					import {DataStatisticsRes} from "@/types/pages/police";
 | 
				
			||||||
 | 
					const list = ref([process.env.TARO_APP_MINIO_URL + '/police-security/2024/11/5/dunpai.jpg'])
 | 
				
			||||||
const swiperRef = ref() //轮播图
 | 
					const swiperRef = ref() //轮播图
 | 
				
			||||||
const subModuleList = ref([
 | 
					const subModuleList = ref([
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    id: 0,
 | 
					    id: 0,
 | 
				
			||||||
    icon: icon,
 | 
					    icon: icon,
 | 
				
			||||||
    name: '企事业单位',
 | 
					    name: '项目管理',
 | 
				
			||||||
    url: '/subPages/police/myEnterprisesUnit/myEnterprisesUnit'
 | 
					    url: '/subPages/police/myEnterprisesUnit/myEnterprisesUnit'
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    id: 1,
 | 
					    id: 1,
 | 
				
			||||||
    icon: icon,
 | 
					    icon: icon02,
 | 
				
			||||||
    name: '警保风采',
 | 
					    name: '整改工单',
 | 
				
			||||||
    url: ''
 | 
					    url: ''
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    id: 2,
 | 
					    id: 2,
 | 
				
			||||||
    icon: icon,
 | 
					    icon: icon03,
 | 
				
			||||||
    name: '待定',
 | 
					    name: '考核排名',
 | 
				
			||||||
 | 
					    url: ''
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    id: 3,
 | 
				
			||||||
 | 
					    icon: icon06,
 | 
				
			||||||
 | 
					    name: '警保风采',
 | 
				
			||||||
 | 
					    url: ''
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    id: 4,
 | 
				
			||||||
 | 
					    icon: icon04,
 | 
				
			||||||
 | 
					    name: '法制宣传',
 | 
				
			||||||
 | 
					    url: ''
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    id: 5,
 | 
				
			||||||
 | 
					    icon: icon01,
 | 
				
			||||||
 | 
					    name: '整改回单',
 | 
				
			||||||
    url: ''
 | 
					    url: ''
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
])
 | 
					])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const  numberStatistics = ref<DataStatisticsRes>({
 | 
				
			||||||
 | 
					  enterprisesUnitCount:0,
 | 
				
			||||||
 | 
					  serviceProjectCount:0,
 | 
				
			||||||
 | 
					  securityUserCount:0,
 | 
				
			||||||
 | 
					  noCardSecurityUserCount:0
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					const dataStatistics = async ()=>{
 | 
				
			||||||
 | 
					    const resp = await api.get<DataStatisticsRes>('/policeIndex/dataStatistics')
 | 
				
			||||||
 | 
					    numberStatistics.value = resp.data as DataStatisticsRes
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					onMounted(async()=>{
 | 
				
			||||||
 | 
					  await dataStatistics()
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const subNavigation = async (url: string) => Taro.navigateTo({url})
 | 
					const subNavigation = async (url: string) => Taro.navigateTo({url})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,57 @@
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <view>
 | 
				
			||||||
 | 
					    <view class="swiperDemo">
 | 
				
			||||||
 | 
					      <nut-swiper ref="swiperRef" pagination-visible pagination-color="#e53e31" :auto-play="3000" :init-page="0">
 | 
				
			||||||
 | 
					        <nut-swiper-item v-for="(item, index) in list" :key="index" style="height: 200px">
 | 
				
			||||||
 | 
					          <image :src="item" alt="" style="height: 100%; width: 100%" draggable="false"/>
 | 
				
			||||||
 | 
					        </nut-swiper-item>
 | 
				
			||||||
 | 
					      </nut-swiper>
 | 
				
			||||||
 | 
					    </view>
 | 
				
			||||||
 | 
					    <view class="swiperDemoItem">
 | 
				
			||||||
 | 
					      <view class="swiperDemoIndex"></view>
 | 
				
			||||||
 | 
					      <view>请选择</view>
 | 
				
			||||||
 | 
					    </view>
 | 
				
			||||||
 | 
					    <!--九宫格-->
 | 
				
			||||||
 | 
					    <view>
 | 
				
			||||||
 | 
					      <view class="subModule">
 | 
				
			||||||
 | 
					        <view class="subModuleItem" v-for="item in subModuleList" :key="item.id" @click="subNavigation(item.url)">
 | 
				
			||||||
 | 
					          <view class="subModuleIndex">
 | 
				
			||||||
 | 
					            <image :src="item.icon"></image>
 | 
				
			||||||
 | 
					          </view>
 | 
				
			||||||
 | 
					          <view style=" font-size: 12px;color: #414141;margin-top: 9px">{{ item.name }}</view>
 | 
				
			||||||
 | 
					        </view>
 | 
				
			||||||
 | 
					      </view>
 | 
				
			||||||
 | 
					    </view>
 | 
				
			||||||
 | 
					  </view>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					<script setup lang="ts">
 | 
				
			||||||
 | 
					import {ref} from 'vue'
 | 
				
			||||||
 | 
					import Taro from "@tarojs/taro";
 | 
				
			||||||
 | 
					import icon from '@/assets/images/project.png'
 | 
				
			||||||
 | 
					import './index.scss'
 | 
				
			||||||
 | 
					const list = ref([process.env.TARO_APP_MINIO_URL + '/police-security/2024/11/5/dunpai.jpg',process.env.TARO_APP_MINIO_URL + '/police-security/2024/11/5/xingqiu.jpg'])
 | 
				
			||||||
 | 
					const swiperRef = ref() //轮播图
 | 
				
			||||||
 | 
					const subModuleList = ref([
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    id: 0,
 | 
				
			||||||
 | 
					    icon: icon,
 | 
				
			||||||
 | 
					    name: '企事业单位',
 | 
				
			||||||
 | 
					    url: '/subPages/police/myEnterprisesUnit/myEnterprisesUnit'
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    id: 1,
 | 
				
			||||||
 | 
					    icon: icon,
 | 
				
			||||||
 | 
					    name: '警保风采',
 | 
				
			||||||
 | 
					    url: ''
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    id: 2,
 | 
				
			||||||
 | 
					    icon: icon,
 | 
				
			||||||
 | 
					    name: '待定',
 | 
				
			||||||
 | 
					    url: ''
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const subNavigation = async (url: string) => Taro.navigateTo({url})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
| 
						 | 
					@ -1,48 +1,73 @@
 | 
				
			||||||
 | 
					.nameTitle {
 | 
				
			||||||
 | 
					  position: absolute;
 | 
				
			||||||
 | 
					  top: 277rpx;
 | 
				
			||||||
 | 
					  left: 55px;
 | 
				
			||||||
 | 
					  height: 125rpx;
 | 
				
			||||||
 | 
					  background-color: #fff;
 | 
				
			||||||
 | 
					  width: 650rpx;
 | 
				
			||||||
 | 
					  border-radius: 12rpx;
 | 
				
			||||||
 | 
					  box-shadow: 0px 10px 10px -4px #e3e3e3;
 | 
				
			||||||
 | 
					  display: flex;
 | 
				
			||||||
 | 
					  justify-content: space-between;
 | 
				
			||||||
 | 
					  align-items: center;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .itemSchool {
 | 
				
			||||||
 | 
					    border-right: solid 1.5rpx #dadada;
 | 
				
			||||||
 | 
					    display: flex;
 | 
				
			||||||
 | 
					    flex-direction: column;
 | 
				
			||||||
 | 
					    align-items: center;
 | 
				
			||||||
 | 
					    width: 25%;
 | 
				
			||||||
 | 
					    font-size: 24px
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .itemSchool text:nth-child(1) {
 | 
				
			||||||
 | 
					    margin-bottom: 10rpx;
 | 
				
			||||||
 | 
					    color: #898a8a;
 | 
				
			||||||
 | 
					    margin-left: -8px;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
.swiperDemoItem {
 | 
					.swiperDemoItem {
 | 
				
			||||||
  color: #3886d0;
 | 
					  color: #3886d0;
 | 
				
			||||||
  display: flex;
 | 
					  display: flex;
 | 
				
			||||||
  padding: 20px 0 0 50px;
 | 
					  padding: 20px 0 0 50px;
 | 
				
			||||||
  overflow: hidden;
 | 
					  overflow: hidden;
 | 
				
			||||||
  height: 70rpx;
 | 
					  height: 70rpx;
 | 
				
			||||||
 | 
					  margin-top: 70px;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  .swiperDemoIndex {
 | 
					  .swiperDemoIndex {
 | 
				
			||||||
    width: 15px;
 | 
					    width: 15px;
 | 
				
			||||||
    height: 45px;
 | 
					    height: 45px;
 | 
				
			||||||
    background-image: linear-gradient(to bottom, #5d9cf9, #317ad9);
 | 
					    background-image: linear-gradient(to bottom, #5d9cf9, #317ad9);
 | 
				
			||||||
    //background: rgb();
 | 
					 | 
				
			||||||
    border-radius: 20px;
 | 
					    border-radius: 20px;
 | 
				
			||||||
    margin-right: 15px;
 | 
					    margin-right: 15px;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					.Module {
 | 
				
			||||||
.subModule {
 | 
					  background-color: #fff;
 | 
				
			||||||
 | 
					  overflow: hidden;
 | 
				
			||||||
 | 
					  .subModule {
 | 
				
			||||||
    display: flex;
 | 
					    display: flex;
 | 
				
			||||||
    align-items: center;
 | 
					    align-items: center;
 | 
				
			||||||
    flex-wrap: wrap;
 | 
					    flex-wrap: wrap;
 | 
				
			||||||
  margin-right: -3px;
 | 
					 | 
				
			||||||
  margin-left: -1px;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .subModuleItem {
 | 
					    .subModuleItem {
 | 
				
			||||||
    width: 33%;
 | 
					      width: 246rpx;
 | 
				
			||||||
    height: 180rpx;
 | 
					      height: 140rpx;
 | 
				
			||||||
      display: flex;
 | 
					      display: flex;
 | 
				
			||||||
      flex-direction: column;
 | 
					      flex-direction: column;
 | 
				
			||||||
      align-items: center;
 | 
					      align-items: center;
 | 
				
			||||||
      justify-content: center;
 | 
					      justify-content: center;
 | 
				
			||||||
      padding-bottom: 10rpx;
 | 
					      padding-bottom: 10rpx;
 | 
				
			||||||
    border: 1px solid #ccc;
 | 
					 | 
				
			||||||
    border-left: 0;
 | 
					 | 
				
			||||||
    margin-top: -1px;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      .subModuleIndex {
 | 
					      .subModuleIndex {
 | 
				
			||||||
      width: 65rpx;
 | 
					        width: 45rpx;
 | 
				
			||||||
      height: 65rpx;
 | 
					        height: 45rpx;
 | 
				
			||||||
 | 
					 | 
				
			||||||
        image {
 | 
					        image {
 | 
				
			||||||
          width: 100%;
 | 
					          width: 100%;
 | 
				
			||||||
          height: 100%;
 | 
					          height: 100%;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,51 +4,99 @@
 | 
				
			||||||
      <nut-swiper ref="swiperRef" pagination-visible pagination-color="#e53e31" :auto-play="3000" :init-page="0">
 | 
					      <nut-swiper ref="swiperRef" pagination-visible pagination-color="#e53e31" :auto-play="3000" :init-page="0">
 | 
				
			||||||
        <nut-swiper-item v-for="(item, index) in list" :key="index" style="height: 180px">
 | 
					        <nut-swiper-item v-for="(item, index) in list" :key="index" style="height: 180px">
 | 
				
			||||||
          <image :src="item" alt="" style="height: 100%; width: 100%" draggable="false"/>
 | 
					          <image :src="item" alt="" style="height: 100%; width: 100%" draggable="false"/>
 | 
				
			||||||
 | 
					          <view>1123</view>
 | 
				
			||||||
        </nut-swiper-item>
 | 
					        </nut-swiper-item>
 | 
				
			||||||
      </nut-swiper>
 | 
					      </nut-swiper>
 | 
				
			||||||
    </view>
 | 
					    </view>
 | 
				
			||||||
 | 
					    <view class="nameTitle">
 | 
				
			||||||
 | 
					      <view class="itemSchool" >
 | 
				
			||||||
 | 
					        <text>单位数量</text>
 | 
				
			||||||
 | 
					        <text
 | 
				
			||||||
 | 
					            style=" white-space: nowrap;overflow: hidden;text-overflow: ellipsis;width: 80px;text-align: center">51</text>
 | 
				
			||||||
 | 
					      </view>
 | 
				
			||||||
 | 
					      <view class="itemSchool">
 | 
				
			||||||
 | 
					        <text>服务项目</text>
 | 
				
			||||||
 | 
					        <text>
 | 
				
			||||||
 | 
					          13123
 | 
				
			||||||
 | 
					        </text>
 | 
				
			||||||
 | 
					      </view>
 | 
				
			||||||
 | 
					      <view class="itemSchool">
 | 
				
			||||||
 | 
					        <text>有保安证人员</text>
 | 
				
			||||||
 | 
					        <text> 1000</text>
 | 
				
			||||||
 | 
					      </view>
 | 
				
			||||||
 | 
					      <view class="itemSchool">
 | 
				
			||||||
 | 
					        <text>无保安证人员</text>
 | 
				
			||||||
 | 
					        <text> 140</text>
 | 
				
			||||||
 | 
					      </view>
 | 
				
			||||||
 | 
					    </view>
 | 
				
			||||||
    <view class="swiperDemoItem">
 | 
					    <view class="swiperDemoItem">
 | 
				
			||||||
      <view class="swiperDemoIndex"></view>
 | 
					      <view class="swiperDemoIndex"></view>
 | 
				
			||||||
      <view>请选择</view>
 | 
					      <view>请选择</view>
 | 
				
			||||||
    </view>
 | 
					    </view>
 | 
				
			||||||
    <!--九宫格-->
 | 
					    <!--九宫格-->
 | 
				
			||||||
    <view>
 | 
					    <view class="Module">
 | 
				
			||||||
      <view class="subModule">
 | 
					      <view class="subModule" >
 | 
				
			||||||
        <view class="subModuleItem" v-for="item in subModuleList" :key="item.id" @click="subNavigation(item.url)">
 | 
					        <view class="subModuleItem" v-for="item in subModuleList" :key="item.id"
 | 
				
			||||||
 | 
					              @click="subNavigation(item.url)">
 | 
				
			||||||
          <view class="subModuleIndex">
 | 
					          <view class="subModuleIndex">
 | 
				
			||||||
            <image :src="item.icon"></image>
 | 
					            <image :src="item.icon"></image>
 | 
				
			||||||
          </view>
 | 
					          </view>
 | 
				
			||||||
          <view style=" font-size: 12px;color: #414141;margin-top: 9px">{{ item.name }}</view>
 | 
					          <view style=" font-size: 12px;color: #414141;margin-top: 5px">{{item.name}}</view>
 | 
				
			||||||
        </view>
 | 
					        </view>
 | 
				
			||||||
      </view>
 | 
					      </view>
 | 
				
			||||||
    </view>
 | 
					    </view>
 | 
				
			||||||
 | 
					    <view style="background-color: #e9eef4;height: 15rpx"></view>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  </view>
 | 
					  </view>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
<script setup lang="ts">
 | 
					<script setup lang="ts">
 | 
				
			||||||
import {ref} from 'vue'
 | 
					import {ref} from 'vue'
 | 
				
			||||||
import Taro from "@tarojs/taro";
 | 
					import Taro from "@tarojs/taro";
 | 
				
			||||||
import icon from '@/assets/images/project.png'
 | 
					import icon from '@/assets/images/project.png'
 | 
				
			||||||
import './index.scss'
 | 
					import icon01 from '@/assets/images/回单.jpg'
 | 
				
			||||||
 | 
					import icon02 from '@/assets/images/工单.jpg'
 | 
				
			||||||
 | 
					import icon03 from '@/assets/images/排名.jpg'
 | 
				
			||||||
 | 
					import icon04 from '@/assets/images/法制宣传.jpg'
 | 
				
			||||||
 | 
					import icon06 from '@/assets/images/警保风采.jpg'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const list = ref(['/assets/images/01.png',])
 | 
					import './index.scss'
 | 
				
			||||||
 | 
					const list = ref([process.env.TARO_APP_MINIO_URL + '/police-security/2024/11/5/dunpai.jpg'])
 | 
				
			||||||
const swiperRef = ref() //轮播图
 | 
					const swiperRef = ref() //轮播图
 | 
				
			||||||
const subModuleList = ref([
 | 
					const subModuleList = ref([
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    id: 0,
 | 
					    id: 0,
 | 
				
			||||||
    icon: icon,
 | 
					    icon: icon,
 | 
				
			||||||
    name: '我的项目',
 | 
					    name: '项目管理',
 | 
				
			||||||
    url: '/subPages/projectManager/myProject/myProject'
 | 
					    url: '/subPages/projectManager/myProject/myProject'
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    id: 1,
 | 
					    id: 1,
 | 
				
			||||||
    icon: icon,
 | 
					    icon: icon02,
 | 
				
			||||||
    name: '警保风采',
 | 
					    name: '整改工单',
 | 
				
			||||||
    url: ''
 | 
					    url: ''
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    id: 2,
 | 
					    id: 2,
 | 
				
			||||||
    icon: icon,
 | 
					    icon: icon03,
 | 
				
			||||||
    name: '待定',
 | 
					    name: '考核排名',
 | 
				
			||||||
 | 
					    url: ''
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    id: 3,
 | 
				
			||||||
 | 
					    icon: icon06,
 | 
				
			||||||
 | 
					    name: '警保风采',
 | 
				
			||||||
 | 
					    url: ''
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    id: 4,
 | 
				
			||||||
 | 
					    icon: icon04,
 | 
				
			||||||
 | 
					    name: '法制宣传',
 | 
				
			||||||
 | 
					    url: ''
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    id: 5,
 | 
				
			||||||
 | 
					    icon: icon01,
 | 
				
			||||||
 | 
					    name: '整改回单',
 | 
				
			||||||
    url: ''
 | 
					    url: ''
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
])
 | 
					])
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,8 +7,8 @@
 | 
				
			||||||
      <view class="tips-text">
 | 
					      <view class="tips-text">
 | 
				
			||||||
        <view style="font-size: 15px;">名字</view>
 | 
					        <view style="font-size: 15px;">名字</view>
 | 
				
			||||||
        <view style="font-size: 12px;">
 | 
					        <view style="font-size: 12px;">
 | 
				
			||||||
          <text style="margin-right: 5px">教育部门 </text>
 | 
					          <text style="margin-right: 5px">保安部门 </text>
 | 
				
			||||||
          <text>未选择学校</text>
 | 
					          <text>未选择单位</text>
 | 
				
			||||||
        </view>
 | 
					        </view>
 | 
				
			||||||
      </view>
 | 
					      </view>
 | 
				
			||||||
    </view>
 | 
					    </view>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -33,13 +33,7 @@
 | 
				
			||||||
            </nut-radio>
 | 
					            </nut-radio>
 | 
				
			||||||
          </nut-radio-group>
 | 
					          </nut-radio-group>
 | 
				
			||||||
        </nut-form-item>
 | 
					        </nut-form-item>
 | 
				
			||||||
        <nut-form-item label="手机号:">
 | 
					
 | 
				
			||||||
          <nut-input
 | 
					 | 
				
			||||||
            v-model="formData.telephone"
 | 
					 | 
				
			||||||
            placeholder="请输入手机号码"
 | 
					 | 
				
			||||||
            type="text"
 | 
					 | 
				
			||||||
          />
 | 
					 | 
				
			||||||
        </nut-form-item>
 | 
					 | 
				
			||||||
        <nut-form-item label="行政区划:" prop="name">
 | 
					        <nut-form-item label="行政区划:" prop="name">
 | 
				
			||||||
          <view @click="visible = true" style="color: #808080">
 | 
					          <view @click="visible = true" style="color: #808080">
 | 
				
			||||||
            {{ streetCommunitySmallCommunityLabel || "请选择行政区划" }}
 | 
					            {{ streetCommunitySmallCommunityLabel || "请选择行政区划" }}
 | 
				
			||||||
| 
						 | 
					@ -55,8 +49,9 @@
 | 
				
			||||||
        v-model:visible="visible"
 | 
					        v-model:visible="visible"
 | 
				
			||||||
        v-model="TreeValue"
 | 
					        v-model="TreeValue"
 | 
				
			||||||
        title="选择地址"
 | 
					        title="选择地址"
 | 
				
			||||||
        :options="TreeData"
 | 
					 | 
				
			||||||
        @change="change"
 | 
					        @change="change"
 | 
				
			||||||
 | 
					        lazy
 | 
				
			||||||
 | 
					        :lazy-load="lazyLoad"
 | 
				
			||||||
        text-key="label"
 | 
					        text-key="label"
 | 
				
			||||||
      ></nut-cascader>
 | 
					      ></nut-cascader>
 | 
				
			||||||
      <nut-popup v-model:visible="show" position="bottom">
 | 
					      <nut-popup v-model:visible="show" position="bottom">
 | 
				
			||||||
| 
						 | 
					@ -95,18 +90,28 @@ const formData = ref<RegisterParams>({
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
const show = ref(false)
 | 
					const show = ref(false)
 | 
				
			||||||
const visible = ref(false)
 | 
					const visible = ref(false)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const TreeValue = ref<Record<string, any>[]>([])
 | 
					const TreeValue = ref<Record<string, any>[]>([])
 | 
				
			||||||
const TreeData = ref(['']);
 | 
					// const TreeData = ref([]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const streetCommunitySmallCommunityLabel = ref<string>("");
 | 
					const streetCommunitySmallCommunityLabel = ref<string>("");
 | 
				
			||||||
const getAdministrativeDivisionTree = async () => {
 | 
					const getAdministrativeDivisionTree = async (value:string) => {
 | 
				
			||||||
  const resp = await api.get<TreeNodeVo<string>[]>('/common/administrativeDivisionTree')
 | 
					  const resp = await api.get<TreeNodeVo<string>[]>('/common/administrativeDivisionByParentCode',{parentCode:value})
 | 
				
			||||||
  TreeData.value = resp.data as any
 | 
					  return resp.data as any
 | 
				
			||||||
  console.log(resp.data)
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
const change = (value: string, pathNodes: Record<string, any>[]) => {
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const change = async (value: string, pathNodes: Record<string, any>[]) => {
 | 
				
			||||||
  streetCommunitySmallCommunityLabel.value = pathNodes.map((e) => e.text).join(",");
 | 
					  streetCommunitySmallCommunityLabel.value = pathNodes.map((e) => e.text).join(",");
 | 
				
			||||||
  TreeValue.value = value as any
 | 
					  TreeValue.value = value as any
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					const lazyLoad = async (node:any, resolve:any)=>{
 | 
				
			||||||
 | 
					    if (node.root) {
 | 
				
			||||||
 | 
					       await resolve(getAdministrativeDivisionTree ('0'))
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        await resolve(getAdministrativeDivisionTree (node.value))
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
const columns = ref([])
 | 
					const columns = ref([])
 | 
				
			||||||
const unitsList = async () => {
 | 
					const unitsList = async () => {
 | 
				
			||||||
  if (streetCommunitySmallCommunityLabel.value !== '') {
 | 
					  if (streetCommunitySmallCommunityLabel.value !== '') {
 | 
				
			||||||
| 
						 | 
					@ -126,7 +131,7 @@ const unitsList = async () => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const selectedLabel = ref('')
 | 
					const selectedLabel = ref('')
 | 
				
			||||||
const confirm = ({selectedOptions, selectedValue}) => {
 | 
					const confirm = ({selectedOptions}) => {
 | 
				
			||||||
  Object.keys(selectedOptions).forEach((e) => {
 | 
					  Object.keys(selectedOptions).forEach((e) => {
 | 
				
			||||||
    selectedLabel.value = selectedOptions[e].label
 | 
					    selectedLabel.value = selectedOptions[e].label
 | 
				
			||||||
    formData.value.unitId = selectedOptions[e].value
 | 
					    formData.value.unitId = selectedOptions[e].value
 | 
				
			||||||
| 
						 | 
					@ -136,7 +141,7 @@ const confirm = ({selectedOptions, selectedValue}) => {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 身份
 | 
					// 身份
 | 
				
			||||||
watch(() => formData.value.identity, (value) => {
 | 
					watch(() => formData.value.identity, () => {
 | 
				
			||||||
  formData.value.unitId = ''
 | 
					  formData.value.unitId = ''
 | 
				
			||||||
  selectedLabel.value = ''
 | 
					  selectedLabel.value = ''
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
| 
						 | 
					@ -165,7 +170,7 @@ const register = async () => {
 | 
				
			||||||
        await Taro.setStorage({
 | 
					        await Taro.setStorage({
 | 
				
			||||||
          key: "token",
 | 
					          key: "token",
 | 
				
			||||||
          data: resp.data,
 | 
					          data: resp.data,
 | 
				
			||||||
          success(res) {
 | 
					          success() {
 | 
				
			||||||
            Taro.navigateTo({
 | 
					            Taro.navigateTo({
 | 
				
			||||||
              url: '/pages/login/login'
 | 
					              url: '/pages/login/login'
 | 
				
			||||||
            })
 | 
					            })
 | 
				
			||||||
| 
						 | 
					@ -209,10 +214,10 @@ const onChooseAvatar = (e) => {
 | 
				
			||||||
  formData.value.avatar = avatarUrl
 | 
					  formData.value.avatar = avatarUrl
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
// 获取昵称
 | 
					// 获取昵称
 | 
				
			||||||
const getNickname = (e) => {
 | 
					// const getNickname = (e) => {
 | 
				
			||||||
  formData.value.name = e.detail.value
 | 
					//   formData.value.name = e.detail.value
 | 
				
			||||||
  console.log(formData.value.name)
 | 
					//   console.log(formData.value.name)
 | 
				
			||||||
}
 | 
					// }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
onMounted(async () => {
 | 
					onMounted(async () => {
 | 
				
			||||||
  await getAdministrativeDivisionTree()
 | 
					  await getAdministrativeDivisionTree()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -30,6 +30,7 @@ class CustomRequest {
 | 
				
			||||||
  BASE_API: string = process.env.TARO_APP_BASE_API;
 | 
					  BASE_API: string = process.env.TARO_APP_BASE_API;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private request<T>(url: string, method: keyof Taro.request.Method, options: ApiOptions, params?: object,): Promise<JsonResult<T>> {
 | 
					  private request<T>(url: string, method: keyof Taro.request.Method, options: ApiOptions, params?: object,): Promise<JsonResult<T>> {
 | 
				
			||||||
 | 
					    // console.log(this.BASE_API,'0000000')
 | 
				
			||||||
    return new Promise<JsonResult<T>>((resolve, reject) => {
 | 
					    return new Promise<JsonResult<T>>((resolve, reject) => {
 | 
				
			||||||
      if (options.loading) {
 | 
					      if (options.loading) {
 | 
				
			||||||
        Taro.showLoading({
 | 
					        Taro.showLoading({
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -62,7 +62,7 @@
 | 
				
			||||||
                  <text>职位:{{ item.workPost ? item.workPost : '无' }}</text>
 | 
					                  <text>职位:{{ item.workPost ? item.workPost : '无' }}</text>
 | 
				
			||||||
                </view>
 | 
					                </view>
 | 
				
			||||||
                <view style="display: flex;justify-content: space-between">
 | 
					                <view style="display: flex;justify-content: space-between">
 | 
				
			||||||
                  <text>保安证件:{{ item.securityNumber ? item.securityNumber : '125241256451' }}</text>
 | 
					                  <text>保安证件:{{ item.securityNumber ? item.securityNumber : '无' }}</text>
 | 
				
			||||||
                  <text>出生年月:{{ dayjs(item.dateOfBirth).format('YYYY-MM-DD') }}</text>
 | 
					                  <text>出生年月:{{ dayjs(item.dateOfBirth).format('YYYY-MM-DD') }}</text>
 | 
				
			||||||
                </view>
 | 
					                </view>
 | 
				
			||||||
                <view style="display: flex;justify-content: space-between">
 | 
					                <view style="display: flex;justify-content: space-between">
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,13 @@
 | 
				
			||||||
 | 
					export interface DataStatisticsRes {
 | 
				
			||||||
 | 
					    /*企事业单位数量 */
 | 
				
			||||||
 | 
					    enterprisesUnitCount: number;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*服务项目数量 */
 | 
				
			||||||
 | 
					    serviceProjectCount: number;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*保安人员数量 */
 | 
				
			||||||
 | 
					    securityUserCount: number;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*无证保安人员数量 */
 | 
				
			||||||
 | 
					    noCardSecurityUserCount: number;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -16,6 +16,7 @@ declare module 'vue' {
 | 
				
			||||||
    AConfigProvider: typeof import('ant-design-vue/es')['ConfigProvider']
 | 
					    AConfigProvider: typeof import('ant-design-vue/es')['ConfigProvider']
 | 
				
			||||||
    ADatePicker: typeof import('ant-design-vue/es')['DatePicker']
 | 
					    ADatePicker: typeof import('ant-design-vue/es')['DatePicker']
 | 
				
			||||||
    ADivider: typeof import('ant-design-vue/es')['Divider']
 | 
					    ADivider: typeof import('ant-design-vue/es')['Divider']
 | 
				
			||||||
 | 
					    AdministrativeDivisionTree: typeof import('./src/components/tree/AdministrativeDivisionTree.vue')['default']
 | 
				
			||||||
    ADropdown: typeof import('ant-design-vue/es')['Dropdown']
 | 
					    ADropdown: typeof import('ant-design-vue/es')['Dropdown']
 | 
				
			||||||
    AForm: typeof import('ant-design-vue/es')['Form']
 | 
					    AForm: typeof import('ant-design-vue/es')['Form']
 | 
				
			||||||
    AFormItem: typeof import('ant-design-vue/es')['FormItem']
 | 
					    AFormItem: typeof import('ant-design-vue/es')['FormItem']
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,18 +1,24 @@
 | 
				
			||||||
declare const __APP_ENV: ImportMetaEnv;
 | 
					declare const __APP_ENV: ImportMetaEnv;
 | 
				
			||||||
 | 
					class TreeNodeVo<T, E = Record<string, any>> {
 | 
				
			||||||
 | 
					    value: T;
 | 
				
			||||||
 | 
					    parentValue: T;
 | 
				
			||||||
 | 
					    label: string;
 | 
				
			||||||
 | 
					    orderIndex?: number;
 | 
				
			||||||
 | 
					    children?: TreeNodeVo<T>[]
 | 
				
			||||||
 | 
					    extData?: E;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
declare global {
 | 
					/**
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
 * 全局返回
 | 
					 * 全局返回
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    interface JsonResult<T> {
 | 
					interface JsonResult<T> {
 | 
				
			||||||
    code: number;
 | 
					    code: number;
 | 
				
			||||||
    message: string;
 | 
					    message: string;
 | 
				
			||||||
    data?: T;
 | 
					    data?: T;
 | 
				
			||||||
    }
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface SecurityUnitPagerQueryParams {
 | 
				
			||||||
    export interface SecurityUnitPagerQueryParams {
 | 
					 | 
				
			||||||
    /** 名称 **/
 | 
					    /** 名称 **/
 | 
				
			||||||
    name?: string;
 | 
					    name?: string;
 | 
				
			||||||
    /** 社会编码 **/
 | 
					    /** 社会编码 **/
 | 
				
			||||||
| 
						 | 
					@ -23,20 +29,20 @@ declare global {
 | 
				
			||||||
    isEnable?: number;
 | 
					    isEnable?: number;
 | 
				
			||||||
    /** 审核状态 **/
 | 
					    /** 审核状态 **/
 | 
				
			||||||
    checkStatus?: number;
 | 
					    checkStatus?: number;
 | 
				
			||||||
    }
 | 
					}
 | 
				
			||||||
    interface BaseEnum<T> {
 | 
					interface BaseEnum<T> {
 | 
				
			||||||
    value: T;
 | 
					    value: T;
 | 
				
			||||||
    label: string
 | 
					    label: string
 | 
				
			||||||
    }
 | 
					}
 | 
				
			||||||
    class TreeNodeVo<T, E = Record<string, any>> {
 | 
					class TreeNodeVo<T, E = Record<string, any>> {
 | 
				
			||||||
    value: T;
 | 
					    value: T;
 | 
				
			||||||
    parentValue: T;
 | 
					    parentValue: T;
 | 
				
			||||||
    label: string;
 | 
					    label: string;
 | 
				
			||||||
    orderIndex?: number;
 | 
					    orderIndex?: number;
 | 
				
			||||||
    children?: TreeNodeVo<T>[]
 | 
					    children?: TreeNodeVo<T>[]
 | 
				
			||||||
    extData?: E;
 | 
					    extData?: E;
 | 
				
			||||||
    }
 | 
					}
 | 
				
			||||||
    declare interface Grid {
 | 
					interface Grid {
 | 
				
			||||||
    //栅格占据的列数
 | 
					    //栅格占据的列数
 | 
				
			||||||
    span?: number;
 | 
					    span?: number;
 | 
				
			||||||
    //栅格左侧的间隔格数
 | 
					    //栅格左侧的间隔格数
 | 
				
			||||||
| 
						 | 
					@ -55,8 +61,8 @@ declare global {
 | 
				
			||||||
    lg?: number;
 | 
					    lg?: number;
 | 
				
			||||||
    //≥1920px 响应式栅格数或者栅格属性对象
 | 
					    //≥1920px 响应式栅格数或者栅格属性对象
 | 
				
			||||||
    xl?: number;
 | 
					    xl?: number;
 | 
				
			||||||
    }
 | 
					}
 | 
				
			||||||
    interface dataStatus {
 | 
					interface dataStatus {
 | 
				
			||||||
    account: string;
 | 
					    account: string;
 | 
				
			||||||
    password: string;
 | 
					    password: string;
 | 
				
			||||||
    remark: string;
 | 
					    remark: string;
 | 
				
			||||||
| 
						 | 
					@ -67,35 +73,35 @@ declare global {
 | 
				
			||||||
        label: string;
 | 
					        label: string;
 | 
				
			||||||
        value: number;
 | 
					        value: number;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    }
 | 
					}
 | 
				
			||||||
    class SelectNodeVo<T, E = Record<string, any>> {
 | 
					class SelectNodeVo<T, E = Record<string, any>> {
 | 
				
			||||||
    value: T;
 | 
					    value: T;
 | 
				
			||||||
    label: string;
 | 
					    label: string;
 | 
				
			||||||
    options?: SelectNodeVo<T>[]
 | 
					    options?: SelectNodeVo<T>[]
 | 
				
			||||||
    orderIndex?: number;
 | 
					    orderIndex?: number;
 | 
				
			||||||
    disabled?: boolean;
 | 
					    disabled?: boolean;
 | 
				
			||||||
    extData?: E
 | 
					    extData?: E
 | 
				
			||||||
    }
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    interface ExtData {
 | 
					interface ExtData {
 | 
				
			||||||
    color?: string;
 | 
					    color?: string;
 | 
				
			||||||
    }
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    interface Option {
 | 
					interface Option {
 | 
				
			||||||
    label: string;
 | 
					    label: string;
 | 
				
			||||||
    value: string | number;
 | 
					    value: string | number;
 | 
				
			||||||
    extData?: ExtData | null;
 | 
					    extData?: ExtData | null;
 | 
				
			||||||
    }
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    interface OptionsResponse {
 | 
					interface OptionsResponse {
 | 
				
			||||||
    IsEnable: Option[];
 | 
					    IsEnable: Option[];
 | 
				
			||||||
    IsOrNot: Option[];
 | 
					    IsOrNot: Option[];
 | 
				
			||||||
    Sex: Option[];
 | 
					    Sex: Option[];
 | 
				
			||||||
    CheckStatus: Option[];
 | 
					    CheckStatus: Option[];
 | 
				
			||||||
    ServiceProjectType: Option[];
 | 
					    ServiceProjectType: Option[];
 | 
				
			||||||
    DeleteFlag: Option[];
 | 
					    DeleteFlag: Option[];
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -67,6 +67,7 @@
 | 
				
			||||||
            :allowClear="item.componentsProps?.allowClear ?? true"
 | 
					            :allowClear="item.componentsProps?.allowClear ?? true"
 | 
				
			||||||
            :options="item.options"
 | 
					            :options="item.options"
 | 
				
			||||||
          />
 | 
					          />
 | 
				
			||||||
 | 
					          <administrative-division-tree-comp v-else-if="item.type === 'administrativeDivisionTree'" style="width: 100%" v-model:value="modelValue[field]" v-bind="item.componentsProps" />
 | 
				
			||||||
          <a-range-picker
 | 
					          <a-range-picker
 | 
				
			||||||
            v-else-if="item.type === 'rangePicker'"
 | 
					            v-else-if="item.type === 'rangePicker'"
 | 
				
			||||||
            style="width: 100%"
 | 
					            style="width: 100%"
 | 
				
			||||||
| 
						 | 
					@ -111,10 +112,14 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script setup lang="ts" generic="T extends Record<string,any>">
 | 
					<script setup lang="ts" generic="T extends Record<string,any>">
 | 
				
			||||||
import { FormInstance } from 'ant-design-vue'
 | 
					import { FormInstance } from 'ant-design-vue'
 | 
				
			||||||
import { ref } from 'vue'
 | 
					import { defineAsyncComponent, ref } from 'vue'
 | 
				
			||||||
import { FormExpose } from 'ant-design-vue/es/form/Form'
 | 
					import { FormExpose } from 'ant-design-vue/es/form/Form'
 | 
				
			||||||
import { QuestionCircleOutlined } from '@ant-design/icons-vue'
 | 
					import { QuestionCircleOutlined } from '@ant-design/icons-vue'
 | 
				
			||||||
import { FormProMaxItemOptions, FormProMaxItemProps, FormProMaxProps } from '@/types/components/form/index.ts'
 | 
					import { FormProMaxItemOptions, FormProMaxItemProps, FormProMaxProps } from '@/types/components/form/index.ts'
 | 
				
			||||||
 | 
					import { ComponentProps } from 'vue-component-type-helpers'
 | 
				
			||||||
 | 
					import AdministrativeDivisionTree from '@/components/tree/AdministrativeDivisionTree.vue'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const AdministrativeDivisionTreeComp: ComponentProps<typeof AdministrativeDivisionTree> = defineAsyncComponent(() => import('@/components/tree/AdministrativeDivisionTree.vue'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const modelValue = defineModel<T>('value', {
 | 
					const modelValue = defineModel<T>('value', {
 | 
				
			||||||
  default: {},
 | 
					  default: {},
 | 
				
			||||||
| 
						 | 
					@ -147,7 +152,7 @@ const props = withDefaults(defineProps<FormProMaxProps<T>>(), {
 | 
				
			||||||
  scrollToFirstError: undefined,
 | 
					  scrollToFirstError: undefined,
 | 
				
			||||||
  validateOnRuleChange: undefined,
 | 
					  validateOnRuleChange: undefined,
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
console.log(props)
 | 
					
 | 
				
			||||||
const formProMaxRef = ref<FormInstance>(null!)
 | 
					const formProMaxRef = ref<FormInstance>(null!)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const getResponsive = (item: FormProMaxItemProps): Grid => {
 | 
					const getResponsive = (item: FormProMaxItemProps): Grid => {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,84 @@
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <a-cascader
 | 
				
			||||||
 | 
					      v-model:value="modelValue"
 | 
				
			||||||
 | 
					      :placeholder="placeholder"
 | 
				
			||||||
 | 
					      :change-on-select="changeOnSelect"
 | 
				
			||||||
 | 
					      :options="administrativeDivisionTree"
 | 
				
			||||||
 | 
					      :load-data="loadData"
 | 
				
			||||||
 | 
					      :allow-clear="allowClear"
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script setup lang="ts">
 | 
				
			||||||
 | 
					import api from "@/axios";
 | 
				
			||||||
 | 
					import {onMounted, ref} from "vue";
 | 
				
			||||||
 | 
					import {CascaderProps} from "ant-design-vue";
 | 
				
			||||||
 | 
					import {isEmpty} from "lodash-es";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					withDefaults(defineProps<{
 | 
				
			||||||
 | 
					  placeholder?: string,
 | 
				
			||||||
 | 
					  changeOnSelect?: boolean
 | 
				
			||||||
 | 
					  allowClear?: boolean
 | 
				
			||||||
 | 
					}>(), {
 | 
				
			||||||
 | 
					  placeholder: '请选择行政区划',
 | 
				
			||||||
 | 
					  changeOnSelect: true,
 | 
				
			||||||
 | 
					  allowClear: true
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const modelValue = defineModel('value', {
 | 
				
			||||||
 | 
					  default: []
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const administrativeDivisionTree = ref<TreeNodeVo<string>[]>([])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const loadData: CascaderProps['loadData'] = selectedOptions => {
 | 
				
			||||||
 | 
					  const targetOption = selectedOptions[selectedOptions.length - 1];
 | 
				
			||||||
 | 
					  targetOption.loading = true;
 | 
				
			||||||
 | 
					  administrativeDivisionByParentCode(targetOption.value as string).then(data => {
 | 
				
			||||||
 | 
					    targetOption.loading = false
 | 
				
			||||||
 | 
					    targetOption.children = data
 | 
				
			||||||
 | 
					    administrativeDivisionTree.value = [...administrativeDivisionTree.value]
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * 根据父级编码查询行政区划
 | 
				
			||||||
 | 
					 * @param code
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					const administrativeDivisionByParentCode = async (code: string = '0'): Promise<TreeNodeVo<string>[]> => {
 | 
				
			||||||
 | 
					  const resp = await api.get<TreeNodeVo<string>[]>('/common/administrativeDivisionByParentCode', {
 | 
				
			||||||
 | 
					    parentCode: code
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					  //解决点击无加载提示
 | 
				
			||||||
 | 
					  return resp.data.map(item => {
 | 
				
			||||||
 | 
					    delete item.children
 | 
				
			||||||
 | 
					    return item
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					onMounted(async () => {
 | 
				
			||||||
 | 
					  administrativeDivisionTree.value = await administrativeDivisionByParentCode()
 | 
				
			||||||
 | 
					  if (!isEmpty(modelValue.value)) {
 | 
				
			||||||
 | 
					    const ps = modelValue.value.map(code => administrativeDivisionByParentCode(code))
 | 
				
			||||||
 | 
					    Promise.all(ps).then(data => {
 | 
				
			||||||
 | 
					      let i = 0;
 | 
				
			||||||
 | 
					      const deepChildren = (treeData: TreeNodeVo<string>[]) => {
 | 
				
			||||||
 | 
					        treeData.forEach(item => {
 | 
				
			||||||
 | 
					          if (item.value === modelValue.value[i]) {
 | 
				
			||||||
 | 
					            item.children = data[i]
 | 
				
			||||||
 | 
					            i++;
 | 
				
			||||||
 | 
					            deepChildren(item.children)
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      deepChildren(administrativeDivisionTree.value)
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style scoped lang="scss">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
| 
						 | 
					@ -15,6 +15,7 @@ import {
 | 
				
			||||||
} from "ant-design-vue";
 | 
					} from "ant-design-vue";
 | 
				
			||||||
import { Ref, UnwrapRef, VNode } from "vue";
 | 
					import { Ref, UnwrapRef, VNode } from "vue";
 | 
				
			||||||
import { ComponentProps } from "vue-component-type-helpers";
 | 
					import { ComponentProps } from "vue-component-type-helpers";
 | 
				
			||||||
 | 
					import AdministrativeDivisionTree from "@/components/tree/AdministrativeDivisionTree.vue";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type FormProMaxItemType =
 | 
					type FormProMaxItemType =
 | 
				
			||||||
    | 'custom'
 | 
					    | 'custom'
 | 
				
			||||||
| 
						 | 
					@ -32,7 +33,8 @@ type FormProMaxItemType =
 | 
				
			||||||
    | 'datePicker'
 | 
					    | 'datePicker'
 | 
				
			||||||
    | 'rangePicker'
 | 
					    | 'rangePicker'
 | 
				
			||||||
    | 'timeRangePicker'
 | 
					    | 'timeRangePicker'
 | 
				
			||||||
    | 'timePicker';
 | 
					    | 'timePicker'
 | 
				
			||||||
 | 
					    | 'administrativeDivisionTree'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface FormProMaxItemCommonProps extends ComponentProps<typeof FormItem> {
 | 
					interface FormProMaxItemCommonProps extends ComponentProps<typeof FormItem> {
 | 
				
			||||||
    label?: string,
 | 
					    label?: string,
 | 
				
			||||||
| 
						 | 
					@ -64,6 +66,7 @@ export type FormProMaxItemOptions<T> = {
 | 
				
			||||||
    | FormProMaxItemProps<'rangePicker', ComponentProps<typeof RangePicker>>
 | 
					    | FormProMaxItemProps<'rangePicker', ComponentProps<typeof RangePicker>>
 | 
				
			||||||
    | FormProMaxItemProps<'timeRangePicker', ComponentProps<typeof TimeRangePicker>>
 | 
					    | FormProMaxItemProps<'timeRangePicker', ComponentProps<typeof TimeRangePicker>>
 | 
				
			||||||
    | FormProMaxItemProps<'timePicker', ComponentProps<typeof TimePicker>>
 | 
					    | FormProMaxItemProps<'timePicker', ComponentProps<typeof TimePicker>>
 | 
				
			||||||
 | 
					    | FormProMaxItemProps<'administrativeDivisionTree', ComponentProps<typeof AdministrativeDivisionTree>>
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface FormProMaxProps<T = {}> extends FormProps {
 | 
					export interface FormProMaxProps<T = {}> extends FormProps {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,8 +1,7 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
  <div>
 | 
					  <div>
 | 
				
			||||||
    <!-- 企事业单位 -->
 | 
					    <!-- 企事业单位 -->
 | 
				
			||||||
    <TableProMax ref="tableRef" :request-api="reqApi" :columns="columns" :searchFormOptions="searchFormOptions"
 | 
					    <TableProMax ref="tableRef" :request-api="reqApi" :columns="columns" :searchFormOptions="searchFormOptions" :scroll="{ x }">
 | 
				
			||||||
                 :scroll="{ x }">
 | 
					 | 
				
			||||||
      <!-- <template #tableHeader>
 | 
					      <!-- <template #tableHeader>
 | 
				
			||||||
        <a-space>
 | 
					        <a-space>
 | 
				
			||||||
          <a-button type="primary" @click="addUserManagement">新增用户</a-button>
 | 
					          <a-button type="primary" @click="addUserManagement">新增用户</a-button>
 | 
				
			||||||
| 
						 | 
					@ -16,18 +15,18 @@
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script setup lang="tsx">
 | 
					<script setup lang="tsx">
 | 
				
			||||||
import {storeTreeData, loadTreeFromCache} from '@/utils/DB.ts'
 | 
					// import { storeTreeData, loadTreeFromCache } from '@/utils/DB.ts'
 | 
				
			||||||
import api from '@/axios'
 | 
					import api from '@/axios'
 | 
				
			||||||
import {ref, reactive} from 'vue'
 | 
					import { ref, reactive } from 'vue'
 | 
				
			||||||
import TableProMax from '@/components/table/TableProMax.vue'
 | 
					import TableProMax from '@/components/table/TableProMax.vue'
 | 
				
			||||||
import {TableProMaxProps} from '@/types/components/table/index.ts'
 | 
					import { TableProMaxProps } from '@/types/components/table/index.ts'
 | 
				
			||||||
import {ComponentExposed} from 'vue-component-type-helpers'
 | 
					import { ComponentExposed } from 'vue-component-type-helpers'
 | 
				
			||||||
import {dictSelectNodes} from '@/config/dict.ts'
 | 
					import { dictSelectNodes } from '@/config/dict.ts'
 | 
				
			||||||
import {publicUnitPagerQueryParams, FromItem} from '@/types/views/publicUnit.ts'
 | 
					import { publicUnitPagerQueryParams, FromItem } from '@/types/views/publicUnit.ts'
 | 
				
			||||||
// import FormProMax from '@/components/form/FormProMax.vue'
 | 
					// import FormProMax from '@/components/form/FormProMax.vue'
 | 
				
			||||||
import {FormProMaxItemOptions} from '@/types/components/form//index.ts'
 | 
					import { FormProMaxItemOptions } from '@/types/components/form//index.ts'
 | 
				
			||||||
import {FormExpose} from 'ant-design-vue/es/form/Form'
 | 
					import { FormExpose } from 'ant-design-vue/es/form/Form'
 | 
				
			||||||
import {message} from 'ant-design-vue'
 | 
					import { message } from 'ant-design-vue'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const formRef = ref<FormExpose>(null)
 | 
					const formRef = ref<FormExpose>(null)
 | 
				
			||||||
type TableProps = TableProMaxProps<publicUnitPagerQueryParams>
 | 
					type TableProps = TableProMaxProps<publicUnitPagerQueryParams>
 | 
				
			||||||
| 
						 | 
					@ -46,7 +45,7 @@ const columns: TableProps['columns'] = [
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    dataIndex: 'provinceName',
 | 
					    dataIndex: 'provinceName',
 | 
				
			||||||
    title: '行政区划',
 | 
					    title: '行政区划',
 | 
				
			||||||
    customRender: ({record}) => {
 | 
					    customRender: ({ record }) => {
 | 
				
			||||||
      return `${record?.provinceName}/${record?.cityName}/${record?.districtsName}/${record?.streetName}`
 | 
					      return `${record?.provinceName}/${record?.cityName}/${record?.districtsName}/${record?.streetName}`
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
| 
						 | 
					@ -72,14 +71,14 @@ const columns: TableProps['columns'] = [
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    dataIndex: 'contactPersonInfo',
 | 
					    dataIndex: 'contactPersonInfo',
 | 
				
			||||||
    title: '联系人姓名',
 | 
					    title: '联系人姓名',
 | 
				
			||||||
    customRender: ({record}) => {
 | 
					    customRender: ({ record }) => {
 | 
				
			||||||
      return record?.contactPersonInfo?.name
 | 
					      return record?.contactPersonInfo?.name
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    dataIndex: 'contactPersonInfo',
 | 
					    dataIndex: 'contactPersonInfo',
 | 
				
			||||||
    title: '联系人手机号',
 | 
					    title: '联系人手机号',
 | 
				
			||||||
    customRender: ({record}) => {
 | 
					    customRender: ({ record }) => {
 | 
				
			||||||
      return record?.contactPersonInfo?.telephone
 | 
					      return record?.contactPersonInfo?.telephone
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
| 
						 | 
					@ -100,33 +99,34 @@ const addUserManagement = () => {
 | 
				
			||||||
  title.value = ''
 | 
					  title.value = ''
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const getTree = async () => {
 | 
					// const getTree = async () => {
 | 
				
			||||||
  // 先尝试从缓存中加载数据
 | 
					//   // 先尝试从缓存中加载数据
 | 
				
			||||||
  const cachedData = await loadTreeFromCache()
 | 
					//   const cachedData = await loadTreeFromCache()
 | 
				
			||||||
  if (cachedData) {
 | 
					//   if (cachedData) {
 | 
				
			||||||
    console.log('未发请求')
 | 
					//     console.log('未发请求')
 | 
				
			||||||
    // 如果缓存存在,直接使用缓存数据
 | 
					//     // 如果缓存存在,直接使用缓存数据
 | 
				
			||||||
    return cachedData
 | 
					//     return cachedData
 | 
				
			||||||
  } else {
 | 
					//   } else {
 | 
				
			||||||
    console.log('发起了请求')
 | 
					//     console.log('发起了请求')
 | 
				
			||||||
    // 如果缓存不存在,发起 API 请求
 | 
					//     // 如果缓存不存在,发起 API 请求
 | 
				
			||||||
    const res = await api.get<any>('/common/administrativeDivisionTree')
 | 
					//     const res = await api.get<any>('/common/administrativeDivisionTree')
 | 
				
			||||||
    await storeTreeData(res.data)
 | 
					//     await storeTreeData(res.data)
 | 
				
			||||||
    return res.data
 | 
					//     return res.data
 | 
				
			||||||
  }
 | 
					//   }
 | 
				
			||||||
}
 | 
					// }
 | 
				
			||||||
const loadOptions = async () => {
 | 
					// const loadOptions = async () => {
 | 
				
			||||||
  const treeData = await getTree()
 | 
					//   const treeData = await getTree()
 | 
				
			||||||
  searchFormOptions.treeSelect.options = treeData
 | 
					//   searchFormOptions.treeSelect.options = treeData
 | 
				
			||||||
}
 | 
					// }
 | 
				
			||||||
loadOptions()
 | 
					// loadOptions()
 | 
				
			||||||
const searchFormOptions = reactive<TableProps['searchFormOptions']>({
 | 
					const searchFormOptions = reactive<TableProps['searchFormOptions']>({
 | 
				
			||||||
  name: {
 | 
					  name: {
 | 
				
			||||||
    type: 'input',
 | 
					    type: 'input',
 | 
				
			||||||
    label: '名称',
 | 
					    label: '名称',
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  treeSelect: {
 | 
					  treeSelect: {
 | 
				
			||||||
    type: 'cascader',
 | 
					    // type: 'cascader',
 | 
				
			||||||
 | 
					    type: 'administrativeDivisionTree',
 | 
				
			||||||
    label: '行政区划',
 | 
					    label: '行政区划',
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  telephone: {
 | 
					  telephone: {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,7 +8,7 @@ VITE_APP_BASE_API=/api
 | 
				
			||||||
VITE_APP_PROXY_URL=http://172.10.10.93:8765
 | 
					VITE_APP_PROXY_URL=http://172.10.10.93:8765
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# rsa 公钥
 | 
					# rsa 公钥
 | 
				
			||||||
VITE_APP_RSA_PUBLIC_KEY=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCpu1C3JHZ+Ng/eVVCZtwKsOZv9RktpAL13pKy4FoRHyNv2t8TPV2AMzLzfEzlWx001nBxyVxEMR2N9jAcqFLHv7r16ciOzbtzB9dky2G+bc9jIs4/EdVK5bAZcPRh5Jrb78sC9PHyR4AeceDyCIKHLUbWBJB4NTZE0s1Wh5kMynQIDAQAB
 | 
					VITE_APP_RSA_PUBLIC_KEY=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJps/EXxxSpEM1Ix4R0NWIOBciHCr7P7coDT8tNKfelgR7txcJOqHCO/MIWe7T04aHQTcpQxqx9hMca7dbqz8TZpz9jvLzE/6ZonVKxHsoFnNlHMp1/CPAJ9f6D9wYicum2KltJkmQ0g//D9W2zPCYoGOmSRFcZx/KEBa4EM53jQIDAQAB
 | 
				
			||||||
# minio
 | 
					# minio
 | 
				
			||||||
VITE_APP_MINIO_URL=http://118.253.177.137:9000
 | 
					VITE_APP_MINIO_URL=http://118.253.177.137:9000
 | 
				
			||||||
VITE_APP_MINIO_BUCKET=police-security-dev
 | 
					VITE_APP_MINIO_BUCKET=police-security-dev
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -97,6 +97,12 @@
 | 
				
			||||||
              :allowClear="item.componentsProps?.allowClear ?? true"
 | 
					              :allowClear="item.componentsProps?.allowClear ?? true"
 | 
				
			||||||
              :options="item.options"
 | 
					              :options="item.options"
 | 
				
			||||||
          />
 | 
					          />
 | 
				
			||||||
 | 
					          <AdministrativeDivisionsTree
 | 
				
			||||||
 | 
					              v-else-if="item.type ==='administrativeDivisionsTree'"
 | 
				
			||||||
 | 
					              style="width: 100%"
 | 
				
			||||||
 | 
					              v-model:value="modelValue[field]"
 | 
				
			||||||
 | 
					              v-bind="item.componentsProps"
 | 
				
			||||||
 | 
					           />
 | 
				
			||||||
          <a-range-picker
 | 
					          <a-range-picker
 | 
				
			||||||
              v-else-if="item.type ==='rangePicker'"
 | 
					              v-else-if="item.type ==='rangePicker'"
 | 
				
			||||||
              style="width: 100%"
 | 
					              style="width: 100%"
 | 
				
			||||||
| 
						 | 
					@ -145,6 +151,7 @@ import {ref} from "vue";
 | 
				
			||||||
import {FormExpose} from "ant-design-vue/es/form/Form";
 | 
					import {FormExpose} from "ant-design-vue/es/form/Form";
 | 
				
			||||||
import {QuestionCircleOutlined} from '@ant-design/icons-vue'
 | 
					import {QuestionCircleOutlined} from '@ant-design/icons-vue'
 | 
				
			||||||
import {FormProMaxItemOptions, FormProMaxItemProps, FormProMaxProps} from "@/types/components/form/index.ts";
 | 
					import {FormProMaxItemOptions, FormProMaxItemProps, FormProMaxProps} from "@/types/components/form/index.ts";
 | 
				
			||||||
 | 
					import AdministrativeDivisionsTree from "@/components/tree/AdministrativeDivisionsTree.vue";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const modelValue = defineModel<T>('value', {
 | 
					const modelValue = defineModel<T>('value', {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,63 @@
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					    <a-cascader
 | 
				
			||||||
 | 
					        style="width: 500px"
 | 
				
			||||||
 | 
					        v-model:value="modelValue"
 | 
				
			||||||
 | 
					        :options="options"
 | 
				
			||||||
 | 
					        :load-data="loadData"
 | 
				
			||||||
 | 
					        placeholder="请选择行政区划"
 | 
				
			||||||
 | 
					        :change-on-select="changeOnSelect"
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					<script lang="ts" setup>
 | 
				
			||||||
 | 
					import api from "@/axios";
 | 
				
			||||||
 | 
					import {onMounted, ref, watch} from 'vue';
 | 
				
			||||||
 | 
					import type {CascaderProps} from 'ant-design-vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// withDefaultsde作用是设置组件默认值属性,有两个值,第二个值是设置第一个值所有属性的默认值的
 | 
				
			||||||
 | 
					withDefaults(defineProps<{
 | 
				
			||||||
 | 
					  changeOnSelect?:boolean,
 | 
				
			||||||
 | 
					}>(),{
 | 
				
			||||||
 | 
					  changeOnSelect:false
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const modelValue = defineModel('value', {
 | 
				
			||||||
 | 
					  default: [  ]
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					const options = ref<CascaderProps['options']>([]);
 | 
				
			||||||
 | 
					const DivisionTree = async () =>{
 | 
				
			||||||
 | 
					  const resp =  await api.get<TreeNodeVo<string>[]>('/common/administrativeDivisionByParentCode',{parentCode:'0'})
 | 
				
			||||||
 | 
					  options.value =  resp.data as TreeNodeVo<string>[]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					const loadData: CascaderProps['loadData'] = async selectedOptions => {
 | 
				
			||||||
 | 
					  const targetOption = selectedOptions[selectedOptions.length - 1];
 | 
				
			||||||
 | 
					  targetOption.loading = true;
 | 
				
			||||||
 | 
					  const resp =  await api.get<TreeNodeVo<string>[]>('/common/administrativeDivisionByParentCode',{parentCode:targetOption.value})
 | 
				
			||||||
 | 
					  targetOption.loading = false;
 | 
				
			||||||
 | 
					  targetOption.children = [options.value,...resp.data]
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					const transformData =  (val:any,tree:any)=>{
 | 
				
			||||||
 | 
					  for(let i = 0; i< val.length - 1;i++){
 | 
				
			||||||
 | 
					    tree.forEach(async(item:any)=>{
 | 
				
			||||||
 | 
					      if(item.value === val[i]){
 | 
				
			||||||
 | 
					        item.children = []
 | 
				
			||||||
 | 
					        let data =  await api.get<TreeNodeVo<string>[]>('/common/administrativeDivisionByParentCode',{parentCode:val[i]})
 | 
				
			||||||
 | 
					        item.children = data.data.map((items:any)=>{
 | 
				
			||||||
 | 
					          return {
 | 
				
			||||||
 | 
					            label:items.label,
 | 
				
			||||||
 | 
					            value:items.value,
 | 
				
			||||||
 | 
					            isLeaf:items.isLeaf
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        transformData(val,item.children)
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					watch(modelValue,async ()=> await  transformData(modelValue.value,options.value))
 | 
				
			||||||
 | 
					onMounted(async () => {
 | 
				
			||||||
 | 
					  await  DivisionTree()
 | 
				
			||||||
 | 
					  await  transformData(modelValue.value,options.value)
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,6 +6,7 @@
 | 
				
			||||||
        v-else
 | 
					        v-else
 | 
				
			||||||
        :src="minioBaseUrl+modelValue"
 | 
					        :src="minioBaseUrl+modelValue"
 | 
				
			||||||
        alt="avatar"/>
 | 
					        alt="avatar"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <a-button class="btn-success" @click="selectFile">{{ btnLabel }}</a-button>
 | 
					    <a-button class="btn-success" @click="selectFile">{{ btnLabel }}</a-button>
 | 
				
			||||||
    <input id="myFileInput" type="file" style="display: none" ref="fileInput" />
 | 
					    <input id="myFileInput" type="file" style="display: none" ref="fileInput" />
 | 
				
			||||||
  </div>
 | 
					  </div>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -32,7 +32,8 @@ type FormProMaxItemType =
 | 
				
			||||||
    | 'datePicker'
 | 
					    | 'datePicker'
 | 
				
			||||||
    | 'rangePicker'
 | 
					    | 'rangePicker'
 | 
				
			||||||
    | 'timeRangePicker'
 | 
					    | 'timeRangePicker'
 | 
				
			||||||
    | 'timePicker';
 | 
					    | 'timePicker'
 | 
				
			||||||
 | 
					    | 'administrativeDivisionsTree';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface FormProMaxItemCommonProps extends ComponentProps<typeof FormItem> {
 | 
					interface FormProMaxItemCommonProps extends ComponentProps<typeof FormItem> {
 | 
				
			||||||
    label?: string,
 | 
					    label?: string,
 | 
				
			||||||
| 
						 | 
					@ -64,6 +65,7 @@ export type FormProMaxItemOptions<T> = {
 | 
				
			||||||
    | FormProMaxItemProps<'rangePicker', ComponentProps<typeof RangePicker>>
 | 
					    | FormProMaxItemProps<'rangePicker', ComponentProps<typeof RangePicker>>
 | 
				
			||||||
    | FormProMaxItemProps<'timeRangePicker', ComponentProps<typeof TimeRangePicker>>
 | 
					    | FormProMaxItemProps<'timeRangePicker', ComponentProps<typeof TimeRangePicker>>
 | 
				
			||||||
    | FormProMaxItemProps<'timePicker', ComponentProps<typeof TimePicker>>
 | 
					    | FormProMaxItemProps<'timePicker', ComponentProps<typeof TimePicker>>
 | 
				
			||||||
 | 
					    | FormProMaxItemProps<'administrativeDivisionsTree', ComponentProps<Record<string, any>>>
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface FormProMaxProps<T = {}> extends FormProps {
 | 
					export interface FormProMaxProps<T = {}> extends FormProps {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,7 +28,15 @@
 | 
				
			||||||
              <a-input :allowClear="true" v-model:value="formDate.nature"/>
 | 
					              <a-input :allowClear="true" v-model:value="formDate.nature"/>
 | 
				
			||||||
            </a-form-item>
 | 
					            </a-form-item>
 | 
				
			||||||
            <a-form-item label="行政区划"  name="administrativeDivisionCodes">
 | 
					            <a-form-item label="行政区划"  name="administrativeDivisionCodes">
 | 
				
			||||||
              <a-cascader v-model:value="formDate.administrativeDivisionCodes" :show-search="{ filter }" :options="administrativeDivisionTree" @change="searchAdministrativeDivisionTree" />
 | 
					              <a-cascader
 | 
				
			||||||
 | 
					                  v-model:value="formDate.administrativeDivisionCodes"
 | 
				
			||||||
 | 
					                  :options="administrativeDivisionTree"
 | 
				
			||||||
 | 
					                  :load-data="loadData"
 | 
				
			||||||
 | 
					                  :show-search="{ filter }"
 | 
				
			||||||
 | 
					                  @change="searchAdministrativeDivisionTree"
 | 
				
			||||||
 | 
					                  placeholder="请选择行政区划"
 | 
				
			||||||
 | 
					                  change-on-select
 | 
				
			||||||
 | 
					              />
 | 
				
			||||||
             </a-form-item>
 | 
					             </a-form-item>
 | 
				
			||||||
            <a-form-item label="营业执照" name="businessLicense">
 | 
					            <a-form-item label="营业执照" name="businessLicense">
 | 
				
			||||||
              <SingleImageFileUpload v-model:value="formDate.businessLicense" ref="fileUpload"></SingleImageFileUpload>
 | 
					              <SingleImageFileUpload v-model:value="formDate.businessLicense" ref="fileUpload"></SingleImageFileUpload>
 | 
				
			||||||
| 
						 | 
					@ -73,7 +81,7 @@ import type { Rule } from 'ant-design-vue/es/form';
 | 
				
			||||||
import type { ShowSearchType } from 'ant-design-vue/es/cascader';
 | 
					import type { ShowSearchType } from 'ant-design-vue/es/cascader';
 | 
				
			||||||
import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
 | 
					import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
 | 
				
			||||||
import api from "@/axios";
 | 
					import api from "@/axios";
 | 
				
			||||||
import {message, Modal} from 'ant-design-vue';
 | 
					import {CascaderProps, message, Modal} from 'ant-design-vue';
 | 
				
			||||||
import SingleImageFileUpload from "@/components/upload/SingleImageFileUpload.vue";
 | 
					import SingleImageFileUpload from "@/components/upload/SingleImageFileUpload.vue";
 | 
				
			||||||
import {useRouter} from "vue-router";
 | 
					import {useRouter} from "vue-router";
 | 
				
			||||||
import {formDatePort, statusPort} from "@/types/views/enterprise.ts";
 | 
					import {formDatePort, statusPort} from "@/types/views/enterprise.ts";
 | 
				
			||||||
| 
						 | 
					@ -119,11 +127,36 @@ const rules: Record<string, Rule[]> = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 调用行政区划 1
 | 
					// 调用行政区划 1
 | 
				
			||||||
const DivisionTree = async ()=>{
 | 
					const DivisionTree = async ()=>{
 | 
				
			||||||
  const resp =  await api.get<TreeNodeVo<string>[]>('/common/administrativeDivisionTree')
 | 
					  const resp =  await api.get<TreeNodeVo<string>[]>('/common/administrativeDivisionByParentCode',{parentCode:'0'})
 | 
				
			||||||
  administrativeDivisionTree.value = resp.data as TreeNodeVo<string>[]
 | 
					  administrativeDivisionTree.value = resp.data as TreeNodeVo<string>[]
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const loadData: CascaderProps['loadData'] = async selectedOptions => {
 | 
				
			||||||
 | 
					  const targetOption = selectedOptions[selectedOptions.length - 1];
 | 
				
			||||||
 | 
					  targetOption.loading = true;
 | 
				
			||||||
 | 
					  const resp =  await api.get<TreeNodeVo<string>[]>('/common/administrativeDivisionByParentCode',{parentCode:targetOption.value})
 | 
				
			||||||
 | 
					  targetOption.loading = false;
 | 
				
			||||||
 | 
					  targetOption.children = [administrativeDivisionTree.value,...resp.data]
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					// 回显数据
 | 
				
			||||||
 | 
					const transformData =  (val:any,tree:any)=>{
 | 
				
			||||||
 | 
					  for(let i = 0; i< val.length - 1;i++){
 | 
				
			||||||
 | 
					    tree.forEach(async(item:any)=>{
 | 
				
			||||||
 | 
					      if(item.value === val[i]){
 | 
				
			||||||
 | 
					        item.children = []
 | 
				
			||||||
 | 
					        let data =  await api.get<TreeNodeVo<string>[]>('/common/administrativeDivisionByParentCode',{parentCode:val[i]})
 | 
				
			||||||
 | 
					        item.children = data.data.map((items:any)=>{
 | 
				
			||||||
 | 
					          return {
 | 
				
			||||||
 | 
					            label:items.label,
 | 
				
			||||||
 | 
					            value:items.value
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        transformData(val,item.children)
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
// 可以进行搜索行政区划  2
 | 
					// 可以进行搜索行政区划  2
 | 
				
			||||||
const filter: ShowSearchType['filter'] = (inputValue, path) => {
 | 
					const filter: ShowSearchType['filter'] = (inputValue, path) => {
 | 
				
			||||||
  return path.some(option => option.label.toLowerCase().indexOf(inputValue.toLowerCase()) > -1);
 | 
					  return path.some(option => option.label.toLowerCase().indexOf(inputValue.toLowerCase()) > -1);
 | 
				
			||||||
| 
						 | 
					@ -133,6 +166,10 @@ const filter: ShowSearchType['filter'] = (inputValue, path) => {
 | 
				
			||||||
const  searchAdministrativeDivisionTree = (e:Array<string>)=>{
 | 
					const  searchAdministrativeDivisionTree = (e:Array<string>)=>{
 | 
				
			||||||
  formDate.value.administrativeDivisionCodes = e as any
 | 
					  formDate.value.administrativeDivisionCodes = e as any
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 注册企业入驻
 | 
					// 注册企业入驻
 | 
				
			||||||
const onFinish = async ()=>{
 | 
					const onFinish = async ()=>{
 | 
				
			||||||
  //校验表单
 | 
					  //校验表单
 | 
				
			||||||
| 
						 | 
					@ -153,7 +190,12 @@ const onFinish = async ()=>{
 | 
				
			||||||
  const resp = await  api.post('/common/securityUnitRegister',securityUnitRegisterParams)
 | 
					  const resp = await  api.post('/common/securityUnitRegister',securityUnitRegisterParams)
 | 
				
			||||||
  message.success(resp.message)
 | 
					  message.success(resp.message)
 | 
				
			||||||
  fileUpload.value.fileDelete()
 | 
					  fileUpload.value.fileDelete()
 | 
				
			||||||
  await formDateRef.value.resetFields()  //成功之后进行移除表单
 | 
					  await resetForm()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					// 重置
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const  resetForm = async ()=>{
 | 
				
			||||||
 | 
					 await formDateRef.value.resetFields()
 | 
				
			||||||
  formDate.value = {
 | 
					  formDate.value = {
 | 
				
			||||||
    name:'',
 | 
					    name:'',
 | 
				
			||||||
    socialCode:'',
 | 
					    socialCode:'',
 | 
				
			||||||
| 
						 | 
					@ -164,11 +206,7 @@ const onFinish = async ()=>{
 | 
				
			||||||
    address:'',
 | 
					    address:'',
 | 
				
			||||||
    nature:''
 | 
					    nature:''
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					  fileUpload.value.fileDelete()
 | 
				
			||||||
// 重置
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const  resetForm = ()=>{
 | 
					 | 
				
			||||||
  formDateRef.value.resetFields()
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 查询企业状态
 | 
					// 查询企业状态
 | 
				
			||||||
| 
						 | 
					@ -214,6 +252,9 @@ const showConfirm = (columnsDate:dataStatus) => {
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
onMounted( async ()=>{
 | 
					onMounted( async ()=>{
 | 
				
			||||||
  await  DivisionTree()
 | 
					  await  DivisionTree()
 | 
				
			||||||
 | 
					  await  transformData(formDate.value.administrativeDivisionCodes,administrativeDivisionTree.value)
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -193,7 +193,7 @@ const columns: TableProps['columns'] = [
 | 
				
			||||||
          <a-button  danger>删除</a-button>
 | 
					          <a-button  danger>删除</a-button>
 | 
				
			||||||
        </a-popconfirm>
 | 
					        </a-popconfirm>
 | 
				
			||||||
        <a-button type="primary" onClick={ async ()=>{
 | 
					        <a-button type="primary" onClick={ async ()=>{
 | 
				
			||||||
          // console.log(record)
 | 
					          console.log(record,'9999999')
 | 
				
			||||||
          visible.value = true
 | 
					          visible.value = true
 | 
				
			||||||
          serviceTitle.value = '编辑服务项目'
 | 
					          serviceTitle.value = '编辑服务项目'
 | 
				
			||||||
          if(record.isRecruitSecurity === null ){
 | 
					          if(record.isRecruitSecurity === null ){
 | 
				
			||||||
| 
						 | 
					@ -221,6 +221,7 @@ const columns: TableProps['columns'] = [
 | 
				
			||||||
          formParams.value. securityUserTotal = record.securityUserTotal
 | 
					          formParams.value. securityUserTotal = record.securityUserTotal
 | 
				
			||||||
          formParams.value.enterprisesUnitId = record.enterprisesUnitName
 | 
					          formParams.value.enterprisesUnitId = record.enterprisesUnitName
 | 
				
			||||||
          formParams.value.administrativeDivisionCodes = record.enterprisesUnitAdministrativeDivisionCodes
 | 
					          formParams.value.administrativeDivisionCodes = record.enterprisesUnitAdministrativeDivisionCodes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        }}>编辑</a-button>
 | 
					        }}>编辑</a-button>
 | 
				
			||||||
      </a-space>
 | 
					      </a-space>
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -231,7 +232,7 @@ const x: number = columns.reduce((a, b) => a + (b.width as number), 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const administrativeDivisionTree = ref<TreeNodeVo<string>[]>([])  //行政区划
 | 
					const administrativeDivisionTree = ref<TreeNodeVo<string>[]>([])  //行政区划
 | 
				
			||||||
const getAdministrativeDivisionTree = async ()=>{
 | 
					const getAdministrativeDivisionTree = async ()=>{
 | 
				
			||||||
  const resp =  await api.get<TreeNodeVo<string>[]>('/common/administrativeDivisionTree')
 | 
					  const resp =  await api.get<TreeNodeVo<string>[]>('/common/administrativeDivisionByParentCode',{parentCode:'0'})
 | 
				
			||||||
  administrativeDivisionTree.value = resp.data as TreeNodeVo<string>[]
 | 
					  administrativeDivisionTree.value = resp.data as TreeNodeVo<string>[]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -260,16 +261,15 @@ const formItemOptions = ref<FormProMaxItemOptions<serviceProjectSaveOrUpdatePara
 | 
				
			||||||
      options:userNameOptions,
 | 
					      options:userNameOptions,
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  administrativeDivisionCodes:{
 | 
					  administrativeDivisionCodes:{
 | 
				
			||||||
    type:'cascader',
 | 
					    type:'administrativeDivisionsTree',
 | 
				
			||||||
    label:'行政区划',
 | 
					    label:'行政区划',
 | 
				
			||||||
    required: true,
 | 
					    required: true,
 | 
				
			||||||
    options: administrativeDivisionTree,
 | 
					 | 
				
			||||||
    componentsProps:{
 | 
					    componentsProps:{
 | 
				
			||||||
      showSearch:true,
 | 
					      showSearch:true,
 | 
				
			||||||
      onChange: async (values)=>{
 | 
					      onChange: async (values:any)=>{
 | 
				
			||||||
          const resp = await  api.post<SelectNodeVo<string>[]>('/enterprisesUnit/queryListByAdministrativeDivisionCodes',values)
 | 
					          const resp = await  api.post<SelectNodeVo<string>[]>('/enterprisesUnit/queryListByAdministrativeDivisionCodes',values)
 | 
				
			||||||
          enterprisesUnitIdList.value = resp.data
 | 
					          enterprisesUnitIdList.value = resp.data
 | 
				
			||||||
      }
 | 
					      },
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  enterprisesUnitId:{
 | 
					  enterprisesUnitId:{
 | 
				
			||||||
| 
						 | 
					@ -420,7 +420,7 @@ const closeModal = async()=>{
 | 
				
			||||||
       securityUserTotal:null,
 | 
					       securityUserTotal:null,
 | 
				
			||||||
       remark:''
 | 
					       remark:''
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
    // await formRef.value.resetFields()
 | 
					    await formRef.value.resetFields()
 | 
				
			||||||
    enterprisesUnitId.value = ''
 | 
					    enterprisesUnitId.value = ''
 | 
				
			||||||
    serviceTitle.value = '新增服务项目'
 | 
					    serviceTitle.value = '新增服务项目'
 | 
				
			||||||
    isRecruitSecurityHidden.value = false
 | 
					    isRecruitSecurityHidden.value = false
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,11 +1,7 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
  <div>test</div>
 | 
					    <div style="margin: 100px auto;width: 500px">
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
<script setup lang="ts">
 | 
					<script lang="ts" setup>
 | 
				
			||||||
 | 
					 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
<style scoped lang="scss">
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
</style>
 | 
					 | 
				
			||||||