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;
|
||||||
display: flex;
|
overflow: hidden;
|
||||||
align-items: center;
|
.subModule {
|
||||||
flex-wrap: wrap;
|
|
||||||
margin-right: -3px;
|
|
||||||
margin-left: -1px;
|
|
||||||
|
|
||||||
.subModuleItem {
|
|
||||||
width: 33%;
|
|
||||||
height: 180rpx;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
flex-wrap: wrap;
|
||||||
padding-bottom: 10rpx;
|
.subModuleItem {
|
||||||
border: 1px solid #ccc;
|
width: 246rpx;
|
||||||
border-left: 0;
|
height: 140rpx;
|
||||||
margin-top: -1px;
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
.subModuleIndex {
|
align-items: center;
|
||||||
width: 65rpx;
|
justify-content: center;
|
||||||
height: 65rpx;
|
padding-bottom: 10rpx;
|
||||||
|
.subModuleIndex {
|
||||||
image {
|
width: 45rpx;
|
||||||
width: 100%;
|
height: 45rpx;
|
||||||
height: 100%;
|
image {
|
||||||
|
width: 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;
|
||||||
display: flex;
|
overflow: hidden;
|
||||||
align-items: center;
|
.subModule {
|
||||||
flex-wrap: wrap;
|
|
||||||
margin-right: -3px;
|
|
||||||
margin-left: -1px;
|
|
||||||
|
|
||||||
.subModuleItem {
|
|
||||||
width: 33%;
|
|
||||||
height: 180rpx;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
flex-wrap: wrap;
|
||||||
padding-bottom: 10rpx;
|
.subModuleItem {
|
||||||
border: 1px solid #ccc;
|
width: 246rpx;
|
||||||
border-left: 0;
|
height: 140rpx;
|
||||||
margin-top: -1px;
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
.subModuleIndex {
|
align-items: center;
|
||||||
width: 65rpx;
|
justify-content: center;
|
||||||
height: 65rpx;
|
padding-bottom: 10rpx;
|
||||||
|
.subModuleIndex {
|
||||||
image {
|
width: 45rpx;
|
||||||
width: 100%;
|
height: 45rpx;
|
||||||
height: 100%;
|
image {
|
||||||
|
width: 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,101 +1,107 @@
|
||||||
declare const __APP_ENV: ImportMetaEnv;
|
declare const __APP_ENV: ImportMetaEnv;
|
||||||
|
class TreeNodeVo<T, E = Record<string, any>> {
|
||||||
declare global {
|
value: T;
|
||||||
/**
|
parentValue: T;
|
||||||
* 全局返回
|
label: string;
|
||||||
*/
|
orderIndex?: number;
|
||||||
interface JsonResult<T> {
|
children?: TreeNodeVo<T>[]
|
||||||
code: number;
|
extData?: E;
|
||||||
message: string;
|
|
||||||
data?: T;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
export interface SecurityUnitPagerQueryParams {
|
|
||||||
/** 名称 **/
|
|
||||||
name?: string;
|
|
||||||
/** 社会编码 **/
|
|
||||||
socialCode?: string;
|
|
||||||
/** 行政区划编码 **/
|
|
||||||
administrativeDivisionCodes?: string[];
|
|
||||||
/** 是否启用 **/
|
|
||||||
isEnable?: number;
|
|
||||||
/** 审核状态 **/
|
|
||||||
checkStatus?: number;
|
|
||||||
}
|
|
||||||
interface BaseEnum<T> {
|
|
||||||
value: T;
|
|
||||||
label: string
|
|
||||||
}
|
|
||||||
class TreeNodeVo<T, E = Record<string, any>> {
|
|
||||||
value: T;
|
|
||||||
parentValue: T;
|
|
||||||
label: string;
|
|
||||||
orderIndex?: number;
|
|
||||||
children?: TreeNodeVo<T>[]
|
|
||||||
extData?: E;
|
|
||||||
}
|
|
||||||
declare interface Grid {
|
|
||||||
//栅格占据的列数
|
|
||||||
span?: number;
|
|
||||||
//栅格左侧的间隔格数
|
|
||||||
offset?: number;
|
|
||||||
//栅格向右移动格数
|
|
||||||
push?: number;
|
|
||||||
//栅格向左移动格数
|
|
||||||
pull?: number;
|
|
||||||
//<768px 响应式栅格数或者栅格属性对象
|
|
||||||
xs?: number;
|
|
||||||
//≥768px 响应式栅格数或者栅格属性对象
|
|
||||||
sm?: number;
|
|
||||||
//≥992px 响应式栅格数或者栅格属性对象
|
|
||||||
md?: number;
|
|
||||||
//≥1200px 响应式栅格数或者栅格属性对象
|
|
||||||
lg?: number;
|
|
||||||
//≥1920px 响应式栅格数或者栅格属性对象
|
|
||||||
xl?: number;
|
|
||||||
}
|
|
||||||
interface dataStatus {
|
|
||||||
account: string;
|
|
||||||
password: string;
|
|
||||||
remark: string;
|
|
||||||
checkStatus: {
|
|
||||||
extData: {
|
|
||||||
color: string;
|
|
||||||
};
|
|
||||||
label: string;
|
|
||||||
value: number;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
class SelectNodeVo<T, E = Record<string, any>> {
|
|
||||||
value: T;
|
|
||||||
label: string;
|
|
||||||
options?: SelectNodeVo<T>[]
|
|
||||||
orderIndex?: number;
|
|
||||||
disabled?: boolean;
|
|
||||||
extData?: E
|
|
||||||
}
|
|
||||||
|
|
||||||
interface ExtData {
|
|
||||||
color?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface Option {
|
|
||||||
label: string;
|
|
||||||
value: string | number;
|
|
||||||
extData?: ExtData | null;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface OptionsResponse {
|
|
||||||
IsEnable: Option[];
|
|
||||||
IsOrNot: Option[];
|
|
||||||
Sex: Option[];
|
|
||||||
CheckStatus: Option[];
|
|
||||||
ServiceProjectType: Option[];
|
|
||||||
DeleteFlag: Option[];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 全局返回
|
||||||
|
*/
|
||||||
|
interface JsonResult<T> {
|
||||||
|
code: number;
|
||||||
|
message: string;
|
||||||
|
data?: T;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export interface SecurityUnitPagerQueryParams {
|
||||||
|
/** 名称 **/
|
||||||
|
name?: string;
|
||||||
|
/** 社会编码 **/
|
||||||
|
socialCode?: string;
|
||||||
|
/** 行政区划编码 **/
|
||||||
|
administrativeDivisionCodes?: string[];
|
||||||
|
/** 是否启用 **/
|
||||||
|
isEnable?: number;
|
||||||
|
/** 审核状态 **/
|
||||||
|
checkStatus?: number;
|
||||||
|
}
|
||||||
|
interface BaseEnum<T> {
|
||||||
|
value: T;
|
||||||
|
label: string
|
||||||
|
}
|
||||||
|
class TreeNodeVo<T, E = Record<string, any>> {
|
||||||
|
value: T;
|
||||||
|
parentValue: T;
|
||||||
|
label: string;
|
||||||
|
orderIndex?: number;
|
||||||
|
children?: TreeNodeVo<T>[]
|
||||||
|
extData?: E;
|
||||||
|
}
|
||||||
|
interface Grid {
|
||||||
|
//栅格占据的列数
|
||||||
|
span?: number;
|
||||||
|
//栅格左侧的间隔格数
|
||||||
|
offset?: number;
|
||||||
|
//栅格向右移动格数
|
||||||
|
push?: number;
|
||||||
|
//栅格向左移动格数
|
||||||
|
pull?: number;
|
||||||
|
//<768px 响应式栅格数或者栅格属性对象
|
||||||
|
xs?: number;
|
||||||
|
//≥768px 响应式栅格数或者栅格属性对象
|
||||||
|
sm?: number;
|
||||||
|
//≥992px 响应式栅格数或者栅格属性对象
|
||||||
|
md?: number;
|
||||||
|
//≥1200px 响应式栅格数或者栅格属性对象
|
||||||
|
lg?: number;
|
||||||
|
//≥1920px 响应式栅格数或者栅格属性对象
|
||||||
|
xl?: number;
|
||||||
|
}
|
||||||
|
interface dataStatus {
|
||||||
|
account: string;
|
||||||
|
password: string;
|
||||||
|
remark: string;
|
||||||
|
checkStatus: {
|
||||||
|
extData: {
|
||||||
|
color: string;
|
||||||
|
};
|
||||||
|
label: string;
|
||||||
|
value: number;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
class SelectNodeVo<T, E = Record<string, any>> {
|
||||||
|
value: T;
|
||||||
|
label: string;
|
||||||
|
options?: SelectNodeVo<T>[]
|
||||||
|
orderIndex?: number;
|
||||||
|
disabled?: boolean;
|
||||||
|
extData?: E
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ExtData {
|
||||||
|
color?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Option {
|
||||||
|
label: string;
|
||||||
|
value: string | number;
|
||||||
|
extData?: ExtData | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface OptionsResponse {
|
||||||
|
IsEnable: Option[];
|
||||||
|
IsOrNot: Option[];
|
||||||
|
Sex: Option[];
|
||||||
|
CheckStatus: Option[];
|
||||||
|
ServiceProjectType: 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,8 +28,16 @@
|
||||||
<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
|
||||||
</a-form-item>
|
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 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>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
|
@ -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>
|
|