From 4184f1c55d7533eeca0fe0e6a8e6e78678e2855e Mon Sep 17 00:00:00 2001 From: Zy <1448159279@qq.com> Date: Thu, 16 Apr 2026 21:03:35 +0800 Subject: [PATCH] =?UTF-8?q?=E7=89=A9=E4=B8=9A=E4=B9=8B=E5=89=8D=EF=BC=8C?= =?UTF-8?q?=E6=96=B0=E5=B7=A5=E4=BD=9C=E5=8F=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 4 +- src/api/login.ts | 1 - src/api/system/Decoration/type.ts | 6 +- src/api/system/HouseFacilities/index.ts | 63 ++ src/api/system/HouseFacilities/type.ts | 65 ++ src/api/system/community/index.ts | 2 +- src/api/system/community/type.ts | 2 +- src/assets/icons/svg/banshiguanli.svg | 1 + src/assets/icons/svg/baoxiuguanli.svg | 1 + src/assets/icons/svg/cangkuxinxi.svg | 1 + src/assets/icons/svg/chehangguanli.svg | 1 + src/assets/icons/svg/cheliangguanli.svg | 1 + src/assets/icons/svg/cheweiguanli.svg | 1 + src/assets/icons/svg/fangkeguanli.svg | 1 + src/assets/icons/svg/fangwuguanli.svg | 1 + src/assets/icons/svg/gonggaoguanli.svg | 1 + src/assets/icons/svg/huodongguanli.svg | 1 + src/assets/icons/svg/pay.svg | 1 + src/assets/icons/svg/peizhitubiaosvg-.svg | 1 + src/assets/icons/svg/quyuguanli.svg | 1 + src/assets/icons/svg/tousuguanli.svg | 1 + src/assets/icons/svg/wenjuantiaocha.svg | 1 + src/assets/icons/svg/zhuangxiu.svg | 1 + src/assets/images/index/summer.png | Bin 0 -> 27760 bytes src/assets/styles/element-ui.scss | 2 - src/components/Holder/index.vue | 3 +- src/components/Holder/repairUser.vue | 1 - src/layout/components/Navbar.vue | 7 +- src/layout/components/Sidebar/Logo.vue | 12 +- src/layout/components/Sidebar/index.vue | 3 +- src/permission.ts | 15 +- src/router/index.ts | 4 +- src/store/modules/house.ts | 139 +++- src/store/modules/user.ts | 9 +- src/views/community/index.vue | 55 +- src/views/login.vue | 11 +- src/views/system/Activity/addActivity.vue | 2 + src/views/system/Activity/index.vue | 3 +- src/views/system/Complaint/complainMain.vue | 4 +- src/views/system/Complaint/index.vue | 10 +- .../system/ComplaintType/addComplaintType.vue | 2 +- src/views/system/ComplaintType/index.vue | 1 + src/views/system/Decoration/addDecoration.vue | 5 +- src/views/system/Decoration/index.vue | 31 +- src/views/system/HandleLog/addHandleLog.vue | 2 +- src/views/system/HandleLog/index.vue | 1 + .../HouseFacilities/addHouseFacilities.vue | 129 ++++ src/views/system/HouseFacilities/index.vue | 226 ++++++ src/views/system/MonthCard/addMonthCard.vue | 4 +- src/views/system/MonthCard/index.vue | 1 + src/views/system/NoticePc/addNoticePc.vue | 11 +- src/views/system/NoticePc/index.vue | 8 +- .../system/ParkingCost/addParkingCost.vue | 37 +- src/views/system/ParkingCost/index.vue | 24 +- .../system/Questionnaire/addQuestionnaire.vue | 12 +- .../components/QuestionnaireEdit.vue | 1 - src/views/system/Questionnaire/index.vue | 2 +- src/views/system/Repair/addRepair.vue | 6 +- src/views/system/Repair/addRepairlist.vue | 16 +- src/views/system/Repair/index.vue | 36 +- src/views/system/Repair/repairMain.vue | 9 +- src/views/system/Repair/repairlist.vue | 68 +- src/views/system/Visitor/index.vue | 1 + src/views/system/Visitor/visitorMain.vue | 149 +++- src/views/system/carArea/addCarArea.vue | 3 +- src/views/system/carArea/index.vue | 1 + src/views/system/cars/addCars.vue | 15 +- src/views/system/cars/index.vue | 5 +- src/views/system/house/AddBuilding.vue | 16 +- src/views/system/house/AddHouse.vue | 7 +- .../system/house/components/building.vue | 9 +- .../house/components/components/table.vue | 3 - src/views/system/house/components/unit.vue | 11 +- src/views/system/house/index.vue | 16 +- .../system/houseRental/addhouseResident.vue | 49 +- src/views/system/houseRental/houseMain.vue | 1 - src/views/system/houseRental/index.vue | 7 +- src/views/system/parking/addParking.vue | 4 +- src/views/system/parking/index.vue | 15 +- src/views/system/parking/template.vue | 2 - src/views/system/resident/ResidentMain.vue | 2 - src/views/system/resident/addResident.vue | 90 ++- src/views/system/resident/index.vue | 35 +- src/views/system/storeroom/addStoreRoom.vue | 24 +- src/views/system/storeroom/index.vue | 93 +-- src/views/system/test/QuestionnaireEdit.vue | 1 - .../workbench/components/repairEcharts.vue | 40 +- src/views/workbench/index.vue | 25 +- src/views/workbench/index2.vue | 670 ++++++++++++++++++ vite.config.ts | 2 +- vite/plugins/index.ts | 2 +- 91 files changed, 1781 insertions(+), 588 deletions(-) create mode 100644 src/api/system/HouseFacilities/index.ts create mode 100644 src/api/system/HouseFacilities/type.ts create mode 100644 src/assets/icons/svg/banshiguanli.svg create mode 100644 src/assets/icons/svg/baoxiuguanli.svg create mode 100644 src/assets/icons/svg/cangkuxinxi.svg create mode 100644 src/assets/icons/svg/chehangguanli.svg create mode 100644 src/assets/icons/svg/cheliangguanli.svg create mode 100644 src/assets/icons/svg/cheweiguanli.svg create mode 100644 src/assets/icons/svg/fangkeguanli.svg create mode 100644 src/assets/icons/svg/fangwuguanli.svg create mode 100644 src/assets/icons/svg/gonggaoguanli.svg create mode 100644 src/assets/icons/svg/huodongguanli.svg create mode 100644 src/assets/icons/svg/pay.svg create mode 100644 src/assets/icons/svg/peizhitubiaosvg-.svg create mode 100644 src/assets/icons/svg/quyuguanli.svg create mode 100644 src/assets/icons/svg/tousuguanli.svg create mode 100644 src/assets/icons/svg/wenjuantiaocha.svg create mode 100644 src/assets/icons/svg/zhuangxiu.svg create mode 100644 src/assets/images/index/summer.png create mode 100644 src/views/system/HouseFacilities/addHouseFacilities.vue create mode 100644 src/views/system/HouseFacilities/index.vue create mode 100644 src/views/workbench/index2.vue diff --git a/.env.development b/.env.development index 051bbe9..bfebc85 100644 --- a/.env.development +++ b/.env.development @@ -13,10 +13,10 @@ VITE_APP_BASE_API = '/dev-api' VITE_APP_CONTEXT_PATH = '/' # 监控地址 -VITE_APP_MONITOR_ADMIN = 'http://192.168.0.222/admin/applications' +VITE_APP_MONITOR_ADMIN = 'http://192.168.1.222/admin/applications' # SnailJob 控制台地址 -VITE_APP_SNAILJOB_ADMIN = 'http://192.168.0.222/snail-job' +VITE_APP_SNAILJOB_ADMIN = 'http://192.168.1.222/snail-job' VITE_APP_PORT = 5173 diff --git a/src/api/login.ts b/src/api/login.ts index 47f5b99..35e6a4e 100644 --- a/src/api/login.ts +++ b/src/api/login.ts @@ -16,7 +16,6 @@ export function login(data: LoginData): AxiosPromise { clientId: data.clientId || clientId, grantType: data.grantType || 'password' }; - console.log(params); return request({ url: '/auth/login', headers: { diff --git a/src/api/system/Decoration/type.ts b/src/api/system/Decoration/type.ts index 82f2a48..68c4d85 100644 --- a/src/api/system/Decoration/type.ts +++ b/src/api/system/Decoration/type.ts @@ -7,7 +7,7 @@ export interface DecorationVO { /** * 所属小区id */ - villageId: string | number; + villageId: number; /** * 所属房屋id @@ -59,7 +59,7 @@ export interface DecorationForm extends BaseEntity { /** * 所属小区id */ - villageId?: string | number; + villageId?: number; /** * 所属房屋id @@ -106,7 +106,7 @@ export interface DecorationQuery extends PageQuery { /** * 所属小区id */ - villageId?: string | number; + villageId?: number; /** * 所属房屋id diff --git a/src/api/system/HouseFacilities/index.ts b/src/api/system/HouseFacilities/index.ts new file mode 100644 index 0000000..6ef149a --- /dev/null +++ b/src/api/system/HouseFacilities/index.ts @@ -0,0 +1,63 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { HouseFacilitiesVO, HouseFacilitiesForm, HouseFacilitiesQuery } from '@/api/system/HouseFacilities/type'; + +/** + * 查询房屋设施管理列表 + * @param query + * @returns {*} + */ + +export const listHouseFacilities = (query?: HouseFacilitiesQuery): AxiosPromise => { + return request({ + url: '/houseFacilities/list', + method: 'get', + params: query + }); +}; + +/** + * 查询房屋设施管理详细 + * @param id + */ +export const getHouseFacilities = (id: string | number): AxiosPromise => { + return request({ + url: '/houseFacilities/' + id, + method: 'get' + }); +}; + +/** + * 新增房屋设施管理 + * @param data + */ +export const addHouseFacilities = (data: HouseFacilitiesForm) => { + return request({ + url: '/houseFacilities', + method: 'post', + data: data + }); +}; + +/** + * 修改房屋设施管理 + * @param data + */ +export const updateHouseFacilities = (data: HouseFacilitiesForm) => { + return request({ + url: '/houseFacilities', + method: 'put', + data: data + }); +}; + +/** + * 删除房屋设施管理 + * @param id + */ +export const delHouseFacilities = (id: string | number | Array) => { + return request({ + url: '/houseFacilities/' + id, + method: 'delete' + }); +}; diff --git a/src/api/system/HouseFacilities/type.ts b/src/api/system/HouseFacilities/type.ts new file mode 100644 index 0000000..a033fb3 --- /dev/null +++ b/src/api/system/HouseFacilities/type.ts @@ -0,0 +1,65 @@ +export interface HouseFacilitiesVO { + /** + * 房屋设施管理表id + */ + id: string | number; + + /** + * 设施名称 + */ + name: string; + + /** + * 状态 0启用 1停用 + */ + status: string; + + /** + * 创建者姓名 + */ + createName: string; +} + +export interface HouseFacilitiesForm extends BaseEntity { + /** + * 房屋设施管理表id + */ + id?: string | number; + + /** + * 设施名称 + */ + name?: string; + + /** + * 状态 0启用 1停用 + */ + status?: string; + + /** + * 创建者姓名 + */ + createName?: string; +} + +export interface HouseFacilitiesQuery extends PageQuery { + /** + * 设施名称 + */ + name?: string; + + /** + * 状态 0启用 1停用 + */ + status?: string; + + /** + * 创建者姓名 + */ + createName?: string; + + /** + * 日期范围参数 + */ + params?: any; +} diff --git a/src/api/system/community/index.ts b/src/api/system/community/index.ts index 0950a35..fc80f78 100644 --- a/src/api/system/community/index.ts +++ b/src/api/system/community/index.ts @@ -10,7 +10,7 @@ export function getCommunitylistAPI(): AxiosPromise { }); } /** 通过小区id获取小区信息 */ -export function getVillageByIdAPI(id: string): AxiosPromise { +export function getVillageByIdAPI(id: number): AxiosPromise { return request({ url: `/village/${id}`, method: 'get' diff --git a/src/api/system/community/type.ts b/src/api/system/community/type.ts index 4dd09fe..212c583 100644 --- a/src/api/system/community/type.ts +++ b/src/api/system/community/type.ts @@ -1,5 +1,5 @@ export interface communitylist_rows_type { - villageId?: number; + villageId: number; villageName: string; villageCode: string; address: string; diff --git a/src/assets/icons/svg/banshiguanli.svg b/src/assets/icons/svg/banshiguanli.svg new file mode 100644 index 0000000..5d0208a --- /dev/null +++ b/src/assets/icons/svg/banshiguanli.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/baoxiuguanli.svg b/src/assets/icons/svg/baoxiuguanli.svg new file mode 100644 index 0000000..022f3bc --- /dev/null +++ b/src/assets/icons/svg/baoxiuguanli.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/cangkuxinxi.svg b/src/assets/icons/svg/cangkuxinxi.svg new file mode 100644 index 0000000..ed43013 --- /dev/null +++ b/src/assets/icons/svg/cangkuxinxi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/chehangguanli.svg b/src/assets/icons/svg/chehangguanli.svg new file mode 100644 index 0000000..fa9b5b1 --- /dev/null +++ b/src/assets/icons/svg/chehangguanli.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/cheliangguanli.svg b/src/assets/icons/svg/cheliangguanli.svg new file mode 100644 index 0000000..f82641c --- /dev/null +++ b/src/assets/icons/svg/cheliangguanli.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/cheweiguanli.svg b/src/assets/icons/svg/cheweiguanli.svg new file mode 100644 index 0000000..22680b4 --- /dev/null +++ b/src/assets/icons/svg/cheweiguanli.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/fangkeguanli.svg b/src/assets/icons/svg/fangkeguanli.svg new file mode 100644 index 0000000..fc24908 --- /dev/null +++ b/src/assets/icons/svg/fangkeguanli.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/fangwuguanli.svg b/src/assets/icons/svg/fangwuguanli.svg new file mode 100644 index 0000000..2049daa --- /dev/null +++ b/src/assets/icons/svg/fangwuguanli.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/gonggaoguanli.svg b/src/assets/icons/svg/gonggaoguanli.svg new file mode 100644 index 0000000..b8fd6af --- /dev/null +++ b/src/assets/icons/svg/gonggaoguanli.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/huodongguanli.svg b/src/assets/icons/svg/huodongguanli.svg new file mode 100644 index 0000000..caaa7ea --- /dev/null +++ b/src/assets/icons/svg/huodongguanli.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/pay.svg b/src/assets/icons/svg/pay.svg new file mode 100644 index 0000000..8932295 --- /dev/null +++ b/src/assets/icons/svg/pay.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/peizhitubiaosvg-.svg b/src/assets/icons/svg/peizhitubiaosvg-.svg new file mode 100644 index 0000000..8e7bbef --- /dev/null +++ b/src/assets/icons/svg/peizhitubiaosvg-.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/quyuguanli.svg b/src/assets/icons/svg/quyuguanli.svg new file mode 100644 index 0000000..8ce2eee --- /dev/null +++ b/src/assets/icons/svg/quyuguanli.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/tousuguanli.svg b/src/assets/icons/svg/tousuguanli.svg new file mode 100644 index 0000000..3a10672 --- /dev/null +++ b/src/assets/icons/svg/tousuguanli.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/wenjuantiaocha.svg b/src/assets/icons/svg/wenjuantiaocha.svg new file mode 100644 index 0000000..251507d --- /dev/null +++ b/src/assets/icons/svg/wenjuantiaocha.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/zhuangxiu.svg b/src/assets/icons/svg/zhuangxiu.svg new file mode 100644 index 0000000..20fe029 --- /dev/null +++ b/src/assets/icons/svg/zhuangxiu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/images/index/summer.png b/src/assets/images/index/summer.png new file mode 100644 index 0000000000000000000000000000000000000000..57fdb59b471e66042a28d661f58c635f6ebad863 GIT binary patch literal 27760 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
aaH8#Wj3g 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 props.isMultiple ?? false); -const returnvalue = computed(() => props.returnvalue ?? 'userId'); // 👈 默认 userId +const returnvalue = computed(() => props.returnvalue ?? 'id'); // 👈 默认 userId const { userid } = toRefs(props); @@ -267,6 +267,7 @@ function confirm() { // ✅ 返回整个对象 emit('change', multipleSelection.value[0]); } else { + console.log(multipleSelection.value[0], returnvalue.value); // 返回指定字段 emit('change', multipleSelection.value[0][returnvalue.value as keyof tableType]); } diff --git a/src/components/Holder/repairUser.vue b/src/components/Holder/repairUser.vue index d20f321..8d63900 100644 --- a/src/components/Holder/repairUser.vue +++ b/src/components/Holder/repairUser.vue @@ -120,7 +120,6 @@ const handleRowClick = (row: tableType) => { // 统一回显 userid 选中(安全版) const handleUserSelection = () => { if (!userid.value || !tableData.value.length) return; - console.log('user', userid, tableData.value); const target = tableData.value.find((item) => item.userId == userid.value); if (target) { diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue index b17ffdd..b4a71c2 100644 --- a/src/layout/components/Navbar.vue +++ b/src/layout/components/Navbar.vue @@ -145,9 +145,12 @@ watch( height: 50px; overflow: hidden; position: relative; - background: #1a75ff; + // background: #1a75ff; + background: #dfedff; + // border-bottom: 1px solid #1a75ff; + border-bottom: 1px solid #dfedff; + color: #fff; - border-bottom: 1px solid #1a75ff; box-shadow: none; display: flex; align-items: center; diff --git a/src/layout/components/Sidebar/Logo.vue b/src/layout/components/Sidebar/Logo.vue index 8c9ab8b..50692ef 100644 --- a/src/layout/components/Sidebar/Logo.vue +++ b/src/layout/components/Sidebar/Logo.vue @@ -71,7 +71,9 @@ const getLogoTextColor = computed(() => { position: relative; height: 50px; line-height: 50px; - background-color: #1a75ff; + // background-color: #1a75ff; + background: #dfedff; + text-align: center; overflow: hidden; box-shadow: none; @@ -91,8 +93,7 @@ const getLogoTextColor = computed(() => { & .sidebar-title { display: inline-block; margin: 0; - // color: v-bind(getLogoTextColor); - color: white; + font-weight: 600; line-height: 50px; font-size: 14px; @@ -103,6 +104,11 @@ const getLogoTextColor = computed(() => { Helvetica, sans-serif; vertical-align: middle; + + // color: v-bind(getLogoTextColor); + // color: white; + color: #000000; + font-size: 16px; } } diff --git a/src/layout/components/Sidebar/index.vue b/src/layout/components/Sidebar/index.vue index db8fb86..5b5f314 100644 --- a/src/layout/components/Sidebar/index.vue +++ b/src/layout/components/Sidebar/index.vue @@ -50,6 +50,7 @@ const activeMenu = computed(() => { } return path; }); -const bgColor = computed(() => (sideTheme.value === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground)); +const bgColor = '#eaf2ff'; +// const bgColor = computed(() => (sideTheme.value === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground)); const textColor = computed(() => (sideTheme.value === 'theme-dark' ? variables.menuColor : variables.menuLightColor)); diff --git a/src/permission.ts b/src/permission.ts index 88291e2..7b52211 100644 --- a/src/permission.ts +++ b/src/permission.ts @@ -31,8 +31,7 @@ router.beforeEach(async (to, from, next) => { if (useUserStore().roles.length === 0) { isRelogin.show = true; // 判断当前用户是否已拉取完user_info信息 - const [data, err] = await tos(useUserStore().getInfo()); - console.log(data); + const [err, res] = await tos(useUserStore().getInfo()); if (err) { await useUserStore().logout(); ElMessage.error(err); @@ -46,8 +45,13 @@ router.beforeEach(async (to, from, next) => { router.addRoute(route); // 动态添加可访问路由表 } }); - // @ts-expect-error hack方法 确保addRoutes已完成 - next({ path: to.path, replace: true, params: to.params, query: to.query, hash: to.hash, name: to.name as string }); // hack方法 确保addRoutes已完成 + if (res.user.userId === 1 && from.path === '/login') { + // 管理员 → 强制跳转到社区列表 + next('/community/communitylist'); + } else { + // 普通用户 → 正常跳转目标页 + next(to.fullPath); + } } } else { next(); @@ -59,8 +63,7 @@ router.beforeEach(async (to, from, next) => { // 在免登录白名单,直接进入 next(); } else { - const redirect = encodeURIComponent(to.fullPath || '/'); - next(`/login?redirect=${redirect}`); // 否则全部重定向到登录页 + next(`/login`); // 否则全部重定向到登录页 NProgress.done(); } } diff --git a/src/router/index.ts b/src/router/index.ts index 5da7919..0f20a81 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -93,9 +93,9 @@ export const constantRoutes: RouteRecordRaw[] = [ children: [ { path: '/index', - component: () => import('@/views/workbench/index.vue'), + component: () => import('@/views/workbench/index2.vue'), name: 'Index', - meta: { title: '首页', icon: 'dashboard', affix: true } + meta: { title: '工作台', icon: 'dashboard', affix: true } } ] }, diff --git a/src/store/modules/house.ts b/src/store/modules/house.ts index 8bec6dd..772feb8 100644 --- a/src/store/modules/house.ts +++ b/src/store/modules/house.ts @@ -1,4 +1,4 @@ -import { getCommunitylistAPI } from '@/api/system/community'; +import { getCommunitylistAPI, getVillageByIdAPI } from '@/api/system/community'; import { communitylist_rows_type } from '@/api/system/community/type'; import { deleteHouseApi, getBuildinglistAPI, getHouselistAPI, getVillageTree } from '@/api/system/house'; import type { addBuildingType, BuildingUnit, BuildingVo } from '@/api/system/house/type'; @@ -51,38 +51,55 @@ export const useHouseStore = defineStore( // 当前楼栋 所有楼层数据 const currentFloorInfoList = computed(() => { - return (Array.from(floorslist.value) as string[]).sort(sortNumberStr); + return [...floorslist.value].sort(sortNumberStr); }); // 楼层列表 set const floorslist = ref>(new Set()); + // + // 查找当前小区 + const getviliageinfo = async (id) => { + const res = await getVillageByIdAPI(id); + currentVilageInfo.value = res.data; + }; + + // 更新小区信息 + const updateVilageinfo = (data) => { + currentVilageInfo.value = data; + }; + // 初始化 - const initHouse = async (buildingtype: number) => { - // 查找当前小区 - const res = await getCommunitylistAPI(); - const currentVilage = res.rows.find((item) => item.choiceStatus === 0); - currentVilageInfo.value = currentVilage; + const initHouse = async (currentbuildingtype: number) => { + currentBuildingInfoList.value = []; // 获取当前小区 所有楼栋信息 - const res2 = await getBuildinglistAPI(currentVilage.villageId, buildingtype); + const res2 = await getBuildinglistAPI(currentVilageInfo.value.villageId, currentbuildingtype); currentBuildingInfoList.value = res2.data; + // 获取当前小区 第一个楼栋信息 - if (currentBuildingInfo.value.id === null) { + // ! 不同住宅类型 + if ((currentBuildingInfo.value && currentBuildingInfo.value.id === null) || buildingtype.value !== currentbuildingtype) { currentBuildingInfo.value = res2.data[0]; - } else { + // ! 相同住宅类型 + } else if (buildingtype.value === currentbuildingtype) { // 更新当前楼栋的 信息 currentBuildingInfo.value = res2.data.find((item) => item.id === currentBuildingInfo.value.id); } - // 获取当前 第一个楼栋的所有信息 - const res3 = await getHouselistAPI(currentBuildingInfo.value.id); - currentHouseInfoList.value = res3.data; - floorslist.value = new Set(); - // 得到所有的有房屋的 楼层 数组 - currentHouseInfoList.value.units.forEach((item) => { - item.floors.forEach((floor) => { - floorslist.value.add(floor.floorNo); + if (currentBuildingInfo.value && currentBuildingInfo.value.id) { + // 获取当前 第一个楼栋的所有信息 + const res3 = await getHouselistAPI(currentBuildingInfo.value.id); + currentHouseInfoList.value = res3.data; + floorslist.value = new Set(); + // 得到所有的有房屋的 楼层 数组 + currentHouseInfoList.value.units.forEach((item) => { + item.floors.forEach((floor) => { + floorslist.value.add(floor.floorNo); + }); }); - }); + if (buildingtype.value !== currentbuildingtype) { + buildingtype.value = currentbuildingtype; + } + } }; // 选中的房屋 @@ -93,18 +110,59 @@ export const useHouseStore = defineStore( }; // 切换住宅类型 - const switchHouseType = (housetype: number) => { - getBuildinglistAPI(currentVilageInfo.value.villageId, housetype) - .then(() => { - buildingtype.value = housetype; - initHouse(housetype); - ElMessage.success('切换成功'); - }) - .catch(() => ElMessage.error('切换失败')); + const switchHouseType = async (housetype: number) => { + // 清空 + currentBuildingInfoList.value = []; + // 获取当前小区 所有楼栋信息 + const res2 = await getBuildinglistAPI(currentVilageInfo.value.villageId, housetype); + currentBuildingInfoList.value = res2.data; + // 获取当前小区 第一个楼栋信息 + if ((currentBuildingInfo.value && currentBuildingInfo.value.id === null) || buildingtype.value !== housetype) { + if (res2.data.length > 0) { + currentBuildingInfo.value = res2.data[0]; + } else { + currentBuildingInfo.value = { + 'id': null, + 'villageId': null, + 'villageName': '', + 'buildingName': '', + 'buildingUse': null, + 'buildToward': '', + 'buildTall': '', + 'buildStructure': '', + 'unitCount': null, + 'floorCount': null, + 'remark': '' + }; + } + } + if (currentBuildingInfo.value.id !== null) { + switchBuilding(currentBuildingInfo.value.id); + } else { + floorslist.value = new Set(); + } + buildingtype.value = housetype; + console.log(housetype); + ElMessage.success('切换成功'); }; + // 更新当前楼栋信息 + const updateCureentBuilding = async () => { + currentHouseInfoList.value = null; + // 获取当前 楼栋的所有信息 + const res3 = await getHouselistAPI(currentBuildingInfo.value.id); + currentHouseInfoList.value = res3.data; + floorslist.value = new Set(); + // 得到所有的有房屋的 楼层 数组 + currentHouseInfoList.value.units.forEach((item) => { + item.floors.forEach((floor) => { + floorslist.value.add(floor.floorNo); + }); + }); + }; // 切换楼栋 const switchBuilding = (buildingId: string) => { + if (!buildingId) return; // 切换之前 清空当前楼栋信息 currentBuildingInfo.value = { 'id': null, @@ -122,12 +180,11 @@ export const useHouseStore = defineStore( currentHouseInfoList.value = null; getHouselistAPI(buildingId).then((res) => { currentHouseInfoList.value = res.data; - console.log(currentHouseInfoList.value); // 获取当前楼栋信息并 赋值 currentBuildingInfo.value = currentBuildingInfoList.value.find((item) => item.id === buildingId); // 清空 楼层信息 - floorslist.value = new Set(); + floorslist.value.clear(); // 重新获取楼层信息 currentHouseInfoList.value.units.forEach((item) => { item.floors.forEach((floor) => { @@ -144,7 +201,6 @@ export const useHouseStore = defineStore( }; // 删除指定楼栋 const deleteBuildingFun = (buildingId: string) => { - console.log('删除楼栋'); // 手动 从 楼栋列表中删除 指定楼栋 currentBuildingInfoList.value = currentBuildingInfoList.value.filter((item) => item.id !== buildingId); // 判断指定楼栋是 当前楼栋 @@ -159,12 +215,20 @@ export const useHouseStore = defineStore( // 房屋 树状结构类型 const getCurrentVilageTreeHouse = async () => { - const res = await getCommunitylistAPI(); - const currentVilage = res.rows.find((item) => item.choiceStatus === 0); - currentVilageInfo.value = currentVilage; - getVillageTree(currentVilageInfo.value.villageId).then((res) => { - treedata.value = convertBuildingToTree(res.data.buildings); - }); + if (!currentVilageInfo.value?.villageId) { + treedata.value = []; + return treedata.value; + } + try { + treedata.value = []; + const res = await getVillageTree(currentVilageInfo.value.villageId); + treedata.value = convertBuildingToTree(res.data.buildings || []); + return treedata.value; + } catch (err) { + console.error('获取楼栋树失败:', err); + treedata.value = []; + return treedata.value; + } }; return { currentVilageInfo, @@ -176,6 +240,9 @@ export const useHouseStore = defineStore( buildingtype, buildingtypelist, treedata, + updateVilageinfo, + updateCureentBuilding, + getviliageinfo, checkoutHousesFun, initHouse, switchHouseType, diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts index a188082..c53fd3d 100644 --- a/src/store/modules/user.ts +++ b/src/store/modules/user.ts @@ -6,6 +6,7 @@ import defAva from '@/assets/images/profile.jpg'; import { defineStore } from 'pinia'; import { ref } from 'vue'; import { useHouseStore } from './house'; +import { UserInfo } from '@/api/system/user/types'; export const useUserStore = defineStore('user', () => { const token = ref(getToken()); @@ -34,15 +35,15 @@ export const useUserStore = defineStore('user', () => { }; // 获取用户信息 - const getInfo = async (): Promise => { + const getInfo = async (): Promise => { const [err, res] = await to(getUserInfo()); if (res) { const data = res.data; const user = data.user; const profile = user.avatar == '' || user.avatar == null ? defAva : user.avatar; - // useHouseStore().getCurrentVilageTreeHouse(); - console.log(data); - sessionStorage.setItem('villageid', data.user.villageId); + if (data.user.userId !== 1) { + localStorage.setItem('villageid', data.user.villageId); + } if (data.roles && data.roles.length > 0) { // 验证返回的roles是否是一个非空数组 roles.value = data.roles; diff --git a/src/views/community/index.vue b/src/views/community/index.vue index 162169d..9b5ef67 100644 --- a/src/views/community/index.vue +++ b/src/views/community/index.vue @@ -13,14 +13,7 @@
-
+
- +
访问房屋:
-
北境碧桂园小区A栋2单元402
+
{{ form.houseName }}
访客姓名:
-
李淑一
+
{{ form.visitorName }}
访客性别:
-
+
+ +
手机号码:
-
15020360831
+
{{ form.visitorPhone }}
访问日期:
-
2024/05/08
+
{{ form.startTime }} - {{ form.endTime }}
访问时长:
-
3h
+
{{ formatTimeDiff(form.startTime, form.endTime) }}
访问业主:
@@ -44,14 +46,18 @@
提交时间:
-
2024/09/15 22:48
+
{{ form.startTime }}
- -
+ +
通行证
+
+ + +
@@ -78,30 +84,55 @@ diff --git a/src/views/system/house/components/components/table.vue b/src/views/system/house/components/components/table.vue index 6a0aebc..30aae6b 100644 --- a/src/views/system/house/components/components/table.vue +++ b/src/views/system/house/components/components/table.vue @@ -44,7 +44,6 @@ function handleChangeCheckhouses(val: string[]) { function contextMenuFun(val: { type: string; value: string }) { switch (val.type) { case 'edit': - console.log('你选择了:', val); router.push({ path: '/house/addHouse', query: { @@ -56,7 +55,6 @@ function contextMenuFun(val: { type: string; value: string }) { console.log('你选择了:', val); break; case 'main': - console.log('你选择了:', val); router.push({ path: '/house/HouseDetails', query: { @@ -65,7 +63,6 @@ function contextMenuFun(val: { type: string; value: string }) { }); break; case 'delete': - console.log('你选择了:', val); deleteHouseApi(val.value).then(() => { ElMessage.success('删除成功'); houseStore.switchBuilding(houseStore.currentBuildingInfo.id); diff --git a/src/views/system/house/components/unit.vue b/src/views/system/house/components/unit.vue index 2a357e2..cb1b7f7 100644 --- a/src/views/system/house/components/unit.vue +++ b/src/views/system/house/components/unit.vue @@ -3,15 +3,15 @@
- {{ houseStore.currentBuildingInfo.buildingName }} + {{ houseStore.currentBuildingInfo?.buildingName }} - 楼栋朝向:{{ houseStore.currentBuildingInfo.buildToward }} - 楼高:{{ houseStore.currentBuildingInfo.buildTall }}(m) - 楼栋结构:{{ houseStore.currentBuildingInfo.buildStructure }} + 楼栋朝向:{{ houseStore.currentBuildingInfo?.buildToward }} + 楼高:{{ houseStore.currentBuildingInfo?.buildTall ? `${houseStore.currentBuildingInfo?.buildTall}(m)` : '' }} + 楼栋结构:{{ houseStore.currentBuildingInfo?.buildStructure }}
+增加房屋 - 收费标准设置 + 删除
@@ -35,7 +35,6 @@ function handleAddHouse() { function deleteAllhouse() { const checkhouse = houseStore.checkoutHouses; - console.log(checkhouse); if (checkhouse.length > 0) { let deletecount = 0; checkhouse.forEach((item) => { diff --git a/src/views/system/house/index.vue b/src/views/system/house/index.vue index a051f29..7fb1d74 100644 --- a/src/views/system/house/index.vue +++ b/src/views/system/house/index.vue @@ -10,13 +10,13 @@
- {{ house }} + {{ house.label }}
@@ -32,9 +32,13 @@ import building from './components/building.vue'; import unit from './components/unit.vue'; import PageHeader from '@/components/Pageheader/index.vue'; import { useHouseStore } from '@/store/modules/house'; + const houseStore = useHouseStore(); -const { currentVilageInfo } = storeToRefs(houseStore); -const housetypelist = ['住宅', '办公', '商用', '公寓']; +const { buildingtype, currentVilageInfo } = storeToRefs(houseStore); + +const { proxy } = getCurrentInstance() as ComponentInternalInstance; +const { com_build_use } = toRefs(proxy?.useDict('com_build_use')); + houseStore.initHouse(houseStore.buildingtype); // 初始化数据 diff --git a/src/views/system/houseRental/addhouseResident.vue b/src/views/system/houseRental/addhouseResident.vue index 9b6cea5..018729b 100644 --- a/src/views/system/houseRental/addhouseResident.vue +++ b/src/views/system/houseRental/addhouseResident.vue @@ -31,7 +31,7 @@ - + @@ -48,7 +48,7 @@ - {{ item.label }} + {{ item.label }} @@ -96,16 +96,16 @@
- {{ item.label }} + {{ item.name }}
@@ -184,13 +184,16 @@ import { getHousePathById, hasFormData, splitStringUrl } from '@/utils/house'; import { addHouseRental, getHouseRental, updateHouseRental, uploadHouseImage } from '@/api/system/houseRental'; import { validator } from '@/utils/Reg'; import { useHouseStore } from '@/store/modules/house'; +import { listHouseFacilities } from '@/api/system/HouseFacilities'; const houseStore = useHouseStore(); -const { treedata } = storeToRefs(houseStore); + const uploadUrl = import.meta.env.VITE_APP_BASE_API + '/houseRental/uploadImages'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { com_rental_method } = toRefs(proxy?.useDict('com_rental_method')); + const { com_house_rental_facilities } = toRefs(proxy?.useDict('com_house_rental_facilities') || {}); + const { com_rental_status } = toRefs(proxy?.useDict('com_rental_status')); const { com_house_use } = toRefs(proxy?.useDict('com_house_use')); @@ -205,7 +208,7 @@ const form = ref({ rentalName: '', // 租户姓名 rent: null, // 租金 houseFace: '', // 房屋朝向 - rentalType: 0, // 整租合租 + rentalType: '0', // 整租合租 phone: null, //手机号 houseArea: null, // 房屋面积 floorNo: null, //楼层号 @@ -214,7 +217,7 @@ const form = ref({ houseImageUrl: '', //房屋图片 supInfo: '', //补充租房信息 vx: '', //微信 - houseUse: 0, //房屋用途 + houseUse: '0', //房屋用途 rentalStatus: 0, //租赁状态 email: '' //邮箱 }); @@ -233,12 +236,17 @@ const rules = ref({ }); // ! 编辑租赁-================================================================================= const userid = ref(null); +const treedata = ref(null); +const housefacilities = ref([]); // !== 楼栋房屋 ============================================================================= -function gettreedata() { +async function gettreedata() { + const reslist = await listHouseFacilities(); + housefacilities.value = reslist.rows; + + treedata.value = await houseStore.getCurrentVilageTreeHouse(); if (route.query.id) { userid.value = route.query.id; getHouseRental(userid.value).then((res) => { - console.log(res); form.value = { ...form.value, ...res.data @@ -273,7 +281,6 @@ const handlePictureCardPreview: UploadProps['onPreview'] = (uploadFile) => { dialogVisible.value = true; }; const handleRemove: UploadProps['onRemove'] = (uploadFile, uploadFiles) => { - console.log(uploadFile, uploadFiles); fileList.value = uploadFiles; }; @@ -281,13 +288,6 @@ const handleRemove: UploadProps['onRemove'] = (uploadFile, uploadFiles) => { // 家电 const housedeviceslist = ref([]); -watch( - () => com_house_rental_facilities.value, - (newVal) => { - housedeviceslist.value = (newVal || []).map((item) => item.value); - }, - { deep: true, immediate: true } -); function handleClick(index: number) { if (housedeviceslist.value.includes(index)) { housedeviceslist.value = housedeviceslist.value.filter((item) => item !== index); @@ -302,6 +302,7 @@ function handleClick(index: number) { const submitForm = () => { formRef.value?.validate(async (valid: boolean) => { if (valid) { + // 处理家电 form.value.facilities = housedeviceslist.value.join(','); let str = ''; // 判断有无图片 @@ -315,7 +316,6 @@ const submitForm = () => { str += item.url + ','; } }); - console.log(formdata); if (!hasFormData(formdata)) return sendForm(str); uploadHouseImage(formdata) .then((res) => { @@ -354,15 +354,18 @@ const submitForm = () => { }; const sendForm = (val: string) => { form.value.houseImageUrl = val; + form.value.villageId = Number(localStorage.getItem('villageid')); // edit or add if (userid.value) { - console.log('edit'); updateHouseRental(form.value).then(() => { ElMessage.success('编辑成功'); cancelForm(); }); } else { - addHouseRental(form.value).then((res) => { + addHouseRental({ + ...form.value, + villageid: Number(localStorage.getItem('villageid')) + }).then(() => { ElMessage.success('添加成功'); cancelForm(); }); diff --git a/src/views/system/houseRental/houseMain.vue b/src/views/system/houseRental/houseMain.vue index 04cac2a..8eb354f 100644 --- a/src/views/system/houseRental/houseMain.vue +++ b/src/views/system/houseRental/houseMain.vue @@ -125,7 +125,6 @@ function init() { houseRentalid.value = route.query.id; } getHouseRental(houseRentalid.value).then((res) => { - console.log(res); HouseInfo.value = res.data; HouseInfo.value.houseImageUrls = HouseInfo.value.houseImageUrl.split(',').filter((item) => item); const arr = getHousePathById(treedata.value, HouseInfo.value.houseId, 'label'); diff --git a/src/views/system/houseRental/index.vue b/src/views/system/houseRental/index.vue index 84c02dd..3ea0742 100644 --- a/src/views/system/houseRental/index.vue +++ b/src/views/system/houseRental/index.vue @@ -62,8 +62,7 @@ @@ -130,8 +129,8 @@ const data = reactive>({ queryParams: { pageNum: 1, pageSize: 10, - - houseUse: undefined, + villageId: Number(localStorage.getItem('villageid')), + houseUse: '', rentalName: undefined, rent: undefined, rentalType: undefined, diff --git a/src/views/system/parking/addParking.vue b/src/views/system/parking/addParking.vue index 58b0eb5..818e5e9 100644 --- a/src/views/system/parking/addParking.vue +++ b/src/views/system/parking/addParking.vue @@ -100,6 +100,7 @@ const form = ref({ residentId: null, // 住户id parkingStatus: '', // 车位状态 remark: '', // 备注 + villageId: Number(localStorage.getItem('villageid')), parkingCode: '' // 车位编码 }); const rules = ref({ @@ -132,8 +133,6 @@ getAreaList(); const holderInfo = ref(null); function handleChange(pop) { - console.log('获得数据'); - console.log(pop); holderInfo.value = pop; } @@ -143,6 +142,7 @@ const submitForm = () => { formRef.value?.validate(async (valid: boolean) => { if (valid) { form.value.residentId = holderInfo.value; + form.value.villageId = Number(localStorage.getItem('villageid')); if (userid.value) { updateParking(form.value).then((res) => { ElMessage.success('编辑成功'); diff --git a/src/views/system/parking/index.vue b/src/views/system/parking/index.vue index 04992af..965b82f 100644 --- a/src/views/system/parking/index.vue +++ b/src/views/system/parking/index.vue @@ -7,10 +7,9 @@ - + - @@ -50,9 +49,7 @@ - - - + @@ -91,7 +88,6 @@