Merge branch 'dev' of http://192.168.18.88:8077/sznyb/daimp-front into dev
This commit is contained in:
commit
4288429981
@ -1,13 +1,24 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" type="image/svg+xml" href="/logo.png" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title></title>
|
||||
<script>
|
||||
window._AMapSecurityConfig = {
|
||||
securityJsCode: 'f09302d3ed65110614bdb26e44717ddf',
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript"
|
||||
src="https://webapi.amap.com/maps?v=2.0&key=c843a50db7157faf295c6fa37c48719f&plugin=AMap.PlaceSearch,AMap.Geocoder"></script>
|
||||
<script src="https://webapi.amap.com/ui/1.1/main.js?v=1.0.11"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="root"></div>
|
||||
<script type="module" src="/src/main.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
152
main/src/components/custom-echart-multi-line/index.vue
Normal file
152
main/src/components/custom-echart-multi-line/index.vue
Normal file
@ -0,0 +1,152 @@
|
||||
<template>
|
||||
<div ref="chartRef" :style="{ height, width }"></div>
|
||||
</template>
|
||||
<script>
|
||||
import { ref, reactive, watchEffect } from 'vue';
|
||||
import { cloneDeep } from 'lodash';
|
||||
import { useEcharts } from '../../hooks/useEcharts';
|
||||
|
||||
export default {
|
||||
name: 'CustomEchartMultiLine',
|
||||
props: {
|
||||
chartData: {
|
||||
type: Array,
|
||||
default: () => [],
|
||||
required: true,
|
||||
},
|
||||
option: {
|
||||
type: Object,
|
||||
default: () => ({}),
|
||||
},
|
||||
type: {
|
||||
type: String,
|
||||
default: 'line',
|
||||
},
|
||||
width: {
|
||||
type: String,
|
||||
default: '100%',
|
||||
},
|
||||
height: {
|
||||
type: String,
|
||||
default: 'calc(100vh - 78px)',
|
||||
},
|
||||
},
|
||||
emits: ['click'],
|
||||
setup(props, { emit }) {
|
||||
const chartRef = ref(null);
|
||||
const { setOptions, getInstance } = useEcharts(chartRef);
|
||||
const option = reactive({
|
||||
tooltip: {
|
||||
trigger: 'axis',
|
||||
axisPointer: {
|
||||
type: 'shadow',
|
||||
label: {
|
||||
show: true,
|
||||
backgroundColor: '#333',
|
||||
},
|
||||
},
|
||||
},
|
||||
legend: {
|
||||
top: 30,
|
||||
},
|
||||
grid: {
|
||||
top: 60,
|
||||
},
|
||||
xAxis: {
|
||||
type: 'category',
|
||||
data: [],
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
},
|
||||
series: [],
|
||||
});
|
||||
|
||||
watchEffect(() => {
|
||||
props.chartData && initCharts();
|
||||
});
|
||||
|
||||
function hexToRGBA(hex, alpha = 1) {
|
||||
let hexCode = hex.replace('#', '');
|
||||
if (hexCode.length === 3) {
|
||||
hexCode = hexCode
|
||||
.split('')
|
||||
.map((char) => char + char)
|
||||
.join('');
|
||||
}
|
||||
const r = parseInt(hexCode.slice(0, 2), 16);
|
||||
const g = parseInt(hexCode.slice(2, 4), 16);
|
||||
const b = parseInt(hexCode.slice(4, 6), 16);
|
||||
return `rgba(${r}, ${g}, ${b}, ${alpha})`;
|
||||
}
|
||||
|
||||
function setAreaStyle(color) {
|
||||
return {
|
||||
color: {
|
||||
type: 'linear',
|
||||
x: 0,
|
||||
y: 0,
|
||||
x2: 0,
|
||||
y2: 1,
|
||||
colorStops: [
|
||||
{
|
||||
offset: 0,
|
||||
color: hexToRGBA(color, 0.2),
|
||||
},
|
||||
{
|
||||
offset: 1,
|
||||
color: hexToRGBA(color, 1),
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
function initCharts() {
|
||||
if (props.option) {
|
||||
Object.assign(option, cloneDeep(props.option));
|
||||
}
|
||||
let typeArr = Array.from(new Set(props.chartData.map((item) => item.type)));
|
||||
let xAxisData = Array.from(new Set(props.chartData.map((item) => item.name)));
|
||||
let seriesData = [];
|
||||
typeArr.forEach((type, index) => {
|
||||
let obj = {
|
||||
name: type,
|
||||
type: props.type,
|
||||
smooth: true,
|
||||
};
|
||||
if (props.option?.color) {
|
||||
obj.areaStyle = setAreaStyle(props.option?.color[index]);
|
||||
}
|
||||
const findItem = props.chartData.find((item) => item.type == type);
|
||||
if (findItem && findItem.color) {
|
||||
obj.color = findItem.color;
|
||||
obj.areaStyle = setAreaStyle(findItem.color[index]);
|
||||
}
|
||||
let data = [];
|
||||
xAxisData.forEach((x) => {
|
||||
let dataArr = props.chartData.filter((item) => type === item.type && item.name == x);
|
||||
if (dataArr && dataArr.length > 0) {
|
||||
data.push(dataArr[0].value);
|
||||
} else {
|
||||
data.push(null);
|
||||
}
|
||||
});
|
||||
obj['data'] = data;
|
||||
seriesData.push(obj);
|
||||
});
|
||||
option.series = seriesData;
|
||||
option.xAxis.data = xAxisData;
|
||||
setOptions(option);
|
||||
getInstance()?.off('click', onClick);
|
||||
getInstance()?.on('click', onClick);
|
||||
}
|
||||
|
||||
function onClick(params) {
|
||||
emit('click', params);
|
||||
}
|
||||
|
||||
return { chartRef };
|
||||
},
|
||||
};
|
||||
</script>
|
89
main/src/components/custom-echart-pie/index.vue
Normal file
89
main/src/components/custom-echart-pie/index.vue
Normal file
@ -0,0 +1,89 @@
|
||||
<template>
|
||||
<div ref="chartRef" :style="{ height, width }"></div>
|
||||
</template>
|
||||
<script>
|
||||
import { ref, reactive, watch, watchEffect } from 'vue';
|
||||
import { cloneDeep } from 'lodash';
|
||||
import { useEcharts } from '../../hooks/useEcharts';
|
||||
|
||||
export default {
|
||||
name: 'CustomEchartPie',
|
||||
props: {
|
||||
chartData: {
|
||||
type: Array,
|
||||
default: () => [],
|
||||
},
|
||||
size: {
|
||||
type: Object,
|
||||
default: () => {},
|
||||
},
|
||||
option: {
|
||||
type: Object,
|
||||
default: () => ({}),
|
||||
},
|
||||
width: {
|
||||
type: String,
|
||||
default: '100%',
|
||||
},
|
||||
height: {
|
||||
type: String,
|
||||
default: 'calc(100vh - 78px)',
|
||||
},
|
||||
},
|
||||
emits: ['click'],
|
||||
setup(props, { emit }) {
|
||||
const chartRef = ref(null);
|
||||
const { setOptions, getInstance, resize } = useEcharts(chartRef);
|
||||
const option = reactive({
|
||||
tooltip: {
|
||||
formatter: '{b} ({c})',
|
||||
},
|
||||
series: [
|
||||
{
|
||||
type: 'pie',
|
||||
radius: '72%',
|
||||
center: ['50%', '55%'],
|
||||
data: [],
|
||||
labelLine: { show: true },
|
||||
label: {
|
||||
show: true,
|
||||
formatter: '{b} \n ({d}%)',
|
||||
color: '#B1B9D3',
|
||||
},
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
watchEffect(() => {
|
||||
props.chartData && initCharts();
|
||||
});
|
||||
|
||||
watch(
|
||||
() => props.size,
|
||||
() => {
|
||||
resize();
|
||||
},
|
||||
{
|
||||
immediate: true,
|
||||
}
|
||||
);
|
||||
|
||||
function initCharts() {
|
||||
if (props.option) {
|
||||
Object.assign(option, cloneDeep(props.option));
|
||||
}
|
||||
option.series[0].data = props.chartData;
|
||||
setOptions(option);
|
||||
resize();
|
||||
getInstance()?.off('click', onClick);
|
||||
getInstance()?.on('click', onClick);
|
||||
}
|
||||
|
||||
function onClick(params) {
|
||||
emit('click', params);
|
||||
}
|
||||
|
||||
return { chartRef };
|
||||
},
|
||||
};
|
||||
</script>
|
@ -3,5 +3,7 @@ import CustomTableOperate from './custom-table-operate';
|
||||
import CustomImportExcel from './custom-import-excel';
|
||||
import CustomRichEditor from './custom-rich-editor';
|
||||
import CustomEchartBar from './custom-echart-bar';
|
||||
import CustomEchartPie from './custom-echart-pie';
|
||||
import CustomEchartMultiLine from './custom-echart-multi-line';
|
||||
|
||||
export { SvgIcon, CustomTableOperate, CustomImportExcel, CustomRichEditor, CustomEchartBar };
|
||||
export { SvgIcon, CustomTableOperate, CustomImportExcel, CustomRichEditor, CustomEchartBar, CustomEchartPie, CustomEchartMultiLine };
|
||||
|
@ -1,13 +1,16 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" type="image/svg+xml" href="/logo.png" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>政务服务</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
<script type="module" src="/src/main.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
@ -17,7 +17,6 @@
|
||||
"dependencies": {
|
||||
"@element-plus/icons-vue": "^2.3.1",
|
||||
"@smallwei/avue": "^3.6.2",
|
||||
"@vuemap/vue-amap": "^2.1.9",
|
||||
"@wangeditor/editor": "^5.1.23",
|
||||
"@wangeditor/editor-for-vue": "^5.1.12",
|
||||
"axios": "^1.6.5",
|
||||
|
@ -183,3 +183,13 @@ export function getAddrCropByLand(landId) {
|
||||
method: 'GET',
|
||||
});
|
||||
}
|
||||
/* 导入土地 */
|
||||
export function importLands(data) {
|
||||
return request('land-resource/landManage/import', {
|
||||
method: 'POST',
|
||||
data,
|
||||
Headers: {
|
||||
'Content-Type': 'multipart/form-data',
|
||||
},
|
||||
});
|
||||
}
|
||||
|
@ -1,43 +0,0 @@
|
||||
<template>
|
||||
<section class="map_container" :style="{ '--width': props.w, '--height': props.h }">
|
||||
<el-amap :center="[121.59996, 31.197646]" :zoom="15" />
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { ref } from 'vue';
|
||||
const props = defineProps({
|
||||
w: {
|
||||
type: String,
|
||||
default: '300px',
|
||||
},
|
||||
h: {
|
||||
type: String,
|
||||
default: '300px',
|
||||
},
|
||||
});
|
||||
/* --------------- data --------------- */
|
||||
// #region
|
||||
|
||||
// #endregion
|
||||
|
||||
/* --------------- methods --------------- */
|
||||
// #region
|
||||
|
||||
// #endregion
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.map_container {
|
||||
width: var(--width);
|
||||
height: var(--height);
|
||||
::v-deep() {
|
||||
.el-vue-amap-container {
|
||||
height: 100%;
|
||||
.amap-container {
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
@ -7,7 +7,6 @@
|
||||
*/
|
||||
import 'virtual:svg-icons-register';
|
||||
import { createApp } from 'vue';
|
||||
import VueAMap, { initAMapApiLoader } from '@vuemap/vue-amap';
|
||||
import App from './App.vue';
|
||||
import router from './router';
|
||||
import pinia from './store';
|
||||
@ -21,16 +20,8 @@ import { registerGlobalComponents } from './plugins/globalComponents';
|
||||
import { registerElIcons } from './plugins/icon';
|
||||
import { registerMicroApps } from './plugins/micro';
|
||||
|
||||
initAMapApiLoader({
|
||||
key: 'c843a50db7157faf295c6fa37c48719f',
|
||||
securityJsCode: 'f09302d3ed65110614bdb26e44717ddf', // 新版key需要配合安全密钥使用
|
||||
//Loca:{
|
||||
// version: '2.0.0'
|
||||
//} // 如果需要使用loca组件库,需要加载Loca
|
||||
});
|
||||
|
||||
const app = createApp(App);
|
||||
app.use(pinia).use(router).use(ElementPlus).use(Avue).use(VueAMap);
|
||||
app.use(pinia).use(router).use(ElementPlus).use(Avue);
|
||||
registerGlobalComponents(app);
|
||||
registerElIcons(app);
|
||||
registerDirective(app);
|
||||
|
@ -0,0 +1,104 @@
|
||||
<template>
|
||||
<section class="create_land_attrs_content_">
|
||||
<el-upload
|
||||
v-if="props.view != 'view'"
|
||||
class="custom-form__uploader"
|
||||
action="#"
|
||||
:show-file-list="false"
|
||||
accept="image/*"
|
||||
:limit="20"
|
||||
:http-request="rowUploadPicture"
|
||||
>
|
||||
<el-icon class="custom-form__uploader__icon"><Plus /></el-icon>
|
||||
</el-upload>
|
||||
<div v-for="item in attrs_" :key="`attr_${item.id}`" class="attrs_content__item">
|
||||
<img :src="item.url" :alt="item.name" style="" />
|
||||
<el-icon v-if="props.view != 'view'" class="clear_btn" @click="handleClearAttr(item.id)"><CircleCloseFilled /></el-icon>
|
||||
</div>
|
||||
</section>
|
||||
</template>
|
||||
<script setup>
|
||||
import { ref, watch } from 'vue';
|
||||
import { CommonUpload } from '@/apis';
|
||||
|
||||
const emit = defineEmits(['update:attrs']);
|
||||
const props = defineProps({
|
||||
view: {
|
||||
type: String,
|
||||
default: 'view',
|
||||
},
|
||||
attrs: {
|
||||
type: Array,
|
||||
default: () => [],
|
||||
},
|
||||
});
|
||||
const attrs_ = ref([]);
|
||||
watch(
|
||||
() => props.attrs,
|
||||
(val) => {
|
||||
attrs_.value = val;
|
||||
},
|
||||
{ deep: true, immediate: true }
|
||||
);
|
||||
function handleClearAttr(id) {
|
||||
attrs_.value = attrs_.value.filter((item) => item.id !== id);
|
||||
emit('update:attrs', attrs_.value);
|
||||
}
|
||||
async function rowUploadPicture({ file }) {
|
||||
const formData = new FormData();
|
||||
formData.append('file', file);
|
||||
const res = await CommonUpload(formData);
|
||||
if (res.code === 200) {
|
||||
attrs_.value.push({
|
||||
...res.data,
|
||||
id: 'id_' + Date.now(),
|
||||
});
|
||||
emit('update:attrs', attrs_.value);
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.create_land_attrs_content_ {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
box-sizing: border-box;
|
||||
gap: 20px;
|
||||
.custom-form__uploader {
|
||||
box-sizing: border-box;
|
||||
height: auto;
|
||||
}
|
||||
> div {
|
||||
width: calc(50% - 10px);
|
||||
aspect-ratio: 1 / 1;
|
||||
}
|
||||
.attrs_content__item {
|
||||
box-sizing: border-box;
|
||||
position: relative;
|
||||
padding: 6px;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 4px;
|
||||
img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
border-radius: 2px;
|
||||
}
|
||||
.clear_btn {
|
||||
position: absolute;
|
||||
right: 0px;
|
||||
top: 0px;
|
||||
font-size: 18px;
|
||||
color: #f15c5c;
|
||||
opacity: 0;
|
||||
cursor: pointer;
|
||||
background-color: #fff;
|
||||
border-radius: 50%;
|
||||
}
|
||||
&:hover {
|
||||
.clear_btn {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
@ -12,17 +12,21 @@
|
||||
class="custon_create_land_"
|
||||
:data="data"
|
||||
:option="option"
|
||||
:before-close="handleCloseFrom"
|
||||
@current-change="handlePageChange"
|
||||
@size-change="handleSizeChange"
|
||||
@search-reset="handleResetSearch"
|
||||
@search-change="handleSearch"
|
||||
@row-save="handleRowSave"
|
||||
>
|
||||
<!-- <template #menu-form>
|
||||
<CreateLand :row-data="rowData" :land-type="0" />
|
||||
</template> -->
|
||||
<template #landTransfer="{ row }">
|
||||
{{ row.landTransfer == '1' ? '是' : '否' }}
|
||||
</template>
|
||||
<template #isUpload="{ row }">
|
||||
{{ row.isUpload != '1' ? '是' : '否' }}
|
||||
</template>
|
||||
<template #menu-left>
|
||||
<el-button type="success" icon="upload">导入</el-button>
|
||||
<el-button type="success" icon="upload" @click="handleImport">导入</el-button>
|
||||
<el-button type="success" icon="download" @click="handleExport">导出</el-button>
|
||||
</template>
|
||||
<template #menu="{ row }">
|
||||
@ -33,25 +37,17 @@
|
||||
</template>
|
||||
</el-popconfirm>
|
||||
</template>
|
||||
|
||||
<template #propertyCertificateUrl-form="{ type }">
|
||||
<section class="create_land_attrs_content_">
|
||||
<el-upload
|
||||
v-if="type !== 'view'"
|
||||
class="custom-form__uploader"
|
||||
action="#"
|
||||
:show-file-list="false"
|
||||
accept="image/*"
|
||||
:limit="20"
|
||||
:http-request="rowUploadPicture"
|
||||
>
|
||||
<el-icon class="custom-form__uploader__icon"><Plus /></el-icon>
|
||||
</el-upload>
|
||||
<div v-for="item in attrs" :key="`attr_${item.id}`" class="attrs_content__item">
|
||||
<img :src="item.url" :alt="item.name" style="" />
|
||||
<el-icon class="clear_btn" @click="handleClearAttr(item.id)"><CircleCloseFilled /></el-icon>
|
||||
</div>
|
||||
</section>
|
||||
<Attrs v-model:attrs="attrs" :view="type" />
|
||||
</template>
|
||||
<template #landCertificateUrl-form="{ type }">
|
||||
<Attrs v-model:attrs="landOwnerAttrs" :view="type" />
|
||||
</template>
|
||||
<template #coordinate-form>
|
||||
<avue-input-map v-model="local" :params="params" placeholder="请选择位置"></avue-input-map>
|
||||
</template>
|
||||
<template #landUrl-form="{ type }">
|
||||
<Attrs v-model:attrs="landAttrs" :view="type" />
|
||||
</template>
|
||||
</avue-crud>
|
||||
</CustomCard>
|
||||
@ -62,24 +58,27 @@ import { ref, reactive, onMounted } from 'vue';
|
||||
import CustomCard from '@/components/CustomCard';
|
||||
import { CRUD_OPTIONS } from '@/config';
|
||||
import { useUserStore } from '@/store/modules/user';
|
||||
import { getLandsList, exportLands, delLand, saveLand } from '@/apis/land.js';
|
||||
import { getLandsList, exportLands, delLand, saveLand, importLands } from '@/apis/land.js';
|
||||
import { ElMessage } from 'element-plus';
|
||||
|
||||
import useLandHook from './useLandHook';
|
||||
import { CommonUpload } from '@/apis';
|
||||
import { get } from 'lodash';
|
||||
import Attrs from './common/Attrs.vue';
|
||||
import { add } from 'lodash';
|
||||
|
||||
const { landType, landsType, landClassificationType, handleIficationType } = useLandHook();
|
||||
const { VITE_APP_BASE_API } = import.meta.env;
|
||||
const UserStore = useUserStore();
|
||||
|
||||
const landClassificationType_ = ref('');
|
||||
onMounted(() => {
|
||||
getList();
|
||||
});
|
||||
|
||||
const params = ref({
|
||||
zoom: 10,
|
||||
});
|
||||
const local_ = ref([102.833669, 24.88149, '昆明市']);
|
||||
const local = ref(JSON.parse(JSON.stringify(local_.value)));
|
||||
/* --------------- data --------------- */
|
||||
// #region
|
||||
|
||||
const crudRef = ref();
|
||||
const pageData = reactive({
|
||||
currentPage: 1,
|
||||
@ -223,6 +222,7 @@ const option = reactive({
|
||||
prop: 'landClassificationType',
|
||||
type: 'select',
|
||||
dicData: landClassificationType,
|
||||
viewDisplay: false,
|
||||
rules: [
|
||||
{
|
||||
required: true,
|
||||
@ -231,13 +231,30 @@ const option = reactive({
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
label: '用地分类',
|
||||
prop: 'landClassificationTypeView',
|
||||
addDisplay: false,
|
||||
},
|
||||
{
|
||||
label: '位置',
|
||||
prop: 'villageCode',
|
||||
type: 'cascader',
|
||||
props: {
|
||||
label: 'areaName',
|
||||
value: 'areaCode',
|
||||
children: 'areaChildVOS',
|
||||
},
|
||||
dicUrl: `${VITE_APP_BASE_API}/system/area/region?areaCode=530000`,
|
||||
dicHeaders: {
|
||||
authorization: UserStore.token,
|
||||
},
|
||||
dicFormatter: (res) => res.data ?? [],
|
||||
// change: (o) => setCityChange(o),
|
||||
rules: [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入',
|
||||
message: '请选择',
|
||||
trigger: 'blur',
|
||||
},
|
||||
],
|
||||
@ -246,6 +263,7 @@ const option = reactive({
|
||||
label: '是否土地流转',
|
||||
prop: 'isTransfer',
|
||||
type: 'select',
|
||||
viewDisplay: false,
|
||||
dicData: [
|
||||
{
|
||||
label: '是',
|
||||
@ -257,6 +275,11 @@ const option = reactive({
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
label: '是否土地流转1',
|
||||
prop: 'isTransferView',
|
||||
addDisplay: false,
|
||||
},
|
||||
{
|
||||
label: '面积',
|
||||
prop: 'area',
|
||||
@ -293,6 +316,48 @@ const option = reactive({
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
label: '土地使用权信息',
|
||||
prop: 'baseGroup',
|
||||
column: [
|
||||
{
|
||||
label: '联系人',
|
||||
prop: 'landUseName',
|
||||
},
|
||||
{
|
||||
label: '联系电话',
|
||||
prop: 'landUsePhone',
|
||||
},
|
||||
{
|
||||
label: '用地性质',
|
||||
prop: 'nature',
|
||||
},
|
||||
{
|
||||
label: '证书',
|
||||
prop: 'landCertificateUrl',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
label: '土地使用权信息',
|
||||
prop: 'baseGroup',
|
||||
column: [
|
||||
{
|
||||
label: '地理位置',
|
||||
prop: 'coordinate',
|
||||
viewDisplay: false,
|
||||
},
|
||||
{
|
||||
label: '地理位置',
|
||||
prop: 'coordinateView',
|
||||
addDisplay: false,
|
||||
},
|
||||
{
|
||||
label: '图片',
|
||||
prop: 'landUrl',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
});
|
||||
const searchData = reactive({
|
||||
@ -301,6 +366,8 @@ const searchData = reactive({
|
||||
owner: '',
|
||||
});
|
||||
const attrs = ref([]);
|
||||
const landOwnerAttrs = ref([]);
|
||||
const landAttrs = ref([]);
|
||||
const rowData = ref([]);
|
||||
// #endregion
|
||||
|
||||
@ -315,14 +382,18 @@ async function getList() {
|
||||
...searchData,
|
||||
};
|
||||
let res = await getLandsList(params);
|
||||
console.log('res ---------', res);
|
||||
if (res.code == 200) {
|
||||
data.value = res.data.records;
|
||||
data.value.forEach((v) => {
|
||||
v.isTransfer = v.landTransfer || 1;
|
||||
v.isTransferView = v.landTransfer == 1 ? '否' : '是';
|
||||
v.landClassificationTypeView = handleIficationType(v.handleIficationType);
|
||||
v.coordinateView = v.coordinate;
|
||||
});
|
||||
pageData.total = res.data.total;
|
||||
}
|
||||
}
|
||||
function handlePageChange(val) {
|
||||
console.log('page', val);
|
||||
pageData.currentPage = val;
|
||||
getList();
|
||||
}
|
||||
@ -346,29 +417,32 @@ async function handleResetSearch() {
|
||||
pageData.total = 0;
|
||||
await getList();
|
||||
}
|
||||
async function handleRowSave(val, done, loading) {
|
||||
let data = JSON.parse(JSON.stringify(val));
|
||||
data.isDraftsSave = 0;
|
||||
data.landType = 0;
|
||||
let urls = [];
|
||||
if (data.propertyCertificateUrl.length) {
|
||||
data.propertyCertificateUrl.forEach((item) => urls.push(item.url));
|
||||
const attrNames = reactive(landsType.map((v) => v.label));
|
||||
function handleImport() {
|
||||
let inp = document.createElement('input');
|
||||
inp.type = 'file';
|
||||
inp.onchange = fileUp;
|
||||
document.body.appendChild(inp);
|
||||
inp.click();
|
||||
document.body.removeChild(inp);
|
||||
}
|
||||
data.propertyCertificateUrl = urls.join();
|
||||
const res = await saveLand(data);
|
||||
async function fileUp(e) {
|
||||
let formData = new FormData();
|
||||
formData.append('file', e.target.files[0]);
|
||||
formData.append('landType', landType.value);
|
||||
const res = await importLands(formData);
|
||||
if (res.code == 200) {
|
||||
ElMessage.success('保存成功');
|
||||
ElMessage.success('导入成功');
|
||||
getList();
|
||||
done();
|
||||
}
|
||||
}
|
||||
async function handleExport() {
|
||||
let res = await exportLands({
|
||||
landType: 1,
|
||||
landType: landType.value,
|
||||
});
|
||||
if (res) {
|
||||
let a = document.createElement('a');
|
||||
// a.download = attrNames.value[Number(searchCondition.landType)] + '.xlsx';
|
||||
a.download = attrNames.value[Number(landType.value)] + '.xlsx';
|
||||
a.download = 'test.xlsx';
|
||||
let blob = new Blob([res.data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
|
||||
let link = window.URL.createObjectURL(blob);
|
||||
@ -379,20 +453,6 @@ async function handleExport() {
|
||||
window.URL.revokeObjectURL(link);
|
||||
}
|
||||
}
|
||||
const rowUploadPicture = async ({ file }) => {
|
||||
const formData = new FormData();
|
||||
formData.append('file', file);
|
||||
const res = await CommonUpload(formData);
|
||||
if (res.code === 200) {
|
||||
attrs.value.push({
|
||||
...res.data,
|
||||
id: 'id_' + Date.now(),
|
||||
});
|
||||
}
|
||||
};
|
||||
function handleClearAttr(id) {
|
||||
attrs.value = attrs.value.filter((item) => item.id !== id);
|
||||
}
|
||||
async function handleDelete(id) {
|
||||
let res = await delLand(id);
|
||||
if (res.code == 200) {
|
||||
@ -401,9 +461,76 @@ async function handleDelete(id) {
|
||||
}
|
||||
function handleView(obj) {
|
||||
rowData.value = obj;
|
||||
console.log('row', rowData.value);
|
||||
if (obj.propertyCertificateUrl) {
|
||||
attrs.value = obj.propertyCertificateUrl.split(',').map((v, i) => {
|
||||
return {
|
||||
name: `产权附件_${i}`,
|
||||
url: v,
|
||||
id: 'id_' + Date.now(),
|
||||
};
|
||||
});
|
||||
}
|
||||
if (obj.landCertificateUrl) {
|
||||
landOwnerAttrs.value = obj.landCertificateUrl.split(',').map((v, i) => {
|
||||
return {
|
||||
name: `使用信息附件_${i}`,
|
||||
url: v,
|
||||
id: 'id_' + Date.now(),
|
||||
};
|
||||
});
|
||||
if (obj.landUrl) {
|
||||
landAttrs.value = obj.landUrl.split(',').map((v, i) => {
|
||||
return {
|
||||
name: `位置附件_${i}`,
|
||||
url: v,
|
||||
id: 'id_' + Date.now(),
|
||||
};
|
||||
});
|
||||
}
|
||||
}
|
||||
crudRef.value.rowView(obj);
|
||||
}
|
||||
function handleCloseFrom(done) {
|
||||
landOwnerAttrs.value = [];
|
||||
attrs.value = [];
|
||||
landAttrs.value = [];
|
||||
local.value = JSON.parse(JSON.stringify(local_.value));
|
||||
done();
|
||||
}
|
||||
|
||||
async function handleRowSave(val, done, loading) {
|
||||
let data = JSON.parse(JSON.stringify(val));
|
||||
data.isDraftsSave = 0;
|
||||
data.landType = landType.value;
|
||||
let urls = [];
|
||||
let landOwnerUrls = [];
|
||||
let landUrls = [];
|
||||
if (attrs.value.length) {
|
||||
attrs.value.forEach((item) => urls.push(item.url));
|
||||
}
|
||||
if (landOwnerAttrs.value.length) {
|
||||
landOwnerAttrs.value.forEach((item) => landOwnerUrls.push(item.url));
|
||||
}
|
||||
if (landAttrs.value.length) {
|
||||
landAttrs.value.forEach((item) => landUrls.push(item.url));
|
||||
}
|
||||
data.propertyCertificateUrl = urls.join();
|
||||
data.landCertificateUrl = landOwnerUrls.join();
|
||||
data.landUrl = landUrls.join();
|
||||
data.villageCode = data.villageCode[data.villageCode.length - 1] || '';
|
||||
if (local.value.length != 0) {
|
||||
data.coordinate = `${local.value[0]}E,${local.value[1]}N`;
|
||||
}
|
||||
const res = await saveLand(data);
|
||||
loading();
|
||||
if (res.code == 200) {
|
||||
ElMessage.success('保存成功');
|
||||
getList();
|
||||
attrs.value = [];
|
||||
landOwnerAttrs.value = [];
|
||||
done();
|
||||
}
|
||||
}
|
||||
// #endregion
|
||||
</script>
|
||||
|
||||
|
@ -433,20 +433,6 @@
|
||||
dependencies:
|
||||
buffer "^6.0.3"
|
||||
|
||||
"@math.gl/core@3.6.3":
|
||||
version "3.6.3"
|
||||
resolved "https://registry.npmmirror.com/@math.gl/core/-/core-3.6.3.tgz#a6bf796ed421093099749d609de8d99a3ac20a53"
|
||||
integrity sha512-jBABmDkj5uuuE0dTDmwwss7Cup5ZwQ6Qb7h1pgvtkEutTrhkcv8SuItQNXmF45494yIHeoGue08NlyeY6wxq2A==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.12.0"
|
||||
"@math.gl/types" "3.6.3"
|
||||
gl-matrix "^3.4.0"
|
||||
|
||||
"@math.gl/types@3.6.3":
|
||||
version "3.6.3"
|
||||
resolved "https://registry.npmmirror.com/@math.gl/types/-/types-3.6.3.tgz#9fa9866feabcbb76de107d78ff3a89c0243ac374"
|
||||
integrity sha512-3uWLVXHY3jQxsXCr/UCNPSc2BG0hNUljhmOBt9l+lNFDp7zHgm0cK2Tw4kj2XfkJy4TgwZTBGwRDQgWEbLbdTA==
|
||||
|
||||
"@mrmlnc/readdir-enhanced@^2.2.1":
|
||||
version "2.2.1"
|
||||
resolved "https://registry.npmmirror.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
|
||||
@ -719,27 +705,6 @@
|
||||
resolved "https://registry.npmmirror.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad"
|
||||
integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==
|
||||
|
||||
"@turf/helpers@^6.5.0":
|
||||
version "6.5.0"
|
||||
resolved "https://registry.npmmirror.com/@turf/helpers/-/helpers-6.5.0.tgz#f79af094bd6b8ce7ed2bd3e089a8493ee6cae82e"
|
||||
integrity sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==
|
||||
|
||||
"@turf/intersect@^6.5.0":
|
||||
version "6.5.0"
|
||||
resolved "https://registry.npmmirror.com/@turf/intersect/-/intersect-6.5.0.tgz#a14e161ddd0264d0f07ac4e325553c70c421f9e6"
|
||||
integrity sha512-2legGJeKrfFkzntcd4GouPugoqPUjexPZnOvfez+3SfIMrHvulw8qV8u7pfVyn2Yqs53yoVCEjS5sEpvQ5YRQg==
|
||||
dependencies:
|
||||
"@turf/helpers" "^6.5.0"
|
||||
"@turf/invariant" "^6.5.0"
|
||||
polygon-clipping "^0.15.3"
|
||||
|
||||
"@turf/invariant@^6.5.0":
|
||||
version "6.5.0"
|
||||
resolved "https://registry.npmmirror.com/@turf/invariant/-/invariant-6.5.0.tgz#970afc988023e39c7ccab2341bd06979ddc7463f"
|
||||
integrity sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==
|
||||
dependencies:
|
||||
"@turf/helpers" "^6.5.0"
|
||||
|
||||
"@types/eslint@^8.4.5":
|
||||
version "8.56.12"
|
||||
resolved "https://registry.npmmirror.com/@types/eslint/-/eslint-8.56.12.tgz#1657c814ffeba4d2f84c0d4ba0f44ca7ea1ca53a"
|
||||
@ -981,51 +946,6 @@
|
||||
resolved "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.13.tgz#87b309a6379c22b926e696893237826f64339b6f"
|
||||
integrity sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==
|
||||
|
||||
"@vuemap/amap-jsapi-loader@1.0.4":
|
||||
version "1.0.4"
|
||||
resolved "https://registry.npmmirror.com/@vuemap/amap-jsapi-loader/-/amap-jsapi-loader-1.0.4.tgz#699fc44eda74306ed489e9873d633f820cdac29a"
|
||||
integrity sha512-s5fFHrsNkjYMovEmUJ5S23jpDtElTanDN2HdCt/amOD245a8wWVcTPjl06YEHXtxf6Ewm+z29wQByOCn209Hxg==
|
||||
|
||||
"@vuemap/amap-jsapi-types@^0.0.16":
|
||||
version "0.0.16"
|
||||
resolved "https://registry.npmmirror.com/@vuemap/amap-jsapi-types/-/amap-jsapi-types-0.0.16.tgz#74f9d381d519fe1ce49b0ae8fe103f7213b1e5c2"
|
||||
integrity sha512-1B1H2IS8sT2RDubbpEY+K8j11Gb7PZY5Bo0cszRkF8Nw+9HNqpbUNeqkQ6+rxLkwIedcSkOsFDy/IyzXCUXqVw==
|
||||
|
||||
"@vuemap/amap-jsapi-types@^0.0.17":
|
||||
version "0.0.17"
|
||||
resolved "https://registry.npmmirror.com/@vuemap/amap-jsapi-types/-/amap-jsapi-types-0.0.17.tgz#3f21674520a97785388885a1b19c68acacaeb20e"
|
||||
integrity sha512-FHI8OMWxJWbgyuQ0tKclvurQIVHRexMIYAOwZ/z9+G7aHHK5EFhKM13siLczNNAgXdJ2dctPEghCdlhcByl3Ag==
|
||||
|
||||
"@vuemap/amap-xyz-layer@0.0.13":
|
||||
version "0.0.13"
|
||||
resolved "https://registry.npmmirror.com/@vuemap/amap-xyz-layer/-/amap-xyz-layer-0.0.13.tgz#e0479c6e5227d3bba5bfb42b70314f988d8920b7"
|
||||
integrity sha512-F6ZSoRGuQzeW9ETKFKES3WwbEogK68vBW5fpY5QGWAf54zumkfpJAIoU2x9gx1bzMT7hwDY895xIhNRuF1LwOw==
|
||||
dependencies:
|
||||
"@math.gl/core" "3.6.3"
|
||||
earcut "2.2.4"
|
||||
gl-matrix "3.4.3"
|
||||
|
||||
"@vuemap/district-cluster@0.0.11":
|
||||
version "0.0.11"
|
||||
resolved "https://registry.npmmirror.com/@vuemap/district-cluster/-/district-cluster-0.0.11.tgz#cdb37d621de03d73d462e47b580353f74f7c65e6"
|
||||
integrity sha512-SY01gFe8uhP5FKjzyTe0x2yL2K5VmwD5UKlEUU4e09UUZphXCj2Ci7iunX0L29nWINkBjdfxu8dXzhIcx9T3ug==
|
||||
dependencies:
|
||||
"@turf/helpers" "^6.5.0"
|
||||
"@turf/intersect" "^6.5.0"
|
||||
"@vuemap/amap-jsapi-types" "^0.0.16"
|
||||
topojson-client "3.1.0"
|
||||
|
||||
"@vuemap/vue-amap@^2.1.9":
|
||||
version "2.1.9"
|
||||
resolved "https://registry.npmmirror.com/@vuemap/vue-amap/-/vue-amap-2.1.9.tgz#ea039ea9e6cdfc7cea7610d4a3088a428922ba5c"
|
||||
integrity sha512-/5Rzljj2gYFuqh52If7Sbr/tYqZYUPPtTvvQBflj7SWVgpH06GMU40DhWizz9Ef62UzaifS2IKZjXeuAvRw4wQ==
|
||||
dependencies:
|
||||
"@vuemap/amap-jsapi-loader" "1.0.4"
|
||||
"@vuemap/amap-jsapi-types" "^0.0.17"
|
||||
"@vuemap/amap-xyz-layer" "0.0.13"
|
||||
"@vuemap/district-cluster" "0.0.11"
|
||||
lodash-es "^4.17.21"
|
||||
|
||||
"@vueuse/core@^9.1.0":
|
||||
version "9.13.0"
|
||||
resolved "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz#2f69e66d1905c1e4eebc249a01759cf88ea00cf4"
|
||||
@ -1748,7 +1668,7 @@ commander@*:
|
||||
resolved "https://registry.npmmirror.com/commander/-/commander-13.0.0.tgz#1b161f60ee3ceb8074583a0f95359a4f8701845c"
|
||||
integrity sha512-oPYleIY8wmTVzkvQq10AEok6YcTC4sRUBl8F9gVuwchGVUCTbl/vhLTaQqutuuySYOsu8YTgV+OxKc/8Yvx+mQ==
|
||||
|
||||
commander@2, commander@^2.20.0:
|
||||
commander@^2.20.0:
|
||||
version "2.20.3"
|
||||
resolved "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
|
||||
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
|
||||
@ -2166,11 +2086,6 @@ dunder-proto@^1.0.0, dunder-proto@^1.0.1:
|
||||
es-errors "^1.3.0"
|
||||
gopd "^1.2.0"
|
||||
|
||||
earcut@2.2.4:
|
||||
version "2.2.4"
|
||||
resolved "https://registry.npmmirror.com/earcut/-/earcut-2.2.4.tgz#6d02fd4d68160c114825d06890a92ecaae60343a"
|
||||
integrity sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==
|
||||
|
||||
echarts@^5.6.0:
|
||||
version "5.6.0"
|
||||
resolved "https://registry.npmmirror.com/echarts/-/echarts-5.6.0.tgz#2377874dca9fb50f104051c3553544752da3c9d6"
|
||||
@ -2965,11 +2880,6 @@ get-value@^2.0.3, get-value@^2.0.6:
|
||||
resolved "https://registry.npmmirror.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
|
||||
integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==
|
||||
|
||||
gl-matrix@3.4.3, gl-matrix@^3.4.0:
|
||||
version "3.4.3"
|
||||
resolved "https://registry.npmmirror.com/gl-matrix/-/gl-matrix-3.4.3.tgz#fc1191e8320009fd4d20e9339595c6041ddc22c9"
|
||||
integrity sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==
|
||||
|
||||
glob-parent@^3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
|
||||
@ -4707,14 +4617,6 @@ pkg-types@^1.2.1, pkg-types@^1.3.0:
|
||||
mlly "^1.7.4"
|
||||
pathe "^2.0.1"
|
||||
|
||||
polygon-clipping@^0.15.3:
|
||||
version "0.15.7"
|
||||
resolved "https://registry.npmmirror.com/polygon-clipping/-/polygon-clipping-0.15.7.tgz#3823ca1e372566f350795ce9dd9a7b19e97bdaad"
|
||||
integrity sha512-nhfdr83ECBg6xtqOAJab1tbksbBAOMUltN60bU+llHVOL0e5Onm1WpAXXWXVB39L8AJFssoIhEVuy/S90MmotA==
|
||||
dependencies:
|
||||
robust-predicates "^3.0.2"
|
||||
splaytree "^3.1.0"
|
||||
|
||||
posix-character-classes@^0.1.0:
|
||||
version "0.1.1"
|
||||
resolved "https://registry.npmmirror.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
|
||||
@ -5235,11 +5137,6 @@ rimraf@^3.0.2:
|
||||
dependencies:
|
||||
glob "^7.1.3"
|
||||
|
||||
robust-predicates@^3.0.2:
|
||||
version "3.0.2"
|
||||
resolved "https://registry.npmmirror.com/robust-predicates/-/robust-predicates-3.0.2.tgz#d5b28528c4824d20fc48df1928d41d9efa1ad771"
|
||||
integrity sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==
|
||||
|
||||
rollup@^2.77.2:
|
||||
version "2.79.2"
|
||||
resolved "https://registry.npmmirror.com/rollup/-/rollup-2.79.2.tgz#f150e4a5db4b121a21a747d762f701e5e9f49090"
|
||||
@ -5627,11 +5524,6 @@ specificity@^0.4.1:
|
||||
resolved "https://registry.npmmirror.com/specificity/-/specificity-0.4.1.tgz#aab5e645012db08ba182e151165738d00887b019"
|
||||
integrity sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==
|
||||
|
||||
splaytree@^3.1.0:
|
||||
version "3.1.2"
|
||||
resolved "https://registry.npmmirror.com/splaytree/-/splaytree-3.1.2.tgz#d1db2691665a3c69d630de98d55145a6546dc166"
|
||||
integrity sha512-4OM2BJgC5UzrhVnnJA4BkHKGtjXNzzUfpQjCO8I05xYPsfS/VuQDwjCGGMi8rYQilHEV4j8NBqTFbls/PZEE7A==
|
||||
|
||||
split-string@^3.0.1, split-string@^3.0.2:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.npmmirror.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
|
||||
@ -6145,13 +6037,6 @@ to-regex@^3.0.1, to-regex@^3.0.2:
|
||||
regex-not "^1.0.2"
|
||||
safe-regex "^1.1.0"
|
||||
|
||||
topojson-client@3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.npmmirror.com/topojson-client/-/topojson-client-3.1.0.tgz#22e8b1ed08a2b922feeb4af6f53b6ef09a467b99"
|
||||
integrity sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==
|
||||
dependencies:
|
||||
commander "2"
|
||||
|
||||
traverse@^0.6.6:
|
||||
version "0.6.11"
|
||||
resolved "https://registry.npmmirror.com/traverse/-/traverse-0.6.11.tgz#e8daa071b101ae66767fffa6f177aa6f7110068e"
|
||||
|
Loading…
x
Reference in New Issue
Block a user