村庄管理

This commit is contained in:
du 2024-02-22 17:29:54 +08:00
parent cdc209485f
commit 9ad7a9e201
14 changed files with 303 additions and 244 deletions

View File

@ -13,8 +13,8 @@ VITE_PROXY_API = /dev-api
# http://42.193.40.239:8017/doc.html//线上 http://192.168.110.186:8017/doc.html//本地
VITE_PROXY = [ ["/dev-api", "http://42.193.40.239:8017" ],["/dev-img-api", "http://file.sczysoft.com" ]]
# VITE_PROXY = [ ["/dev-api", "http://192.168.110.186:8017" ],["/dev-img-api", "http://file.sczysoft.com" ]]
# VITE_PROXY = [ ["/dev-api", "http://42.193.40.239:8017" ],["/dev-img-api", "http://file.sczysoft.com" ]]
VITE_PROXY = [ ["/dev-api", "http://192.168.110.186:8017" ],["/dev-img-api", "http://file.sczysoft.com" ]]
#
VITE_GLOB_UPLOAD_URL=/dev-api
VITE_UPLOAD_IMG_URL=/dev-img-api

23
src/api/base.ts Normal file
View File

@ -0,0 +1,23 @@
import request from "@/utils/request";
/**
*-
*/
export function orgPage(data) {
return request({
url: `/common/sysorg/orgPage`,
method: "GET",
params: data
});
}
/**
*-
*/
export function orgAdd(params) {
return request({
url: `/common/sysorg/orgAdd`,
method: "POST",
data: params
});
}

View File

@ -119,70 +119,70 @@ function pro() {
<style lang="scss" scoped>
.tools {
display: flex;
align-items: center;
padding: 0 20px;
white-space: nowrap;
.buttons {
margin-right: 20px;
.item {
display: inline-flex;
align-items: center;
justify-content: center;
height: 24px;
width: 34px;
cursor: pointer;
vertical-align: middle;
.el-icon {
color: var(--el-text-color-primary);
transition: var(--el-transition-color);
}
display: flex;
align-items: center;
padding: 0 20px;
white-space: nowrap;
.buttons {
margin-right: 20px;
.item {
display: inline-flex;
align-items: center;
justify-content: center;
height: 24px;
width: 34px;
cursor: pointer;
vertical-align: middle;
.el-icon {
color: var(--el-text-color-primary);
transition: var(--el-transition-color);
}
}
.item-pro {
display: inline-block;
width: auto;
padding: 0 10px;
transform-origin: right center;
animation: pro-text 3s ease-out infinite;
@keyframes pro-text {
0%,
20% {
transform: scale(1);
}
50%,
70% {
transform: scale(1.2);
}
100% {
transform: scale(1);
}
}
.el-icon {
vertical-align: middle;
}
.title {
padding-left: 5px;
font-weight: bold;
font-size: 14px;
background-image: linear-gradient(to right, #ffa237, #fc455d);
/* stylelint-disable-next-line property-no-vendor-prefix */
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
}
}
.item-pro {
display: inline-block;
width: auto;
padding: 0 10px;
transform-origin: right center;
animation: pro-text 3s ease-out infinite;
@keyframes pro-text {
0%,
20% {
transform: scale(1);
}
50%,
70% {
transform: scale(1.2);
}
100% {
transform: scale(1);
}
}
.el-icon {
vertical-align: middle;
}
.title {
padding-left: 5px;
font-weight: bold;
font-size: 14px;
background-image: linear-gradient(to right, #ffa237, #fc455d);
/* stylelint-disable-next-line property-no-vendor-prefix */
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
}
}
}
:deep(.user-container) {
display: inline-block;
height: 24px;
line-height: 24px;
cursor: pointer;
.user-wrapper {
.el-avatar {
vertical-align: middle;
margin-top: -2px;
margin-right: 4px;
display: inline-block;
height: 24px;
line-height: 24px;
cursor: pointer;
.user-wrapper {
.el-avatar {
vertical-align: middle;
margin-top: -2px;
margin-right: 4px;
}
}
}
}
</style>

View File

@ -42,7 +42,7 @@ export default {
meta: {
icon: 'point',
auth: "emer.house",
title: '物资管理',
title: '应急仓库',
breadcrumb: true, //是否显示面包屑
},
children: [

View File

@ -7,10 +7,10 @@ const useUserStore = defineStore(
'user',
{
state: () => ({
user: localStorage.user || '',
account: localStorage.account || '',
token: localStorage.token || '',
failure_time: localStorage.failure_time || '',
user: localStorage.user_df || '',
account: localStorage.account_df || '',
token: localStorage.token_df || '',
failure_time: localStorage.failure_time_df || '',
permissions: []
}),
getters: {
@ -31,12 +31,13 @@ const useUserStore = defineStore(
login(data) {
return new Promise((resolve, reject) => {
loginIn(data).then(res => {
console.log(res,'res====>');
if (res.code == 1) {
conpanyInfo(res.data.sysuserid).then(result => {
localStorage.setItem('user-df', JSON.stringify(res.data))
localStorage.setItem('account-df', res.data.postName)
localStorage.setItem('token-df', res.data.tokenValue)
localStorage.setItem('failure_time-df', 1664008260)
localStorage.setItem('user_df', JSON.stringify(res.data))
localStorage.setItem('account_df', res.data.postName)
localStorage.setItem('token_df', res.data.tokenValue)
localStorage.setItem('failure_time_df', 1664008260)
resolve()
}).catch(error => {
reject(error)
@ -53,10 +54,10 @@ const useUserStore = defineStore(
return new Promise(resolve => {
const routeStore = useRouteStore()
const menuStore = useMenuStore()
localStorage.removeItem('account-df')
localStorage.removeItem('token-df')
localStorage.removeItem('user-df')
localStorage.removeItem('failure_time-df')
localStorage.removeItem('account_df')
localStorage.removeItem('token_df')
localStorage.removeItem('user_df')
localStorage.removeItem('failure_time_df')
this.account = ''
this.token = ''
this.failure_time = ''

View File

@ -38,9 +38,9 @@ function configRequest(service: {
service.interceptors.request.use(
(config: { headers: { [x: string]: string } }) => {
// tokencancel 跳转白名单不携带token
const token = localStorage.getItem("token");
const token = localStorage.getItem("token_df");
const tokencancel = localStorage.getItem('token-cancel');
let user= JSON.parse(localStorage.getItem("user"));
let user= JSON.parse(localStorage.getItem("user_df"));
if (!tokencancel && token) {
// config.headers["userToken"] = token || "";
config.headers[user.tokenName] = user.tokenValue;
@ -62,13 +62,13 @@ function configRequest(service: {
const code = (res.data && res.data.code) || res.status;
const msg = res.data.msg;
if (code === 401) {
localStorage.setItem('token', "")
localStorage.setItem('token_df', "")
} else if (code === 500) {
alert(msg);
return Promise.reject("error");
} else if (code == 28) {
alert("登录状态已过期,请重新登录!");
localStorage.setItem('token', "")
localStorage.setItem('token_df', "")
location.reload();
} else {
return res.data;

View File

@ -16,23 +16,43 @@
:model="formData"
class="center-form"
>
<el-form-item label="村庄名称" prop="cName" style="width: 94%">
<el-form-item label="村庄名称" prop="orgname">
<el-input
placeholder="请输入"
type="input"
v-model="formData.cName"
v-model="formData.orgname"
/>
</el-form-item>
<el-form-item label="村长姓名" prop="name">
<el-input placeholder="请输入" type="input" v-model="formData.name" />
<el-form-item prop="superiororgcode" label="所属区域">
<el-cascader
ref="cascader"
v-model="formData.superiororgcode"
placeholder="请选择地区"
:options="orgList"
:props="{
checkStrictly: true,
label: 'orgname',
value: 'orgcode',
}"
clearable
></el-cascader>
</el-form-item>
<el-form-item label="联系电话" prop="phone">
<el-form-item label="负责人" prop="charger">
<el-input placeholder="请输入负责人" type="input" v-model="formData.charger" />
</el-form-item>
<el-form-item label="联系电话" prop="telephone">
<el-input
placeholder="请输入"
placeholder="请输入联系电话"
type="input"
v-model="formData.phone"
v-model="formData.telephone"
/>
</el-form-item>
<el-form-item prop="sortId" label="排序">
<el-input-number
v-model="formData.sortId"
:min="1"
></el-input-number>
</el-form-item>
</el-form>
</div>
</BaseDialog>
@ -40,7 +60,12 @@
<script setup lang='ts'>
import { reactive, ref, onMounted, watch } from "vue";
import { ElMessage, FormInstance, FormRules } from "element-plus";
import { areaTree } from "@/api/account";
import { orgAdd } from "@/api/base";
import useUserStore from "@/store/modules/user";
const userStore = useUserStore();
const user = ref(JSON.parse(userStore.userInfo));
const userId = ref(user.value.userId);
const props = defineProps({
visible: {
type: Boolean,
@ -49,12 +74,15 @@ const props = defineProps({
form: Object,
});
const emits = defineEmits(["close"]);
const titleName = ref("新增");
//
const formRef = ref<FormInstance>();
const ruleForm = reactive<FormRules>({
itemTitle: [{ required: true, message: "请输入内容", trigger: "blur" }],
orgname: [{ required: true, message: "请输入村庄名称", trigger: "blur" }],
sortId: [{ required: true, message: "请输入排序", trigger: "blur" }],
superiororgcode: [{ required: true, message: "请选择所属地区", trigger: "blur" }],
});
const formData = ref<any>({});
@ -62,25 +90,62 @@ const formData = ref<any>({});
const handleSubmit = () => {
formRef.value?.validate((valid) => {
if (valid) {
let params = {
orgname:formData.value.orgname,
superiororgcode:'',
sortId:formData.value.sortId,
charger:formData.value.charger,
telephone:formData.value.telephone,
orgcode:formData.value.orgcode?formData.value.orgcode:null,
};
if (formData.value.superiororgcode instanceof Array) {
params.superiororgcode = formData.value.superiororgcode[formData.value.superiororgcode.length - 1];
}else{
params.superiororgcode = formData.value.superiororgcode;
};
orgAdd(params).then((res: any) => {
if (res.code == 1) {
ElMessage({
message: "保存成功",
type: "success",
});
onclone();
}else{
ElMessage({
message: res.message,
type: "error",
});
}
});
}
return false;
});
};
//
const orgList = ref([]);
const getareaTree = () => {
areaTree(userId.value).then((res: any) => {
orgList.value = res.data;
});
};
//
const onclone = () => {
formRef.value?.clearValidate();
formData.value = {};
emits("close");
};
onMounted(() => {});
onMounted(() => {
getareaTree();
});
watch(
() => props.form,
(val: any) => {
titleName.value = val.id ? "编辑" : "新增";
formData.value = JSON.parse(JSON.stringify(val));
}
);
</script>
<style scoped></style>
<style scoped lang="scss">
</style>

View File

@ -18,7 +18,7 @@
</div>
</div>
</div>
<div style="width: 30%">
<div style="width: 30%;">
<div>
<el-input
v-model="search"
@ -55,21 +55,21 @@
</template>
</el-table-column>
<el-table-column
prop="cName"
prop="orgname"
:resizable="true"
align="center"
label="村庄名称"
>
</el-table-column>
<el-table-column
prop="name"
prop="charger"
:resizable="true"
align="center"
label="村长"
label="负责人"
>
</el-table-column>
<el-table-column
prop="phone"
prop="telephone"
:resizable="true"
align="center"
label="联系电话"
@ -89,13 +89,6 @@
<svg-icon name="edit" class="icon"></svg-icon>
<span class="edit">编辑</span>
</span>
<span
class="operate"
@click="(currentItem = scope.row), (visible = true)"
>
<svg-icon name="detail" class="icon"></svg-icon>
<span class="detail">详情</span>
</span>
<span class="operate" @click="del(scope.row, '删除')">
<svg-icon name="delete" class="icon"></svg-icon>
<span class="func">删除</span>
@ -119,7 +112,7 @@
<add-edit
:visible="dialogVisible"
:form="currentItem"
@close="(dialogVisible = false), (currentItem = {})"
@close="onclone()"
/>
</div>
</template>
@ -129,9 +122,11 @@ import { ElMessageBox } from "element-plus";
import { onMounted, reactive, ref } from "vue";
import AddEdit from "./dialog/add-edit.vue";
import { useRouter } from "vue-router";
import { orgPage } from "@/api/base";
const router = useRouter();
const search = ref([]);
const tableDataloading = ref(false);
const search = ref('');
const currentPage = ref(1);
const pageSize = ref(10);
const total = ref(0);
@ -152,28 +147,44 @@ const del = (item, tips) => {
type: "warning",
}).then(() => {});
};
const getList = () => {
tableDataloading.value = true;
let params = {
limit: pageSize.value,
page: currentPage.value,
condition: search.value,
};
orgPage(params).then((res: any) => {
tableData.value = res.data.list;
total.value = res.data.total;
tableDataloading.value = false;
});
};
onMounted(() => {});
//
const onclone = () => {
dialogVisible.value = false;
currentItem.value = {};
getList();
};
onMounted(() => {
getList();
});
</script>
<style lang="scss" scoped>
.content {
width: 100%;
background: #fff;
border-radius: 0.26042vw;
box-shadow: 0 0 0.41667vw 0 rgba(8, 33, 85, 0.1);
height: 100%;
padding: 0.83333vw;
overflow-y: auto;
overflow-x: hidden !important;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-o-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
.table {
margin-top: 16px;
}
width: 100%;
background: #fff;
border-radius: 0.26042vw;
box-shadow: 0 0 0.41667vw 0 rgb(8 33 85 / 10%);
height: 100%;
padding: 0.83333vw;
overflow-y: auto;
overflow-x: hidden !important;
box-sizing: border-box;
.table {
margin-top: 16px;
}
}
</style>

View File

@ -117,15 +117,9 @@
:disabled="props.readonly"
>
<img
<<<<<<< HEAD:src/views/emergency/equip/inventory/AddWarehouse.vue
v-if="addPostFactorForm.equipPhoto"
:src="addPostFactorForm.equipPhoto"
style="width: 100%; height: 100%;"
=======
v-if="addForm.equipPhoto"
:src="baseImgUrl + addForm.equipPhoto"
style="width: 100%; height: 100%"
>>>>>>> e36af856493c21fdd846c5881a8f69d73962aad5:src/views/emergency/house/dialog/add-equip-dialog.vue
style="width: 100%; height: 100%;"
/>
<el-icon v-else class="avatar-uploader-icon">
<Plus />

View File

@ -1,7 +1,7 @@
<template>
<div class="percentage-content">
<div class="content">
<div style="margin-bottom: 16px" class="h-layout space-between h-center">
<div style="margin-bottom: 16px;" class="h-layout space-between h-center">
<div>
<div class="h-layout">
<div
@ -17,7 +17,7 @@
</div>
</div>
</div>
<div style="width: 30%">
<div style="width: 30%;">
<div>
<el-input
v-model="search"
@ -210,19 +210,23 @@ onMounted(() => {
</script>
<style lang="scss" scoped>
.content {
width: 100%;
// flex: auto;
background: #fff;
border-radius: 0.26042vw;
box-shadow: 0 0 0.41667vw 0 rgba(8, 33, 85, 0.1);
height: 100%;
padding: 0.83333vw;
overflow-y: auto;
overflow-x: hidden !important;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-o-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
width: 100%;
// flex: auto;
background: #fff;
border-radius: 0.26042vw;
box-shadow: 0 0 0.41667vw 0 rgb(8 33 85 / 10%);
height: 100%;
padding: 0.83333vw;
overflow-y: auto;
overflow-x: hidden !important;
/* stylelint-disable-next-line property-no-vendor-prefix */
-moz-box-sizing: border-box;
/* stylelint-disable-next-line property-no-vendor-prefix */
-webkit-box-sizing: border-box;
/* stylelint-disable-next-line property-no-vendor-prefix */
-o-box-sizing: border-box;
/* stylelint-disable-next-line property-no-vendor-prefix */
-ms-box-sizing: border-box;
box-sizing: border-box;
}
</style>

View File

@ -38,23 +38,7 @@
clearable
></el-cascader>
</el-form-item>
<el-form-item prop="possession" label="队伍层级">
<el-select v-model="addPostFactorForm.possession" placeholder="请选择队伍层级">
<el-option
v-for="item in levelList"
:key="item.value"
:label="item.value"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="personnum" label="人数">
<el-input-number
v-model="addPostFactorForm.personnum"
:min="1"
></el-input-number>
</el-form-item>
<el-form-item prop="chkbillname" label="负责人">
<el-input
placeholder="请输入负责人"
@ -69,7 +53,13 @@
>
</el-input>
</el-form-item>
<el-form-item prop="chkbillname" style="width: 100%" label="队伍简介">
<el-form-item prop="personnum" label="人数">
<el-input-number
v-model="addPostFactorForm.personnum"
:min="1"
></el-input-number>
</el-form-item>
<el-form-item prop="chkbillname" style="width: 100%;" label="队伍简介">
<el-input
placeholder="请输入队伍简介"
type="textarea"
@ -97,12 +87,6 @@ const userId = ref(user.value.userId);
const planId = ref("");
const indexClassify = ref([]);
const fileList = ref<any>([]);
const levelList = ref([
{ value: "区级" },
{ value: "镇级" },
{ value: "园区" },
{ value: "企业" },
]);
const ruleForm = reactive<FormRules>({
teamname: [{ required: true, message: "请输入队伍名称", trigger: "change" }],
orgcode: [{ required: true, message: "请选择所属区域", trigger: "blur" }],
@ -171,15 +155,15 @@ watch(
<style lang="scss" scoped>
.detailForm-content {
margin-right: 30px;
margin-right: 30px;
}
:deep(.el-form) {
display: flex;
flex-wrap: wrap;
// justify-content: space-around;
justify-content: space-between;
display: flex;
flex-wrap: wrap;
// justify-content: space-around;
justify-content: space-between;
}
:deep(.el-form-item) {
width: 47%;
width: 47%;
}
</style>

View File

@ -1,7 +1,7 @@
<template>
<div class="percentage-content">
<div class="content">
<div style="margin-bottom: 16px" class="h-layout space-between h-center">
<div style="margin-bottom: 16px;" class="h-layout space-between h-center">
<div>
<div class="h-layout">
<div class="tool-item" @click="(dialogVisible = true), (form = {})">
@ -14,7 +14,7 @@
</div>
</div>
</div>
<div style="width: 30%">
<div style="width: 30%;">
<div>
<el-input
v-model="search"
@ -53,7 +53,7 @@
>
</el-table-column>
<el-table-column
prop="orgcode"
prop="areaName"
:resizable="true"
align="center"
label="所属区域"
@ -183,6 +183,7 @@ const todetail = (id) => {
const onclone = () => {
dialogVisible.value = false;
form.value = {};
getList();
};
onMounted(() => {
getList();
@ -190,19 +191,16 @@ onMounted(() => {
</script>
<style lang="scss" scoped>
.content {
width: 100%;
// flex: auto;
background: #fff;
border-radius: 0.26042vw;
box-shadow: 0 0 0.41667vw 0 rgba(8, 33, 85, 0.1);
height: 100%;
padding: 0.83333vw;
overflow-y: auto;
overflow-x: hidden !important;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-o-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
width: 100%;
// flex: auto;
background: #fff;
border-radius: 0.26042vw;
box-shadow: 0 0 0.41667vw 0 rgb(8 33 85 / 10%);
height: 100%;
padding: 0.83333vw;
overflow-y: auto;
overflow-x: hidden !important;
box-sizing: border-box;
box-sizing: border-box;
}
</style>

View File

@ -57,30 +57,6 @@
clearable
></el-cascader>
</el-form-item>
<el-form-item label="队伍层级">
<el-select
:readonly="!readonly"
v-model="detailForm.possession"
placeholder="请选择队伍层级"
>
<el-option
v-for="item in levelList"
:key="item.value"
:label="item.value"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="人数" prop="personnum">
<el-input
type="number"
min="0"
:readonly="!readonly"
v-model="detailForm.personnum"
onkeyup="value=value.replace(/[^\d^\.]+/g,'').replace('.','$#$').replace(/\./g,'').replace('$#$','.')"
></el-input>
</el-form-item>
<el-form-item label="负责人">
<el-input
:readonly="!readonly"
@ -93,7 +69,16 @@
v-model="detailForm.principaltel"
></el-input>
</el-form-item>
<el-form-item label="队伍简介" style="width: 100%">
<el-form-item label="人数" prop="personnum">
<el-input
type="number"
min="0"
:readonly="!readonly"
v-model="detailForm.personnum"
onkeyup="value=value.replace(/[^\d^\.]+/g,'').replace('.','$#$').replace(/\./g,'').replace('$#$','.')"
></el-input>
</el-form-item>
<el-form-item label="队伍简介" style="width: 100%;">
<el-input
:readonly="!readonly"
type="textarea"
@ -136,7 +121,7 @@
:data="tableData"
border
header-row-class-name="el-one-header"
style="width: 100%; margin-top: 30px"
style="width: 100%; margin-top: 30px;"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" align="center" width="55">
@ -307,12 +292,6 @@ const ruleForm = reactive<FormRules>({
personnum: [{ required: true, message: "请输入人数", trigger: "change" }],
});
const readonly = ref(false);
const levelList = ref([
{ value: "区级" },
{ value: "镇级" },
{ value: "园区" },
{ value: "企业" },
]);
const tableDataloading = ref(false);
const tableData = ref([]);
@ -444,29 +423,28 @@ onMounted(() => {
</script>
<style lang="scss" scoped>
.content {
width: 100%;
background: #fff;
border-radius: 0.26042vw;
box-shadow: 0 0 0.41667vw 0 rgba(8, 33, 85, 0.1);
height: 100%;
padding: 0.83333vw;
overflow-y: scroll;
overflow-x: hidden !important;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-o-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
width: 100%;
background: #fff;
border-radius: 0.26042vw;
box-shadow: 0 0 0.41667vw 0 rgb(8 33 85 / 10%);
height: 100%;
padding: 0.83333vw;
overflow-y: scroll;
overflow-x: hidden !important;
box-sizing: border-box;
box-sizing: border-box;
box-sizing: border-box;
box-sizing: border-box;
}
.detailForm-content {
margin-right: 30px;
margin-right: 30px;
}
:deep(.el-form) {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
}
:deep(.el-form-item) {
width: 45%;
width: 45%;
}
</style>

View File

@ -56,6 +56,7 @@ function handleLogin() {
path: "/home/index",
});
router.go(0);
})
.catch((res) => {
getCode();