feat:新增土地管理模块

This commit is contained in:
李想 2025-02-26 13:36:43 +08:00
parent 775a4b6ef6
commit e80a2ddcbd
12 changed files with 431 additions and 38 deletions

View File

@ -0,0 +1,75 @@
/* eslint-disable */
/* prettier-ignore */
// @ts-nocheck
// noinspection JSUnusedGlobalSymbols
// Generated by unplugin-auto-import
export {}
declare global {
const EffectScope: typeof import('vue')['EffectScope']
const computed: typeof import('vue')['computed']
const createApp: typeof import('vue')['createApp']
const customRef: typeof import('vue')['customRef']
const defineAsyncComponent: typeof import('vue')['defineAsyncComponent']
const defineComponent: typeof import('vue')['defineComponent']
const effectScope: typeof import('vue')['effectScope']
const getCurrentInstance: typeof import('vue')['getCurrentInstance']
const getCurrentScope: typeof import('vue')['getCurrentScope']
const h: typeof import('vue')['h']
const inject: typeof import('vue')['inject']
const isProxy: typeof import('vue')['isProxy']
const isReactive: typeof import('vue')['isReactive']
const isReadonly: typeof import('vue')['isReadonly']
const isRef: typeof import('vue')['isRef']
const markRaw: typeof import('vue')['markRaw']
const nextTick: typeof import('vue')['nextTick']
const onActivated: typeof import('vue')['onActivated']
const onBeforeMount: typeof import('vue')['onBeforeMount']
const onBeforeRouteLeave: typeof import('vue-router')['onBeforeRouteLeave']
const onBeforeRouteUpdate: typeof import('vue-router')['onBeforeRouteUpdate']
const onBeforeUnmount: typeof import('vue')['onBeforeUnmount']
const onBeforeUpdate: typeof import('vue')['onBeforeUpdate']
const onDeactivated: typeof import('vue')['onDeactivated']
const onErrorCaptured: typeof import('vue')['onErrorCaptured']
const onMounted: typeof import('vue')['onMounted']
const onRenderTracked: typeof import('vue')['onRenderTracked']
const onRenderTriggered: typeof import('vue')['onRenderTriggered']
const onScopeDispose: typeof import('vue')['onScopeDispose']
const onServerPrefetch: typeof import('vue')['onServerPrefetch']
const onUnmounted: typeof import('vue')['onUnmounted']
const onUpdated: typeof import('vue')['onUpdated']
const onWatcherCleanup: typeof import('vue')['onWatcherCleanup']
const provide: typeof import('vue')['provide']
const reactive: typeof import('vue')['reactive']
const readonly: typeof import('vue')['readonly']
const ref: typeof import('vue')['ref']
const resolveComponent: typeof import('vue')['resolveComponent']
const shallowReactive: typeof import('vue')['shallowReactive']
const shallowReadonly: typeof import('vue')['shallowReadonly']
const shallowRef: typeof import('vue')['shallowRef']
const toRaw: typeof import('vue')['toRaw']
const toRef: typeof import('vue')['toRef']
const toRefs: typeof import('vue')['toRefs']
const toValue: typeof import('vue')['toValue']
const triggerRef: typeof import('vue')['triggerRef']
const unref: typeof import('vue')['unref']
const useAttrs: typeof import('vue')['useAttrs']
const useCssModule: typeof import('vue')['useCssModule']
const useCssVars: typeof import('vue')['useCssVars']
const useId: typeof import('vue')['useId']
const useLink: typeof import('vue-router')['useLink']
const useModel: typeof import('vue')['useModel']
const useRoute: typeof import('vue-router')['useRoute']
const useRouter: typeof import('vue-router')['useRouter']
const useSlots: typeof import('vue')['useSlots']
const useTemplateRef: typeof import('vue')['useTemplateRef']
const watch: typeof import('vue')['watch']
const watchEffect: typeof import('vue')['watchEffect']
const watchPostEffect: typeof import('vue')['watchPostEffect']
const watchSyncEffect: typeof import('vue')['watchSyncEffect']
}
// for type re-export
declare global {
// @ts-ignore
export type { Component, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue'
import('vue')
}

View File

@ -0,0 +1,16 @@
/* eslint-disable */
/* prettier-ignore */
// @ts-nocheck
// Generated by unplugin-vue-components
// Read more: https://github.com/vuejs/core/pull/3399
export {}
declare module 'vue' {
export interface GlobalComponents {
CustCard: typeof import('./src/components/CustCard.vue')['default']
LandType: typeof import('./src/components/LandType.vue')['default']
Pagina: typeof import('./src/components/Pagina.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
}
}

View File

@ -1,7 +1,7 @@
import request from '@/utils/axios'; import request from '@/utils/axios';
export function getLandList(params = {}) { export function getLandsList(params = {}) {
return request('land-resource/gridManage/page', { return request('land-resource/landManage/page', {
method: 'GET', method: 'GET',
params, params,
}); });

View File

@ -1,5 +1,5 @@
<template> <template>
<el-card body-class="custom_content_card_" shadow="props.shadow"> <el-card body-class="custom_content_card_" :shadow="props.shadow">
<slot></slot> <slot></slot>
</el-card> </el-card>
</template> </template>

View File

@ -0,0 +1,56 @@
<template>
<el-select v-model="val" @change="change">
<el-option v-for="item in options" :key="`land_type_${item.value}`" :value="item.value" :label="item.label" placeholder="请选择">
{{ item.label }}
</el-option>
</el-select>
</template>
<script setup>
import { ref, watch } from 'vue';
const props = defineProps({
//
value: {
type: Number,
default: 0,
},
});
const emit = defineEmits(['update:value']);
/* --------------- data --------------- */
// #region
const val = ref(0);
watch(
() => props.value,
() => {
val.value = props.value;
},
{
deep: true,
immediate: true,
}
);
const options = ref([
{ label: '耕地', value: 0 },
{ label: '果园', value: 1 },
{ label: '茶园', value: 2 },
{ label: '其他园地', value: 3 },
{ label: '林地', value: 4 },
{ label: '草地', value: 5 },
{ label: '其他农用地', value: 6 },
{ label: '农村宅基地', value: 7 },
]);
// #endregion
/* --------------- methods --------------- */
// #region
function change(val_) {
val.value = val_;
emit('update:value', val_);
}
// #endregion
</script>
<style lang="scss" scoped></style>

View File

@ -59,6 +59,7 @@ const logOut = async () => {
type: 'success', type: 'success',
message: '退出登录成功!', message: '退出登录成功!',
}); });
localStorage.removeItem('daimp-front-main_user_store');
} }
}); });
}); });

View File

@ -11,6 +11,7 @@ import Layout from '@/layouts/index.vue';
import resourceRouter from './modules/resource'; import resourceRouter from './modules/resource';
import plantingAndBreedingRouter from './modules/plantingAndBreeding'; import plantingAndBreedingRouter from './modules/plantingAndBreeding';
import landsRoutes from './modules/lands';
const { VITE_APP_NAME } = import.meta.env; const { VITE_APP_NAME } = import.meta.env;
@ -44,6 +45,7 @@ export const constantRoutes = [
}, },
// ...resourceRouter, // ...resourceRouter,
...plantingAndBreedingRouter, ...plantingAndBreedingRouter,
...landsRoutes,
]; ];
/** /**

View File

@ -0,0 +1,44 @@
import Layout from '@/layouts/index.vue';
const landsRoutes = [
{
path: '/landManage',
name: 'landManage',
component: Layout,
redirect: '/landsManage',
meta: { title: '土地管理', icon: 'Document' },
children: [
{
path: '/landsManage',
name: 'landsManage',
component: () => import('@/views/landManage/component/landsManage/index.vue'),
meta: { title: '土地管理', icon: 'Document' },
},
{
path: '/plantPlan',
name: 'plantPlan',
component: () => import('@/views/landManage/component/plantPlan/index.vue'),
meta: { title: '种植规划', icon: 'Document' },
},
{
path: '/landPartol',
name: 'landPartol',
component: () => import('@/views/landManage/component/landPartol/index.vue'),
meta: { title: '土地巡查', icon: 'Document' },
},
{
path: '/illegalHandle',
name: 'illegalHandle',
component: () => import('@/views/landManage/component/illegalHandle/index.vue'),
meta: { title: '土地违法处理', icon: 'Document' },
},
{
path: '/operationRecord',
name: 'operationRecord',
component: () => import('@/views/landManage/component/operationRecord/index.vue'),
meta: { title: '作业记录', icon: 'Document' },
},
],
},
];
export default landsRoutes;

View File

@ -75,37 +75,4 @@ export default [
}, },
], ],
}, },
{
path: '/landManage',
name: 'landManage',
component: Layout,
redirect: '/plantPlan',
meta: { title: '土地管理', icon: 'Document' },
children: [
{
path: '/plantPlan',
name: 'plantPlan',
component: () => import('@/views/landManage/component/plantPlan/index.vue'),
meta: { title: '种植规划', icon: 'Document' },
},
{
path: '/landPartol',
name: 'landPartol',
component: () => import('@/views/landManage/component/landPartol/index.vue'),
meta: { title: '土地巡查', icon: 'Document' },
},
{
path: '/illegalHandle',
name: 'illegalHandle',
component: () => import('@/views/landManage/component/illegalHandle/index.vue'),
meta: { title: '土地违法处理', icon: 'Document' },
},
{
path: '/operationRecord',
name: 'operationRecord',
component: () => import('@/views/landManage/component/operationRecord/index.vue'),
meta: { title: '作业记录', icon: 'Document' },
},
],
},
]; ];

View File

@ -0,0 +1,57 @@
<template>
<el-drawer v-model="visible" title="土地信息" :size="800">
<el-card>
<div>基础信息</div>
<el-form :model="baseInfo">
<el-form-item label="土地名称">
<el-input v-model="baseInfo.landName" placeholder="请输入名称"></el-input>
</el-form-item>
<el-form-item label="土地名称"></el-form-item>
<el-form-item label="土地名称"></el-form-item>
<el-form-item label="土地名称"></el-form-item>
<el-form-item label="土地名称"></el-form-item>
<el-form-item label="土地名称"></el-form-item>
<el-form-item label="土地名称"></el-form-item>
<el-form-item label="土地名称"></el-form-item>
<el-form-item label="土地名称"></el-form-item>
</el-form>
<LandType v-model:value="baseInfo.LandType" />
</el-card>
<el-card>
<div>土地产权信息</div>
</el-card>
<el-button @click="handleSubmit"></el-button>
</el-drawer>
</template>
<script setup>
import { reactive, ref, watch } from 'vue';
import LandType from '@/components/LandType.vue';
/* --------------- data --------------- */
// #region
const visible = ref(true);
const baseInfo = reactive({
landName: '',
gridName: '',
LandType: 1,
});
watch(
() => baseInfo,
() => {
console.log('---', baseInfo);
}
);
// #endregion
/* --------------- methods --------------- */
// #region
function handleSubmit() {
console.log('submit', baseInfo);
}
// #endregion
</script>
<style lang="scss" scoped></style>

View File

@ -0,0 +1,175 @@
<template>
<CustCard>
<el-radio-group v-model="searchCondition.draftsSaveType" class="lands_types" style="margin-bottom: 30px" @change="getList()">
<el-radio-button v-for="item in landsType" :key="'landsType_' + item.value" :value="item.value">
{{ item.label }}
</el-radio-button>
</el-radio-group>
<el-form ref="searchRef" :model="searchCondition">
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="土地名称:" prop="landName">
<el-input v-model="searchCondition.landName" placeholder="请输入"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="所属网格" prop="gridName">
<el-input v-model="searchCondition.gridName" placeholder="请输入"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="产权人" prop="owner">
<el-input v-model="searchCondition.owner" placeholder="请输入"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-button type="primary" @click="getList()">查询</el-button>
<el-button type="" @click="handleResetSearch">重置</el-button>
</el-col>
</el-row>
</el-form>
<div class="options_btns">
<el-button v-for="(item, i) in btns" :key="'btns_' + i" type="primary" @click="item.method">
{{ item.label }}
</el-button>
</div>
<el-table :data="list">
<el-table-column type="selection" width="55" />
<el-table-column type="index"> </el-table-column>
<el-table-column label="地块名" prop="landName" width="240" show-overflow-tooltip />
<el-table-column label="地址" prop="address" show-overflow-tooltip />
<el-table-column label="产权人" prop="owner" show-overflow-tooltip />
<el-table-column label="所属网格" prop="gridName" show-overflow-tooltip />
<el-table-column label="农用地分类" prop="landClassificationType" show-overflow-tooltip />
<el-table-column label="面积" prop="978.2" show-overflow-tooltip />
<el-table-column label="坐标" prop="coordinate" show-overflow-tooltip />
<el-table-column label="是否土地流转" prop="landTransfer" show-overflow-tooltip>
<template #default="{ row }">
{{ !row.landTransfer ? '是' : '否' }}
</template>
</el-table-column>
<el-table-column label="产权编号" prop="" show-overflow-tooltip />
<el-table-column label="土壤类型" prop="soilType" show-overflow-tooltip />
<el-table-column label="是否上传附件" prop="isUpload" show-overflow-tooltip>
<template #default="{ row }">{{ !row.isUpload ? '是' : '否' }}</template>
</el-table-column>
<el-table-column fixed="right" label="操作" width="200" show-overflow-tooltip />
</el-table>
<Pagina :page-data="pageData" />
</CustCard>
<CreateLand />
</template>
<script setup>
import { ref, reactive, onMounted } from 'vue';
import Pagina from '@/components/pagina.vue';
import CustCard from '@/components/CustCard.vue';
import { getLandsList } from '@/apis/land.js';
import CreateLand from './common/CreateLand.vue';
onMounted(() => {
getList();
});
/* --------------- data --------------- */
// #region
const landsType = ref([
{
value: '0',
label: '农用地',
},
{
value: '1',
label: '住宅用地',
},
{
value: '2',
label: '园林',
},
]);
const searchCondition = reactive({
draftsSaveType: '0',
landName: '',
gridName: '',
owner: '',
});
const searchRef = ref();
const pageData = reactive({
page: 1,
size: 10,
total: 0,
});
const list = ref([]);
const btns = reactive([
{
label: '新增土地',
method: function () {
console.log('add');
},
},
{
label: '审核',
disabled: true,
method: function () {
console.log('examine');
},
},
{
label: '导入',
disabled: false,
method: function () {
console.log('import');
},
},
{
label: '导出',
disabled: true,
method: function () {
console.log('export');
},
},
]);
// #endregion
/* --------------- methods --------------- */
// #region
async function getList() {
const params = {
current: pageData.page,
size: pageData.size,
...searchCondition,
};
let res = await getLandsList(params);
console.log('res ---------', res);
}
function handleResetSearch() {
console.log('searchRef', searchRef.value);
searchRef.value && searchRef.value.resetFields();
getLandsList();
}
// #endregion
</script>
<style lang="scss" scoped>
.lands_types {
width: 100%;
justify-content: center;
> label {
width: 12%;
::v-deep() {
.el-radio-button__inner {
width: 100%;
}
}
}
}
.options_btns {
margin-bottom: 12px;
.el-button {
width: 120px;
}
}
</style>

View File

@ -11,7 +11,7 @@
import { ref, reactive, onMounted } from 'vue'; import { ref, reactive, onMounted } from 'vue';
import Pagina from '@/components/pagina.vue'; import Pagina from '@/components/pagina.vue';
import CustCard from '@/components/CustCard.vue'; import CustCard from '@/components/CustCard.vue';
import { getLandList } from '@/apis/land.js'; import { getLandsList } from '@/apis/land.js';
onMounted(() => { onMounted(() => {
getList(); getList();
@ -36,7 +36,7 @@ const pageData = reactive({
async function getList() { async function getList() {
const params = { current: pageData.page, size: pageData.size }; const params = { current: pageData.page, size: pageData.size };
let res = await getLandList(params); let res = await getLandsList(params);
console.log('res ---------', res); console.log('res ---------', res);
} }